物联网loT从业者嵌入式操作系统那些事儿

MQTT协议调研

2019-05-01  本文已影响1人  古斟布衣

MQTT是基于二进制消息的发布/订阅编程模式的消息协议,最早由IBM提出,如今已经成物联网领域最成熟的协议之一。目前MQTT最新版本为3.1.1

1. 概述

MQTT协议包含MQTT客户端和MQTT服务器两种实体:

  1. MQTT客户端可以连接到服务器,向其他客户端以某个主题发布消息或者订阅其他客户端以以某个主题发布发布的消息;
  2. MQTT服务器端作为MQTT客户端之间的代理,负责转发和缓存消息,从而实现MQTT客户端之间的解耦;
  3. MQTT客户端发布的消息包含主题和消息体两部分,可以为不超过65535字节的任意字符串;MQTT客户端使用包含可选的通配符的主题表达式来订阅其他客户端发布的消息;
  4. 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.fx可通过点击齿轮图标或从Extras->Edit Connection Profiles进入连接配置,具体配置如下图所示:

MQTTool配置与MQTT.fx类似,连接到Mosquitto托管测试端即可。

PC和手机客户端都连接到同一个测试服务器之后,即可通过发布、订阅功能进行通信:

同样,也可以通过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行代码等。

参考

  1. MQTT.ORG主页
  2. MQTT协议英文版
  3. MQTT协议中文版
  4. MQTT相关软件和库
  5. MQTT入门篇
  6. MQTT进阶篇
  7. SSL/TLS 握手过程详解
上一篇下一篇

猜你喜欢

热点阅读