前言
-
物联网vs互联网?
数据量/数据源:物联网的数据多是设备的自动采集,其数量远远超过互联网,互联网的数据更多是人工生成的 -
MQTT 协议(Message Queuing Telemetry Transport)vs AMQP 协议(Advanced Message Queuing Protocol)是两种在
物联网
中广泛使用的协议。
物联网应用的独特:
(1) 大量设备和中心系统的通信
(2)设备所处的环境资源有限,例如深山老林中低功耗或者不稳定的网络
- 消息中间件与调试工具
MQTT: mosquitto;调试工具:MQTTfx(mqtt3.1之后要收费)、Mqtt x(免费,来自EMQX)
AMQP:rabbitmq
注意区分消息传输协议与消息中间件
一、MQTT
协议
-
场景: 资源受限的设备和低带宽、高延迟或不可靠的网络环境,IOT场景
-
发布/订阅模式:客户端订阅(subcribe)主题(topic),获得发布的消息,消息内容:【topic】+payload
-
适合轻量级(报文小)
-
客户端可以是publisher或subscriber
-
Qos( 质量服务等级) 可以保证消息传输的可靠性
0:最多发一次。以发送端发完结束
1:最少发一次。以发送段收到接收端的PUBACK确认接收消息后结束。接收端断可能收到重复信息
2:保证收一次。发送段和接收端将要进行两次确认。消息不回丢失或重复。
所以,可见qos=2是最安全的,但是速度和安全不可兼得 -
安全: 支持TLS加密 ,用户名和密码的身份验证
- 持久化:broker默认不能持久化,但是可以设置publish的‘retain’标志,这样broker就能实现消息存储
二、MQTT消息中间件
也就是上图的MQTT Broker的软件系统实现
所有消息中间件其实都是相当于建立了一个MQTT Broker或AMQP Broker
1. EMQX
开源
2. mosquitto
(1)安装
windows(不推荐)
下载地址:https://mosquitto.org/download/
安装:mosquitto
修改配置文件:
// 侦听7788端口
listener 7788
// 不允许匿名用户登录
allow_anonymous false
// 指定配置的用户文件(也就是用户名和密码)的路径(绝对)
password_file D:\Program Files\mosquitto\pwfile.example
创建用户名和密码,admin admin
创建完成后:
进入服务,打开mosquitto服务
Linux
centos7
mqtt 3.1.1
yum install mosquitto
# 安装后自动注册为系统服务,可通过systemctl操作
systemctl start mosquitto
systemctl status mosquitto
好像yum最新只能安装到1.6版本的了。
启动后mosquitto -v
给出的版本号是 1.6.1
注意,1.6.1是mosquitto的版本,3.1.1是mqtt的版本号。
默认端口 1883
默认用户名和密码: 没有
使用mqttfx,直接就是ip:端口匿名连接
安装2.0以上版本
因为不想要额外自己安装鉴权插件-
- 源码下载(2.0.18)
https://mosquitto.org/download/
(2) 配置文件启动
除了systemctl 启动外,还可以用mosquitto -v
的方式启动,不过,必须要指定配置文件
因为启动没有带配置文件,则采用的都是默认配置,默认1883,默认允许匿名
(3)创建新用户
vim /etc/mosquitto/mosquitto.conf
-
设置不允许匿名连接
-
配置 存储密码的文件
passwd这个文件中保存用户名和密码。 -
同时通过mosquitto_passwd 创建新用户
[root@ecs-30f1 mosquitto]# mosquitto_passwd -c /etc/mosquitto/passwd ttyMos
Password:
Reenter password:
[root@ecs-30f1 mosquitto]# systemctl restart mosquitto
异常
:无效的密码
增加登录凭证之后,登录报错:
mosquitto -v
的报错: Error: Invalid password hash for user tty, removing entry.
客户端用正确的用户名密码登录,也报错:
not authorized to connect
解决:
其实提示给的很明显了,invalid password hash for user tty ==密码的hash加密无效
还得是官网,
针对1.6.10的版本需要指定用sha512
加密方式-H sha512
mosquitto_passwd -H sha512 -c /etc/mosquitto/passwd.conf admin
(4)用户和权限
需要提前声明的是,主题是用户创建的,但是前提是用户有创建主题的权限。
(5) 测试
在更换用户登录方式后,用非正确的用户名和密码还能连接?
不过前提是在mosquitto -v中进入,systemctl 开启的mosquiito服务报的异常则是not authirized
异常
: 缺少cJSON依赖
执行make命令时
这里是缺少cjson的依赖,尝试用yum安装,但是找不到这个依赖
这里进行手动安装
- 下载源码包:https://github.com/DaveGamble/cJSON
git clone https://github.com/DaveGamble/cJSON.git
- 安装
cd cJSON/
mkdir build
cd build/
cmake ..
make
make install
安装后可发现cJson的静态/动态库生成链接存放在/usr/local/lib64中