MQTT 介绍
MQTT 协议介绍
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,它是一种轻量级的、基于代理的“发布/订阅”模式的消息传输协议。其具有协议简洁、小巧、可扩展性强、省流量、省电等优点,而且已经有 PHP,JAVA,Python,C,C#,Go 等多个语言版本,还有微信小程序版,基本可以使用在任何平台上,几乎可以把所有联网物品和外部连接起来,所以特别适合用来当做物联网的通信协议,实用的场景有遥感数据、汽车、智能家居、智慧城市、医疗医护等等。
MQTT 特点
MQTT 协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:
使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
对负载内容屏蔽的消息传输;
使用 TCP/IP 提供网络连接;
有三种消息发布服务质量:
- “至多一次”(qos = 0),消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
- “至少一次”(qos = 1),确保消息到达,但消息重复可能会发生。
- “只有一次”(qos = 2),确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;
使用 Last Will (遗嘱)和 Testament 特性通知有关各方客户端异常中断的机制;
消息模型
MQTT 是一种基于代理的发布/订阅的消息协议。与请求/回答这种同步模式不同,发布/订阅模式解耦了发布消息的客户(发布者)与订阅消息的客户(订阅者)之间的关系,这意味着发布者和订阅者之间并不需要直接建立联系。一个发布者可以对应多个订阅者,当发布者发生变化的时候,他可以将消息一一通知给所有的订阅者。这种模式提供了更大的网络扩展性和更动态的网络拓扑
主题与通配符
主题名称(Topic name)用来标识已发布消息的信息的渠道。订阅者用它来确定接收到所关心的信息。它是一个分层的结构,用斜线“/”作为分隔符(这个有点类似于restful风格)。主题还可以通过通配符进行过滤。其中,+可以过滤一个层级,而#只能出现在主题最后表示过滤任意级别的层级。值得注意的是MQTT允许使用通配符订阅主题,但是并不允许使用通配符广播。
举个例子:
`building-b/floor-5`:代表B楼5层的设备。
`+/floor-5`:代表任何一个楼的5层的设备。
`building-b/#`:代表B楼所有的设备。
遗嘱
当一个客户端断开连接的时候,它希望客户端可以发送它指定的消息。该消息和普通消息的结构相同。通过设置该位并填入和信息相关的内容即可(后面会有介绍)。
消息类型
消息类型 | 类型 | 编码说明 |
---|---|---|
reserved | 0 | 保留 |
connect | 1 | 客户端到服务端的连接请求 |
connACK | 2 | 服务端对连接请求的响应 |
publish | 3 | 发布消息 |
puback | 4 | 新发布消息确认,是 QoS 1 给 PUBLISH 消息的回复 |
pubRec | 5 | QoS 2 消息流的第一部分,表示消息发布已记录 |
pubRel | 6 | QoS 2 消息流的第二部分,表示消息发布已释放 |
pubComp | 7 | QoS 2 消息流的第三部分,表示消息发布完 |
subscribe | 8 | 客户端订阅某个主题 |
subBack | 9 | 对于 SUBSCRIBE 消息的确认 |
unsubscribe | 10 | 客户端终止订阅的消息 |
unsubBack | 11 | 对于 UNSUBSCRIBE 消息的确认 |
pingReq | 12 | 心跳 |
pingResp | 13 | 确认心跳 |
disconnect | 14 | 客户端终止连接前通知 MQTT 代理 |
reserved | 15 | 保留 |
MQTT 服务端-mosquito
MQTT 服务端还有,Apache Apollo 是一个代理服务器,其是在 ActiveMQ 基础上发展而来的,可以支持多种协议,如: STOMP、AMQP、MQTT、SSL 等。查看原文可看到介绍。
Mosquitto 是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的短消息通信简单易用。
安装
windows 下安装可参考这篇文章:How to Install The Mosquitto MQTT Broker on Windows
主要问题是:缺少 Win32OpenSSL 的 SSLEAY32.dll,LIBEAY32.dll,在其提供的下载链接,也没有找到这两个文件。最后在电脑中其他文件夹(如 QQ 的文件夹)中找到这两个文件,并把这两个文件的文件名改成大写,放在 Mosquitto 的安装目录中,并重新安装解决了问题。
因为下文中需要使用 mosquitto_sub.exe,mosquitto_pub.exe,进行发布接收测试,所以这里需要下载 pthreadVC2.dll
安装完成后,在 windows 服务中找到 mosquitto 并启动 mosquitto 服务,可以将起设置为自动启动。也可以使用命令 sc start mosquitto
启动服务。
测试
订阅主题
mosquitto_sub -v -t topicTest01
-v:打印更多调试信息
-t:指定主题,此处为 topicTest01
发布内容
新打开一个 cmd 窗口
mosquitto_pub -t topicTest01 -m TestMessage
-t:指定主题
-m:指定消息内容
测试结果
发布消息后,在订阅主题的窗口中订阅这收到了主题为 topicTest01 的 TestMessage 消息。
启动
如果不想让 mosquitto 作为 windows 服务启动,可以手动启动。
使用 mosquitto -h
命令查看帮助
PS D:\mosquitto> .\mosquitto -h
mosquitto version 1.4.15 (build date 23/03/2018 10:26:57.31)
mosquitto is an MQTT v3.1.1/v3.1 broker.
Usage: mosquitto [-c config_file] [-d] [-h] [-p port]
-c : specify the broker config file.
-d : put the broker into the background after starting.
-h : display this help.
-p : start the broker listening on the specified port.
Not recommended in conjunction with the -c option.
-v : verbose mode - enable all logging types. This overrides
any logging options given in the config file.可以查看到更多的日志信息
See http://mosquitto.org/ for more information.
配置文件 mosquitto.conf
默认配置文件 mosquitto.conf,在启动时可以使用命令 mosquitto -c 配置文件
更改要使用的配置文件。
配置文件里面有很多配置项,基本只用修改以下两个,其余默认即可。
# 服务绑定的 IP 地址
bind_address 127.0.0.1
# 服务绑定的端口号
port 1883
设置帐号和密码
修改配置文件
# 禁止匿名登录
allow_anonymous false
# 设置帐号密码文件
password_file 帐号密码文件全路径(pwfile.example)
# 设置a cl 文件
acl_file acl文件路径(aclfile.example)
帐号密码文件编写(pwfile.example)
admin:123
编写格式:用户名:密码(可以多行)上图例子就是帐号 admin,密码 123
编写完毕后,需要执行命令 mosquitto_passwd -U
帐号密码文件全路径,对帐号密码进行TLS加密才会生效
cal 文件编写(aclfile.example)
# ACL权限配置,常用语法如下:
# 用户限制:user
# 话题限制:topic [read|write]
# 正则限制:pattern write sensor/%u/data
# This affects access control for clients with no username.
topic read $SYS/#
# This only affects clients with username "roger".
user roger
topic foo/bar
user admin
topic write chat/#
user admin
topic read chat/#
# This affects all clients.
pattern write $SYS/broker/connection/%c/state
编写格式: user 用户名 topic read/write 具体的主题(可使用通配符)
参考
https://www.jianshu.com/p/3d5b487c6860
https://www.jianshu.com/p/4b545332b495
How to Install The Mosquitto MQTT Broker on Windows
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com
文章标题:MQTT 介绍
文章字数:2k
本文作者:Bin
发布时间:2018-09-14, 16:06:22
最后更新:2019-08-06, 00:54:14
原始链接:http://coolview.github.io/2018/09/14/MQTT%20%E4%BB%8B%E7%BB%8D/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。