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,但大多数情况下这就足够了。
检测设备何时上线和下线并做出反应:
- 在 Cloud Logging 中创建接收器
- 将此查询放入新的接收器中:
resource.type="cloudiot_device" AND jsonPayload.eventType=("CONNECT" OR "DISCONNECT")
- 将接收器发送到 Pub/Sub
- 创建云函数
- 创建从 Pub/Sub 到云函数的推送订阅
然后您可以在函数中处理日志消息并进行相应操作:
- 设备“友好”
ID
进入labels.device_id
event type
在jsonPayload.eventType
按照本指南进行操作 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,但大多数情况下这就足够了。
检测设备何时上线和下线并做出反应:
- 在 Cloud Logging 中创建接收器
- 将此查询放入新的接收器中:
resource.type="cloudiot_device" AND jsonPayload.eventType=("CONNECT" OR "DISCONNECT")
- 将接收器发送到 Pub/Sub
- 创建云函数
- 创建从 Pub/Sub 到云函数的推送订阅
然后您可以在函数中处理日志消息并进行相应操作:
- 设备“友好”
ID
进入labels.device_id
event type
在jsonPayload.eventType