MQTT协议调研

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服务器端: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使用QOS0mqttfx-spc-test主题发布消息:

    MQTT.fx主题发布

  • MQTTool订阅mqttfx-spc-test主题,即可收到消息:

    MQTTool主题订阅

同样,也可以通过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 握手过程详解
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • MQTT协议内部分享 时间:2018-07-26 讲解提纲 协议文档的解读 协议适用的场景 协议正确的使用方式 技...
    ProfessorTao阅读 14,579评论 0 25
  • 网络编程 1. 概论 建立连接:通过IP或者域名来连接两台设备,通过端口号找到对应的通信程序 通信协议:要传输的数...
    陵无山阅读 12,447评论 0 12
  • 背景 阅读优秀的代码是一种享受,将优秀的代码用自己的世界观优秀地描述出来就十分痛苦了是要死一亿个脑细胞的。 这篇源...
    编程产品人阅读 12,142评论 4 8
  • 9月22日 人生 人生如戏,全靠演技。 人生如画,跌宕起伏。 其实人生就是这样的: 起起落落落落落落落落落落…… ...
    Sernedipity阅读 1,872评论 1 0
  • 她,一个和我同床共枕无数天的女子。 还记得那是我来通城的第一天…老妹欢天喜地的来火车站接我,跟在她身后一个胖胖的...
    宅成达人阅读 3,335评论 2 0