背景:我们有业务场景就是手机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。
以个人理解整理了一个简单流程图。
标签:订阅,golang,MQTT,阿里,手机,服务器,链接 From: https://www.cnblogs.com/adongdev/p/18229160