繁体   English   中英

Google IOT:在 sendCommandtoDevice 失败后识别设备重新联机

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

按照本指南向设备发送命令

// 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,我爱你),将命令发送到由Mongoose OS + Google IoT Core框架创建的 Google IoT 设备。

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

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

谷歌云功能日志屏幕截图错误“错误:9 FAILED_PRECONDITION”设备未连接。”

在这种情况下,设备暂时无法访问(例如,移动互联网信号不佳或互联网路由问题,无论如何)。

当设备重新联机并且可用时,我是否可以以某种方式触发功能?

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

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

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

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

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

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

关于内容,配置和命令之间没有区别

确实,您只能发送 1 个配置/设备/秒,但大多数情况下这已经足够了。

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

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

然后您可以在函数中处理日志消息并采取相应措施:

  • 设备“友好” ID位于labels.device_id
  • event typejsonPayload.eventType

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM