当前位置: 首页 >应用方案 >技术应用 >

MQTT通信协议报文详解


MQTT通信协议作为目前最主流的物联网协议,大家应该都很熟悉,包括阿里云百度云等都是通过MQTT协议来实现通讯的,与HTTP通信协议一样,其本身都是建立在TCP/IP协议上,本文会详细介绍MQTT报文协议,让大家直观地感受到MQTT通信协议报文的结构与内容。

MQTT报文详解

在探究MQTT通信协议底层的报文之前,大家还应该对于MQTT通信协议本身的工作模式有一个简要直观的了解首先MQTT通信协议是一种低开销低带宽占用的即时通讯协议,它本身是一种消息发布/订阅的机制实现端与服务器通讯的协议。对于服务器而言,没有订阅的概念而对于客户端而言,既有发布概念,也有订阅概念,客户端通过发布主题向服务器发布信息,服务器收到信息后根据客户端的发布主题对消息进行处理。而消息的发布又要区分QoS概念,0/1/2分别对应消息传输一次,保证传输一次以及保证仅仅传输一次,这些涉及到服务器与客户端在通讯过程中是否有交互的过程。这几个概念是MQTT通信协议主要的几个概念,下面正式去详解MQTT通信协议的报文内容。

首先探究MQTT协议报文内容,是直接使用TCP服务器进行通讯的(不使用MQTT服务器),因为MQTT协议本身是基于TCP协议进行通讯的,所以只要服务器向设备发起的请求连接报文以及订阅报文进行正确的回复,普通的TCP服务器完全可以当做MQTT服务器接收到客户端发布的消息,并且能非常简单地将设备发送的包抓出来,其他手段类似于抓包工具也能实现但是并不能直观帮助我们了解这一过程。

拿一个亿佰特4G DTU设备举例(其他设备也是一样的),由于MQTT通信协议本身要配置三元组,我们将设备配置成标准MQTT协议工作模式,三元组按照下面的参数配置,然后目标地址与端口直接填写我们TCP服务器的地址与端口,订阅与发布都勾选并且都按照如下进行配置,然后观察我们TCP服务器上交互的信息。

4G DTU配置

以下为TCP服务器端交互的信息:

MQTT服务器配置

连接MQTT通信协议第一步是请求TCP服务器连接,这一步由协议栈直接完成不需要管,然后客户端会发送请求MQTT服务器连接报文,也就是上面的第一条消息:

第一个byte0x10,其为MQTT协议固定头部分,此byte8bit位分别代表了不同的意义,高四位与低四位的值分别代表的意义也贴在了下方:

MQTT报文

高四位信息

1MQTT协议报文

低四位信息:

2MQTT协议报文

以上就是固定头部分的内容,常见的固定头以及其意义如下:

3MQTT协议报文

这里就能直观理解MQTT通信协议交互过程中的几个交互报文的头部了,先是0x10为首的请求MQTT通信协议连接报文;其次是0x20为首的服务器响应连接的报文然后是0x82为首的设备订阅请求报文;接着是0x90为首的订阅请求回复。至此完成了设备连接MQTT服务器并且订阅成功的过程。最后是设备发布的报文,以0x30为首。

MQTT通讯报文的第二个字节指示的是剩余字段的长度,比如请求连接报文第二个字节值为0x1F代表后面的一个字节为剩余长度,这个剩余长度最大占用4个字节,每个字节的低七位是编码数据,而最高位代表后面有没有更多字节位表示后续有没有更多的字节为代表剩余字节数。而剩余的包括MQTT通信协议三元组信息,是可以在请求连接报文中看到的(0x31 0x31 0x31 就代表Client ID 其前面的0x03代表Client ID 的长度),而发布topic,可以在客户端发布的报文中看到。

这些就是MQTT报文的详情,去了解底层的报文结构有助于我们更好掌控此协议的用法以及排查问题。

文章推荐:

北斗短报文通信技术原理及应用介绍

CAN总线通信实现CAN报文带ID标识教程

MQTT协议报文中TPC驱动和字符转换教程

亿佰特人每一天都致力于更好的助力物联化、智能化、自动化的发展,提升资源利用率,更多产品更多资料,感兴趣的小伙伴可以登录我们的官网进行了解,还有客服小姐姐在线答疑哦!


https://www.wjx.cn/jq/84863372.aspx