Google IOT:识别设备在 sendCommandtoDevice 失败后重新上线

Google IOT: Identify the device is back online after sendCommandtoDevice failure

按照本指南进行操作 Sending commands to devices

// const cloudRegion = 'us-central1';
// const deviceId = 'my-device';
// const commandMessage = 'message for device';
// const projectId = 'adjective-noun-123';
// const registryId = 'my-registry';
const iot = require('@google-cloud/iot');
const iotClient = new iot.v1.DeviceManagerClient({
  // optional auth parameters.
});

const formattedName = iotClient.devicePath(
  projectId,
  cloudRegion,
  registryId,
  deviceId
);
const binaryData = Buffer.from(commandMessage);
const request = {
  name: formattedName,
  binaryData: binaryData,
};

try {
  const responses = await iotClient.sendCommandToDevice(request);

  console.log('Sent command: ', responses[0]);
} catch (err) {
  console.error('Could not send command:', err);
}

我在 Google Cloud Function 上有此功能 运行(感谢 Firebase,我爱你),将命令发送到 Google 由 Mongoose OS + Google IoT Core 框架创建的物联网设备.

大部分时间都按预期工作。现在我希望在设备没有响应时改进系统。

由于多种原因,设备可能会暂时失去连接并因此丢失命令(见下图):

在这种情况下,设备暂时无法访问(例如,手机网络信号差,或者网络路由问题,无论如何)。

有什么方法可以在设备重新上线并可用时触发功能吗?

我的目的是,如果用户在设备没有响应时向设备发送命令,我想自动再次发送命令。猜猜如果用户需要关闭电机并且设备丢失命令会发生什么情况?

但请记住,设备并未与 Google IOT MQTT 服务器“断开连接”。连接仍然存在并且已启动 运行,通过良好的 wifi 信号连接到光纤互联网。设备无法意识到服务器端发生错误。

我还“猜测”设备需要在服务器根据 MQTT 保持活动间隔了解它不活动之前发送 ping,但我不知道如何检查。

如果您需要设备始终接收来自 IoT Core 的负载,即使它是在设备未连接/未响应时发送的,您应该使用 configuration 而不是命令。

配置在 IoT Core 中持久存在,因此即使它没有响应,它最终也会被传送到设备。

配置总是在设备重新连接到 IoT Core 时发送到设备,因此您可以确保设备会收到它,即使它是在设备离线时发送的。

关于内容的配置和命令之间有no difference

确实只能发送1个config/device/second,但大多数情况下这就足够了。

检测设备何时上线和下线并做出反应:

  1. 在 Cloud Logging 中创建接收器
  2. 将此查询放入新的接收器中: resource.type="cloudiot_device" AND jsonPayload.eventType=("CONNECT" OR "DISCONNECT")
  3. 将接收器发送到 Pub/Sub
  4. 创建云函数
  5. 创建从 Pub/Sub 到云函数的推送订阅

然后您可以在函数中处理日志消息并进行相应操作:

  • 设备“友好”ID进入labels.device_id
  • event typejsonPayload.eventType