Google Core IoT Device Offline Event or Connection Status

坚强是说给别人听的谎言 提交于 2019-12-01 20:44:03

Your cloud project does have access to the individual MQTT connect/disconnect events, but currently they only show up in the Stackdriver logs. Within the cloud console, you can create an exporter that will publish these events to a Pub/Sub topic:

  1. Visit the Stackdriver Logs in the Cloud Console.
  2. Enter the following advanced filter:

    resource.type="cloudiot_device"
    jsonPayload.eventType="DISCONNECT" OR "CONNECT"
    
  3. Click CREATE EXPORT

  4. Enter a value for Sink Name
  5. Select Cloud Pub/Sub for Sink Service
  6. Create a new Cloud Pub/Sub topic as the Sink Destination

The exporter publishes the full LogEntry, which you can then consume from a cloud function subscribed to the same Pub/Sub topic:

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...

});

Note that in cases of connectivity loss, the time lag between the device being unreachable and an actual DISCONNECT event could be as long the MQTT keep-alive interval. If you need an immediate check on whether a device is reachable, you can send a command to that device.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!