1

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

所以流程是:

  1. 设备启动与服务提供商的 TLS 会话。
  2. 订阅特定主题并等待来自服务提供商的消息,超时时间为 5 秒。
  3. Dashboard 定期向同一主题发布消息。
  4. 物联网服务提供商将其广播给所有订阅的设备。

发布和订阅消息使用 MQTT QOS 1服务。

观察:

AWS 和 Azure 在上述流程中运行良好,但设备在 3-5 次成功迭代后停止接收来自 Google MQTT 桥的消息,即使我们的仪表板正在向 Google IoT MQTT 桥发布消息。

对于 Google,我们发现与 Azure 和 AWS 相比,控制流是不同的。

对于 Google,我们需要在每次等待接收消息之前订阅和取消订阅给定主题,而对于 AWS 和 Azure,我们需要在打开 MQTT 连接期间订阅一次。

问题:

有时会发生 5 秒设备超时,因为它无法从 Google MQTT 网桥接收订阅主题的消息。添加多次重试以克服超时问题未成功,因为在开机后设备操作 45-60 秒后设备无法从 Google MQTT 桥接接收消息,问题仍然存在。

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

2 回答 2

0

Here's the golang code I've used (inspired by gingi007's answer, thank you!)

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)

this way config updates keep flowing to my device, while if you subscribe outside of the onConnectHandler you'll just receive one config update when you connect.

于 2018-07-10T08:24:46.040 回答
0

I am using google iot core as well,the device side code for the mqtt client is golang while using paho mqtt package. this client package support OnConnect handler which while using this handler I achieve the recovery which I think you are looking for. Via this handler I am re-subscribing to the "config" topic.

I think that google does not save the subscriptions which the clients are subscribed to and therefore the client needs to re-subscribe upon successful connection

于 2018-04-14T21:59:02.347 回答