MQTT是基于二进制消息的发布/订阅编程模式的消息协议,最早由IBM提出,如今已经成物联网领域最成熟的协议之一。目前MQTT最新版本为3.1.1。
1. 概述
MQTT协议包含MQTT客户端和MQTT服务器两种实体:
- MQTT客户端可以连接到服务器,向其他客户端以某个主题发布消息或者订阅其他客户端以以某个主题发布发布的消息;
- MQTT服务器端作为MQTT客户端之间的代理,负责转发和缓存消息,从而实现MQTT客户端之间的解耦;
- MQTT客户端发布的消息包含主题和消息体两部分,可以为不超过65535字节的任意字符串;MQTT客户端使用包含可选的通配符的主题表达式来订阅其他客户端发布的消息;
- MQTT将消息分为3级:QoS0(尽力而为、不保证订阅者收到)、QoS1(要求服务器确认以保证收到)和QoS2(要求服务器确保订阅者能且仅能收到1次)。
MQTT协议基于TCP协议的长连接模式,基本报文格式包括固定报文头、可选的可变报文头和载荷。其中可选的可变报文头和载荷与具体类型相关,而固定报文头则包含报文类型、标志和长度。MQTT协议支持如下报文类型:
类型 | 值 | 方向 | 描述 | |
---|---|---|---|---|
Reserved | 0 | N/A | 保留 | |
CONN | ECT | 1 | 客户端到服务端 | 客户端请求连接服务端 |
CONNACK | 2 | 服务端到客户端 | 连接报文确认 | |
PUBLISH | 3 | 双向 | 发布消息 | |
PUBACK | 4 | 双向 | QoS 1消息发布收到确认 | |
PUBREC | 5 | 双向 | 发布收到(保证交付第一步) | |
PUBREL | 6 | 双向 | 发布释放(保证交付第二步) | |
PUBCOMP | 7 | 双向 | QoS 2消息发布完成(保证交互第三步) | |
SUBSCRIBE | 8 | 客户端到服务端 | 客户端订阅请求 | |
SUBACK | 9 | 服务端到客户端 | 订阅请求报文确认 | |
UNSUBSCRIBE | 10 | 客户端到服务端 | 客户端取消订阅请求 | |
UNSUBACK | 11 | 服务端到客户端 | 取消订阅报文确认 | |
PINGREQ | 12 | 客户端到服务端 | 心跳请求 | |
PINGRESP | 13 | 服务端到客户端 | 心跳响应 | |
DISCONNECT | 14 | 客户端到服务端 | 客户端断开连接 | |
Reserved | 15 | N/A | 保留 |
MQTT协议作为传输层协议,只关注消息传输,不关注安全性。因此实现者需要考虑使用SSL/TLS和AES等加密技术。目前,基于SSL/TLS的MQTT客户端和服务器端比较成熟,但是该技术依赖与OpenSSL、mbedtls等复杂的基础设施,因此不适用与资源有限的物联网设备;而基于AES加密技术的的MQTT客户端和服务器端尚未发现,因此可选的方法是通过物联网网关进行中转从而保证安全性,但也会相应的增加成本。
2. MQTT基本功能验证
本文中选择的测试环境如下:
-
MQTT服务器端:Mosquitto托管测试端
-
MQTT桌面客户端: 可以从MQTT Desktop tools中选择,本文选择MQTT.fx;该客户端支持普通模式和TLS加密模式通信,包括连接、断开、发布、订阅、服务器状态、日志等;
选区_065.png
-
MQTT手机客户端:可以从MQTT Mobile platforms中选择,本文选择iOS端的MQTTool;MQTTool为开源工具,支持普通模式通信,包括连接、断开、发布、订阅、连接状态等。
MQTT.fx可通过点击齿轮图标或从Extras->Edit Connection Profiles
进入连接配置,具体配置如下图所示:
-
普通连接
MQTT.fx普通连接 - TLS加密链接
MQTT.fx加密连接
其中,服务器地址、端口号、证书可以从Mosquitto托管测试端获取。
MQTTool配置与MQTT.fx类似,连接到Mosquitto托管测试端即可。
PC和手机客户端都连接到同一个测试服务器之后,即可通过发布、订阅功能进行通信:
-
MQTT.fx使用
MQTT.fx主题发布QOS0
和mqttfx-spc-test
主题发布消息:
-
MQTTool订阅
MQTTool主题订阅mqttfx-spc-test
主题,即可收到消息:
同样,也可以通过MQTTool发布消息,而MQTT.fx订阅相应主题以收取消息。
3. MQTT客户端和服务器端
MQTT服务器软件主页提供了主流服务器软件支持,包括Apache ActiveMQ、Apache ActiveMQ Artemis、Emitter等,各具特色,例如Apache ActiveMQ和Apache ActiveMQ Artemis可以支持多种协议,Emitter使用go语言编写等。
MQTT客户端库主页提供了多种语言版本的MQTT实现,其中Eclipse Paho Go使用go语言编写,MQTT-C仅有不到2000行代码等。
网友评论