我们有一个基于物联网的应用程序设备,配置为通过来自Google,AWS和Azure等各种服务提供商的MQTT桥与我们的仪表板进行通信。
所以流程是:
使用MQTT QOS 1 服务发布和订阅消息。
观察:
AWS和Azure在上述流程中运行良好,但即使我们的仪表板向Google IoT MQTT网桥发布消息,设备也会在成功完成3-5次迭代后停止接收来自Google MQTT网桥的消息。
对于Google,我们发现与Azure和AWS相比,控制流程有所不同。
对于Google,我们需要在等待接收消息之前每次订阅和取消订阅给定主题,而对于AWS和Azure,我们需要在打开MQTT连接期间订阅一次。
问题:
有时会发生5秒设备超时,因为它无法从Google MQTT网桥接收订阅主题的消息。添加多次重试以克服超时问题是不成功的,因为在启动45-60秒的设备操作后,设备无法从Google MQTT桥接收到消息,因此问题仍然存在。
答案 0 :(得分:0)
我也使用谷歌iot核心,mqtt客户端的设备端代码是golang,同时使用paho mqtt包。这个客户端包支持OnConnect处理程序,在使用这个处理程序时,我实现了我认为你正在寻找的恢复。 通过这个处理程序,我重新订阅了“config”主题。
我认为谷歌不会保存客户订阅的订阅,因此客户端需要在成功连接时重新订阅
答案 1 :(得分:0)
这是我使用的golang代码(受gingi007的回答启发,谢谢!)
var onConn MQTT.OnConnectHandler
onConn = func(client MQTT.Client) {
fmt.Println("connected")
client.Subscribe(topic.Config, 1, handlerFunc)
}
mqttOpts.SetOnConnectHandler(onConn)
client := MQTT.NewClient(mqttOpts)
通过这种方式,配置更新不断流入我的设备,而如果您在onConnectHandler之外订阅,则在连接时只会收到一个配置更新。