其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。 MQTT传输的消息分为:主题(Topic)和负载(payload)两部分
其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
MQTT传输的消息分为:主题(Topic)和负载(payload)两部分。
Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)
payload,可以理解为消息的内容,是指订阅者具体要使用的内容。
4.1.1 MQTT客户端
一个使用MQTT协议的应用程序或者是设备,它总是会建立到服务器的网络连接。MQTT服务器被以称之为“消息代理”(Broker),某个的应用程序或某一台设备都可能是。它是位于消息发布者和订阅者之间,它可以:接受来自客户的网络连接;接受客户发布的应用信息;处理来自客户端的订阅和退订请求;向订阅的客户转发应用程序消息。
4.1.2 MQTT协议的订阅会话与主题名
订阅(Subscription): 主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅与会话相关联。 一个会话中可以来包含多个订阅。 每个会话中的每个订阅都会有不同的主题过滤器。
会话(Session):每个客户端在与服务器建立连接后都是会话。客户端、服务器之间会存在一种状态来交互。会话可能会只存在于一个网络之间,也可能跨越客户端和服务器之间的多个连续的网络连接。
主题名(Topic Name):连接到匹配服务器订阅的应用程序消息的标记。 服务器把消息发送到订阅的匹配标签中的每一个客户端。
4.2 MQTT协议方法
MQTT协议中定义了一些方法(也被称为动作), 来于表示对确定资源所进行操作。 这个资源可以代表预先存在的数据或动态生成数据,这取决于服务器的实现。通常来说,资源指服务器上的文件或输出。
Connect,等待与服务器建立连接
Disconnect,等待MQTT客户端完成所做的工作,并与服务器断开TCP/IP会话
Subscribe,等待完成订阅
UnSubscribe,等待服务器取消客户端的一个或多个topics订阅
Publish,MQTT客户端发送消息请求,发送完成后返回应用程序线程
4.3 MQTT数据包结构
在研究MQTT时必不可免的需要用到MQTT的数据格式。
数据包结构包括:固定头、可变头和消息体。
固定头(Fixed header),存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识
可变头(Variable header),存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容
消息体(Payload),存在于部分MQTT数据包中,表示客户端收到的具体内容
4.3.1 MQTT固定头
固定头存在于MQTT所有的数据包中,其结构如下:
表4.2.2 MQTT固定头结构
Bit 7 6 5 4 3 2 1 0
byte 1 MQTT数据包类型 不同类型MQTT数据包的具体标识
byte 2… 剩余长度
剩余长度字段 表示可变报头的长度。对PUBREC报文它的值等于2。
4.3.2 MQTT数据包类型
位置:byte 1, bits 7-4。
相于一个4位的无符号值,类型如下
名称 值 流方向 描述
Reserved 0 不可用 保留位
CONNECT 1 客户端到服务器 客户端请求连接到服务器
CONNACK 2 服务器到客户端 连接确认
PUBLISH 3 双向 发布消息
PUBACK 4 双向 发布确认
PUBREC 5 双向 发布收到(保证第1部分到达)
PUBREL 6 双赂 发布释放(保证第2部分到达)
PUBCOMP 7 双向 发布完成(保证第3部分到达)
SUBSCRIBE 8 客户端到服务器 客户端请求订阅
SUBACK 9 服务器到客户端 订阅确认
UNSUBSCRIBE 10 客户端到服务器 请求取消订阅
UNSUBACK 11 服务器到客户端 取消订阅确认
PINGREQ 12 客户端到服务器 PING请求
名称 值 流方向 描述