golang使用阿里MQTT的通信记录

背景:我们有业务场景就是手机App可以操作物连网设备,一年之中总会有一两次,手机无法操作设备,于是我们就需要将服务器重新启动就正常了,使用的是阿里MQTT服务。

猜测:我一直怀疑,这个通信系统中的可能有BUG,消息丢失无法送达或者在传递过中发生了错乱无法正确收到消息。

分析:仔细研究发现是代码的BUG,初始化client有一个方法InitClient,订阅主题B有SubscribB。

1、当服务器启动后调用InitClient,此方法中有一个设置 {opts.CleanSession = true} ,再使用go关键字异步调用SubscribB。

2、这时手机是可以操作设备的。

3、当MQTT服务器断开链接,服务器的client也重新链接,手机就再也操作不了设备。

4、查找资料发现opts.CleanSession设置为true时,断开链接,订阅的主题都会被清空。

5、想要正确收到消息,重新链接后需要再订阅主题B。

解决:在初始化InitClient方法中,连接成功的Callback里调用SubscribB方法,这样无论是第一次初化连接成功,还是后面被断开再次连接成功都会去订阅主题B。

以个人理解整理了一个简单流程图。

使用MQTT手机与设备通信

 

posted @ 2024-06-03 16:30  東玖零  阅读(1)  评论(0编辑  收藏  举报