Google IoT MQTT桥接问题

时间:2018-04-11 11:45:06

标签: mqtt iot google-cloud-iot

我们有一个基于物联网的应用程序设备,配置为通过来自Google,AWS和Azure等各种服务提供商的MQTT桥与我们的仪表板进行通信。

所以流程是:

  1. 设备启动与服务提供商的TLS会话。
  2. 订阅特定主题并等待来自的消息 服务提供商有5秒超时。
  3. 仪表板会定期向同一主题发布消息。
  4. 物联网服务提供商将其广播给所有订阅的设备。
  5. 使用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桥接收到消息,因此问题仍然存在。

    • Google MQTT网桥是否存在约束以定期接收邮件而不是每次订阅邮件?
    • 设备如何在没有超时(5秒)的情况下从Google MQTT桥接收消息?
    • 在建立MQTT重新连接时,是否有任何解决方法可以恢复设备?

2 个答案:

答案 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之外订阅,则在连接时只会收到一个配置更新。