Google Core IoT 设备离线事件或连接状态

Posted

技术标签:

【中文标题】Google Core IoT 设备离线事件或连接状态【英文标题】:Google Core IoT Device Offline Event or Connection Status 【发布时间】:2019-07-03 17:16:09 【问题描述】:

有人知道当 Google Core IoT 上的设备离线时触发事件的简单方法吗?在我切换到 Google 的 IoT 实施之前,这非常容易通过在 MQTT 断开连接时触发事件来处理,但 Google 似乎没有简单的方法来做到这一点。

有人知道这方面有什么计划吗?

我需要让谁回来让他们看到像这样的东西是物联网设备管理的基本要求!

AWS 和 Microsoft 等其他平台已经实现了此功能(或以某种方式轻松处理): https://docs.aws.amazon.com/iot/latest/developerguide/life-cycle-events.html

Device connectivity(online/offline)status with the Auzure iot hub

我希望我在编写所有代码并使用 Google 的 IoT 平台实现我的设置之前就知道这一点,我想这是我的错,因为我假设了一些事情 如此简单物联网设备的标准将可用。

如果连基本的线下/线上活动都不能提供,你将如何与其他物联网提供商竞争?!

我在这个 SO 问题中的回复显示了我如何必须编写 100 多行代码才能创建一个 firebase 函数来检查设备是否在线(但这仍然不能处理离线事件,并且只是一个 hack 任何物联网服务提供商都应该原生!): https://***.com/a/54609628/378506

我希望其他人已经找到了一种方法来做到这一点,因为我花了很多天搜索 SO、Google、Google Core IoT 文档,但仍然没有找到任何东西。

即使支持 MQTT Last Will,我们也可以完成这项工作,但 Google 也不支持 (https://cloud.google.com/iot/docs/requirements) ... 加油!

【问题讨论】:

见firebase.google.com/docs/database/android/… @FrankvanPuffelen 好的,但这是特定于 firebase,我需要类似的东西用于 Google Core IoT 设备 通过使用您的其他 SO 问题,我假设您的设备正在使用 Firebase。我不是 Java 开发人员,所以我没有给出答案,但我会使用您拥有的任何事件流或通知通道(在 JS 中它将是 rx Observable 或主题)并基于在线/离线编写事件提供程序状态? @DennisSmolek 这就是问题所在,从与此有关的任何事情中删除 firebase ......无法确定设备何时离线 - 我引用的是 Firebase,因为这是我过去手动使用的通过比较设备的时间戳(或发送命令和检查响应)来检查设备状态 所以我基本上必须在每次加载我的应用程序或更改页面时运行该功能,以确保设备没有脱机。即使他们只是将 LWT 添加到 MQTT 实现中,我也可以想出一种方法来触发 pub/sub 并更新数据库以将其标记为离线 .. 但现在谷歌对此一无所知,我真的无法理解为什么他们没有 【参考方案1】:

我认为最好的解决方案是

We need 3 things
  cloud sheduler ,
 and 2 cloud functions 

第一个函数将是@devunwired 的答案,但即时

// ...write updated state to Firebase... schedule a second function to trigger in 2-3 min (let device to recconect)

seccond 函数将向设备发送命令

if the device resposne to command
     if stored status is connected dont do nothing 
     else if the stored status is disconnected then update the status to connected and do what ever you want maybe email 
else 
     if stored status is disconnected dont do nothing 
     if stored status is connected change the status alert by email or something 

【讨论】:

【参考方案2】:

您的云项目确实可以访问各个 MQTT 连接/断开连接事件,但目前它们仅显示在 Stackdriver 日志中。在云控制台中,您可以创建将这些事件发布到 Pub/Sub 主题的导出器:

    访问Stackdriver Logs 云端控制台。

    输入以下高级过滤器:

    resource.type="cloudiot_device"
    jsonPayload.eventType="DISCONNECT" OR "CONNECT"
    

    点击创建导出

    接收器名称输入一个值 为接收器服务选择Cloud Pub/Sub 创建一个新的 Cloud Pub/Sub 主题作为 接收器目标

导出器发布完整的LogEntry,然后您可以从订阅相同 Pub/Sub 主题的云函数中使用它:

export const checkDeviceOnline = functions.pubsub.topic('online-state').onPublish(async (message) => 
  const logEntry = JSON.parse(Buffer.from(message.data, 'base64').toString());
  const deviceId = logEntry.labels.device_id;

  let online;
  switch (logEntry.jsonPayload.eventType) 
    case 'CONNECT':
      online = true;
      break;
    case 'DISCONNECT':
      online = false;
      break;
    default:
      throw new Error('Invalid message type');
  

  // ...write updated state to Firebase...

);

请注意,在连接丢失的情况下,设备无法访问与实际 DISCONNECT 事件之间的时间延迟可能与 MQTT 保持活动间隔一样长。如果您需要立即检查设备是否可访问,您可以向该设备发送命令。

【讨论】:

Devunwired -- 你先生是天赐之物!谢谢谢谢谢谢谢谢!!完美运行,这太棒了! 对于那些试图解决问题的人来说,devunwired 缺少一步。您必须至少为 IoT Core 注册表启用“信息”日志记录。转到 IoT Core > 注册表 > [您的注册表] > 编辑注册表 > 选择“信息”日志级别 > 单击保存。 Stackdriver 日志有时无法保持顺序。如果 DISCONNECT 后跟 CONNECT 事件,有时 Stackdriver 首先记录 CONNECT 然后 DISCONNECT。 Firebase 状态与实际状态不符。有什么避免这种情况的想法吗?

以上是关于Google Core IoT 设备离线事件或连接状态的主要内容,如果未能解决你的问题,请参考以下文章

使用 Google IoT Core 网关和 Pub/Sub 时 subFolder 为空

Google Cloud IoT Core 和 Pubsub 定价?

如何更改 Google IoT Core 的 MQTT 主机名

在与 Google Cloud IoT Core 交互时限制用户对 IoT 项目的访问

在IoT-Core上检索和编辑设备配置时的身份验证错误

Google IoT Core MQTT 发布错误