MQTT 移植STM32+GPRS(串口透传)(二)

版权声明:欢迎大家吐槽! https://blog.csdn.net/qq_20251069/article/details/62083783

上一篇中,介绍了什么是MQTT协议、常用的领域和一些典型特征,这篇还要补充部分概念性理论。

## 协议解析
整体的协议构造,整体分为 固定头部+可变头部+消息内容 如下图所示
! [head](http://omp77n3im.bkt.clouddn.com/MQTT_msg_head.png)

其中byte 1 的高四位(4~7)代表信息的类型共13中,(0作为保留)上篇中有介绍。
Qos代表服务质量等级(QosLEVELS)参数,或者是发送消息的次数。见下文 
固定头部的BYTE2位用来保存后面可变头部+消息体的大小。但并不是直接保存,同样可以拓展,前7位保存长度,剩余的作为标识位。EG:如果后面的数据大于127,此时最高位标识位为1,表示要拓展一个字节,同样如果数据量大于162383,拓展出的第二位的最高位也为1,一次类推。最大可以表示256M的数据量。

## 服务质量等级(QosLevels)参数
###MQTT提供三种Qos的消息传递质量:

Qos = 0:协议对此等级应用信息不要求回应确认,也没有重发机制,这类信息可能会发生消息丢失(更多)或重复,取决于网络稳定情况。
Qos = 1:至少一次(Atleast once delivery),确保信息到达,但消息可能重复接收,当发送者在指定时间内没有收到PUBACK控制报文,应用信息会被重新发送,且控制报文中DUP标志位置1。
Qos = 2:最高级别的服务质量,不会发生信息丢失和重复。(过程消耗资源比上面两种大)

###可变报头参数(部分):

Keep Alive:表示响应时间,如果这个时间内,连接或发送操作未完成,则断开tcp连接,表示离线。
Connect Return Code即通常于CONNACK消息中,表示返回的连接情况,我可以通过此检验连接情况。
topic Name,订阅消息标识,用于区别消息的推送类别。最大支持32768种类,占用4个字节。

### 消息体(PayLoad):
只有3种消息有消息体CONNECT、SUBSCRIBE、SUBACK
CONNECT主要是客户端的ClientID,订阅的Topic和Message还有用户名和密码。
SUBSCRIBE包含要订阅的主题还有Qos参数。
SUBACK是服务器对于SUBSCRIBE所申请的主题和Qos的确认和应答。

PUBLISH是消息体中保存推送的消息。


##### 有了这些我们可以针对移植了。
######说明:在sectong公司期间的周末休息时间所整理。

猜你喜欢

转载自blog.csdn.net/qq_20251069/article/details/62083783