设备影子实现IoT离线设备运行参数配置更新实践
1.设备运行参数配置更新的技术方案
在很多IoT业务场景,我们需要在云端动态调整设备运行的配置参数,但由于网络不稳定,电池容量限制,很多物联网设备无法做到24小时在线,设备频繁上下线,设备定时沉睡离线,带来一个新的问题:在设备离线时,云端的控制指令如何发送给设备,在设备上线后,能按照新的指令执行业务逻辑?
IoT物联网平台的设备影子功能就能解决离线设备配置参数更新的问题。
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.订阅设备影子topic
const 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.初始化client
const 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更新配置参数
业务系统调用成功后,我们可以登录控制台查看设备影子信息。具体如下:
4.2 在线设备实时获取更新
设备在线时,设备通过订阅设备影子的Topic实时获得云端配置参数。
4.3 离线设备上线后获取更新
设备离线时,设备影子缓存云端配置参数,设备上线后,主动从云端拉取最新的配置参数。这时配置参数更新的时间会比当前时间早,设备端可以根据这个时间来判断是否要使用新的配置参数。