Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 使用GCP IoT Core,通过MQTT和JWT保持设备连接状态_Firebase_Google Cloud Platform_Jwt_Mqtt_Google Cloud Iot - Fatal编程技术网

Firebase 使用GCP IoT Core,通过MQTT和JWT保持设备连接状态

Firebase 使用GCP IoT Core,通过MQTT和JWT保持设备连接状态,firebase,google-cloud-platform,jwt,mqtt,google-cloud-iot,Firebase,Google Cloud Platform,Jwt,Mqtt,Google Cloud Iot,我有一些设备通过发送到GCP IoT core的MQTT生成数据。我想监控设备当前是否与MQTT代理连接或断开连接。这已经得到了回答,这是我目前使用的方法:监视连接/断开连接消息的Stackdriver日志,并将它们发布到单独的发布/子主题。然后Firebase函数将阅读此主题以更新“我的设备在线/离线”字段 这在理论上是可行的,但由于JWT expiration字段的原因,每次令牌过期时,我都必须重新连接我的设备,从而导致大量虚假的在线/离线触发器。有没有办法在保持连接的同时刷新令牌?还是一种

我有一些设备通过发送到GCP IoT core的MQTT生成数据。我想监控设备当前是否与MQTT代理连接或断开连接。这已经得到了回答,这是我目前使用的方法:监视连接/断开连接消息的Stackdriver日志,并将它们发布到单独的发布/子主题。然后Firebase函数将阅读此主题以更新“我的设备在线/离线”字段

这在理论上是可行的,但由于JWT expiration字段的原因,每次令牌过期时,我都必须重新连接我的设备,从而导致大量虚假的在线/离线触发器。有没有办法在保持连接的同时刷新令牌?还是一种更好的方法来简单地监控设备的连接


我可能会使用心跳事件,并且只考虑设备在没有N个分钟内接收到心跳的情况下离线,甚至周期性地向设备发送某种ping命令。尽管如此,只要知道设备当前是否已连接就好了。

我认为通过Stackdriver日志记录和PubSub实现监控设备的方式是最合适的


同时,关于JWT令牌的过期,我建议您验证,它提供了几个示例,说明如何刷新令牌,从而防止设备断开连接。

对于纯MQTT解决方案,我已经在做的以及Orlandog建议的是正确的,但这并不能解决每次刷新JWT令牌时接收断开连接/连接消息的根本问题。这就是协议的工作原理

我最终使用的是我的设备,它在balena操作系统上运行docker容器和我的应用程序,操作系统本身通过VPN连接。因此,无论我的应用程序的MQTT状态如何,我都可以使用balena API来监控设备的在线状态。然后使用firebase云函数轮询此API

总结如下:

  • IoT核心应用发送/接收MQTT,JWT刷新作为docker容器
  • 已配置网络的Balena操作系统,连接到Balena VPN
  • 用于查询设备状态的Balena API
  • 调用balena API并将值存储在Firebase中的云函数

Balena最多可释放10台设备,它们支持多种硬件。

此外,在另一个PubSub主题中创建Stackdriver接收器也可以,但这些事件在到达firebase功能时的顺序不能保证相同。因此,有时我的状态会从在线更新到在线,然后从在线更新到离线。这看起来几乎不可能正确处理。我得到了相同的精确解决方案,我面临着相同的问题。你最终找到了更好的方法吗?@leonardo第一个纯MQTT解决方案:我最终制作了一个名为“ping”的新pubsub主题,并简单地从我的设备向其发送小数据包,使用订阅该“ping”pubsub主题的云函数在我的firebase中将其记录为“lastPing”。然后每N分钟运行一次周期函数,以检查“lastPing”是否发生在>X分钟前。如果是这样的话,我会考虑设备离线并发送通知给我的用户,离线->在线状态是相反的,但是一切都非常混乱。我将在答案中发布后续信息。谢谢你的建议,我正在考虑类似的事情。我不能真正依赖Balena.io,因为我计划拥有更多的设备。然而,由于谷歌已经在跟踪这个心跳,我将尝试以某种方式利用它,并使用类似的方法检查它是否在最后N分钟内。那么,我关心的是使它具有可伸缩性;我不想在将来使用相同的功能检查来自许多设备的ping。@leonardo是的,balena way并不是这个问题的答案。这也正是我所关心的。检查大量设备的“最后心跳”的一个功能并不理想。当你发现一些问题时,请随意提交一个答案:)谢谢你的建议。刷新JWT没有困难,但这确实需要重新连接。在您链接的文档中
client.disconnect();client.connect()。此行为在Stackdriver中生成断开/连接日志。如果不中断JWT刷新,似乎无法连续监视联机状态。您试图通过连接和断开连接事件触发什么类型的操作?Firebase云函数侦听发布/子主题
联机
,Stackdriver将连接日志消息发布到此主题。然后,此云函数更新我的数据库中指示设备联机状态的布尔字段。反过来,根据此布尔字段触发另一个函数,如果设备脱机/联机,则会向用户发送电子邮件通知。使用JWT刷新,用户会由于多个MQTT断开连接/连接消息而收到错误通知。我需要一种稳定的方法来确定设备是否由于网络错误或物理断电而脱机。