写点什么

设备离线时控制指令如何下发:通过设备影子实现离线设备的控制指令触达方案——实践类

作者:阿里云AIoT
  • 2023-03-08
    浙江
  • 本文字数:1677 字

    阅读完需:约 6 分钟

设备影子实现 IoT 离线设备运行参数配置更新实践


1.设备运行参数配置更新的技术方案

在很多 IoT 业务场景,我们需要在云端动态调整设备运行的配置参数,但由于网络不稳定,电池容量限制,很多物联网设备无法做到 24 小时在线,设备频繁上下线,设备定时沉睡离线,带来一个新的问题:在设备离线时,云端的控制指令如何发送给设备,在设备上线后,能按照新的指令执行业务逻辑?

IoT 物联网平台的设备影子功能就能解决离线设备配置参数更新的问题。

image.png


2.设备端开发

为了实现设备影子功能,设备端需要做两件事情:

  • 订阅设备影子更新的 topic(实时更新)

  • 设备开机主动拉取设备影子(上线后,获取最新影子数据)

/** * aliyun-iot-mqtt@0.0.4 */const mqtt = require('aliyun-iot-mqtt');
//设备身份三元组+区域const deviceConfig = { "productKey": "产品", "deviceName": "设备", "deviceSecret": "设备deviceSecret", "regionId": "cn-shanghai"};
//1.建立连接const client = mqtt.getAliyunIotMqttClient(deviceConfig);//2.订阅设备影子topicconst getShadow = `/shadow/get/${deviceConfig.productKey}/${deviceConfig.deviceName}`;client.subscribe(getShadow)
client.on('message', function(topic, message) { //收到消息后,显示设备影子中的远程配置参数 if (topic == getShadow) { message = JSON.parse(message); console.log(new Date().Format("yyyy-MM-dd HH:mm:ss.S")) console.log("\tappConfig.content :", JSON.stringify(message.payload.state.desired.appConfig)) console.log("\tappConfig.timestamp :", JSON.stringify(message.payload.metadata.desired.appConfig.timestamp)) }
})//3.主动获取设备影子中的远程配置参数const updateShadow = `/shadow/update/${deviceConfig.productKey}/${deviceConfig.deviceName}`;client.publish(updateShadow, JSON.stringify({method: "get"}), { qos: 1 })
复制代码


3.云端更新配置

我们的业务系统通过调用设备影子的 UpdateDeviceShadow 接口把新的配置参数保存到设备影子desired 中。具体实现参考如下代码:

/** * package.json 添加依赖:"@alicloud/pop-core": "1.5.2" */const co = require('co');const RPCClient = require('@alicloud/pop-core').RPCClient;
const options = { accessKey: "你的accessKey", accessKeySecret: "你的accessKeySecret",};
//1.初始化clientconst client = new RPCClient({ accessKeyId: options.accessKey, secretAccessKey: options.accessKeySecret, endpoint: 'https://iot.cn-shanghai.aliyuncs.com', apiVersion: '2018-01-20'});//2.desired中appConfig变更const shadowMessage = { method: "update", state: { desired: { appConfig:{ maxTemperature: 39.5, } } }, version: Date.now()
}const params = { ProductKey: "你的ProductKey", DeviceName: "你的DeviceName", ShadowMessage: JSON.stringify(shadowMessage)};
co(function*() { try { //3.发起API调用,更新影子中配置参数 const response = yield client.request('UpdateDeviceShadow', params);
console.log(JSON.stringify(response)); } catch (err) { console.log(err); }});
复制代码


4.运行结果


4.1 云端调用 API 更新配置参数

业务系统调用成功后,我们可以登录控制台查看设备影子信息。具体如下:

image.png


4.2 在线设备实时获取更新

设备在线时,设备通过订阅设备影子的 Topic 实时获得云端配置参数。

image.png


4.3 离线设备上线后获取更新

设备离线时,设备影子缓存云端配置参数,设备上线后,主动从云端拉取最新的配置参数。这时配置参数更新的时间会比当前时间早,设备端可以根据这个时间来判断是否要使用新的配置参数。

image.png


物联网平台产品介绍详情:https://www.aliyun.com/product/iot/iot_instc_public_cn


阿里云物联网平台客户交流群

用户头像

阿里云AIoT

关注

物联网内容搬运者 2022-04-22 加入

还未添加个人简介

评论

发布
暂无评论
设备离线时控制指令如何下发:通过设备影子实现离线设备的控制指令触达方案——实践类_物联网_阿里云AIoT_InfoQ写作社区