OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3998|回复: 1

RT-Thread MQTT 接收离线消息

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2019-6-29
在线时间
0 小时
发表于 2019-6-29 15:03:40 | 显示全部楼层 |阅读模式
本帖最后由 lxg 于 2019-6-29 15:04 编辑

MQTT 接收离线消息
MQTT实现方式:
发布者: 发布消息
代理  : 推送消息
订阅者: 订阅消息 接收消息
MQTT是基于TCP/IP协议栈,因此只要支持TCP/IP,都可以使用MQTT.

MQTT消息格式
MQTT的消息格式是由固定报文头,可变报文头,有效负荷组成,格式如下所示:
固定报文头 | 可变报文头 | 有效负荷

固定报文头
固定报文头最少有两个字节,第一个字节包括MQTT消息类型和Qos级别,第二个字节为剩余长度(可变报文头和有效负荷的总长度)。

可变报文头
可变报文头包含一个报文标识符(packet id)

有效负荷
有效负荷(payload) 才是真正的数据,当消息类型为订阅消息时,有效负荷才是真正的订阅的数据。
有效负荷长度计算: 固定报文头里的剩余长度 - 可变报文长度

MQTT服务质量
MQTT有三种服务质量
Qos0: 最多一次,这一级别会发生消息丢失
Qos1: 至少一次,确保消息到达。
Qos2: 只有一次,确保消息只有一次到达

MQTT保活机制
MQTT可以设置keepAliveInterval(心跳间隔),客户端在心跳间隔期间发送PINGREQ消息,服务端返回PINGRESP消息,如果客户端超过1.5倍心跳间隔时间还没有发送PINGREQ消息,服务器会主动断开连接。

遗愿标志(will flag)
遗愿标志(will flag) 被设置为1时,当客户端连接关闭时,服务端会发布遗愿消息。

CleanSession
CleanSession 是确保客户端接收离线消息的关键属性,CleanSession 设置为True时,服务端将不会保存会话,当客户端断开连接时,会丢弃中途的所有消息。
当CleanSession设置为False时,服务端将保存持久会话,当客户端断开连接时,服务端将会保存这段时间内接收的消息,等到客户端再次连接时,服务端将推送这些消息到服务端。
注意事项:使用CleanSession=False功能时,要保证ClientID唯一性,不能将ClientID设为随机数。

windows平台的MQTT调试工具
windows平台的用户可以使用MQTTBOX这个软件进行测试, 可以很方便的模拟订阅者和发布者进行发送和接受数据。

常用的MQTT测试连接
mqtt://iot.eclipse.org                    MQTT over TCP, default port 1883:
mqtt://iot.eclipse.org:1884            MQTT over TCP, port 1884:
mqtts://iot.eclipse.org                   MQTT over SSL, port 8883
mqtts://iot.eclipse.org:8884           MQTT over SSL, port 8884

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

1034

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3668
金钱
3668
注册时间
2011-5-23
在线时间
2004 小时
发表于 2019-7-1 11:22:28 | 显示全部楼层
所以关键点就是 使用CleanSession=False,并保证ClientID唯一并不变 么?
RT-Thread RTOS 音频,WIFI,蓝牙
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-10 10:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表