11

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

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

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

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

Auzure iot hub 的设备连接(在线/离线)状态

我希望在编写所有代码并使用谷歌的物联网平台实现我的设置之前就知道这一点,我想这是我的错,因为假设一些东西如此简单并且应该是物联网设备的标准。

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

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

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

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

4

2 回答 2

12

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

  1. 访问 Cloud Console 中的Stackdriver 日志
  2. 输入以下高级过滤器:

    resource.type="cloudiot_device"
    jsonPayload.eventType="DISCONNECT" OR "CONNECT"
    
  3. 单击创建导出

  4. 输入接收器名称的值
  5. Sink 服务选择Cloud Pub/Sub
  6. 创建一个新的 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 保持活动间隔一样长。如果您需要立即检查设备是否可访问,您可以向该设备发送命令。

于 2019-02-20T05:55:36.647 回答
0

我认为最好的解决方案是

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 
于 2021-09-25T13:48:34.900 回答