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。
以个人理解整理了一个简单流程图。