NB-IoT 设备休眠上电后立即接收下发数据
NB-IoT 设备休眠上电后立即接收下发数据
一些客户使用 NB-IoT 或 4G Cat.1 等低功耗模组,用在无需实时连接云平台的场景,例如远程抄表上报、定期接收应用端指令下发等。在这种情况下,通常会让模组保持待机休眠状态,每隔一段时间,模组上线连接 ThingsCloud,完成一些数据的上报和接收,然后再次进入休眠。
这里会产生一个问题,如果我们在平台端修改并下发设备属性时,设备刚好处于休眠状态,无法实时接收下发数据,当设备下次上线时,如何能收到我们之前修改过的属性数据呢?
在 ThingsCloud,我们提供了多种解决方案:
设备主动获取属性
ThingsCloud 为设备提供了主动获取平台设备属性的一组 MQTT 主题,设备可以在上电开机后,主动获取最新的设备属性。相关文档如下:
提示
可能你会想到用 MQTT 消息的 QoS 来解决,不过 ThingsCloud 标准协议在设计之初,就希望设备和云端的通信不依赖某些协议的特定机制,而是提供一套建立在多种接入协议(MQTT/TCP/HTTP)之上且简单易用的统一规范。所以 ThingsCloud 不支持消息的 QoS 机制。
用规则来自动下发属性
如果您无法修改设备端来发布和订阅主动获取属性的相关 MQTT 主题,又或者您的设备并未通过 MQTT 接入,而是通过 TCP 接入,请看这里。
这种方案只需要在 ThingsCloud 控制台为设备类型创建消息规则,便可实现设备上电后上报数据,触发平台下发特定的数据。
这里以 MQTT 接入为例,创建规则时,选择属性上报,如下图:
在规则操作中,添加向当前设备下发属性,如下图:
接下来,编写一个简单的云函数,如下图:
云函数代码如下:
module.exports = function (report_attributes) {
/**
* report_attributes: 上报的属性对象,作为函数参数传入
* push_attributes: 构造下发的属性对象,作为函数返回值,下发到硬件
*/
var push_attributes = {};
// 读取设备在云平台的最新属性
const cur_attributes = Cloud.getCurrentAttributes();
// 如果是设备开机上报
if (report_attributes.start === 1) {
// 将特定的属性转入下发数据 JSON 中,这里装入一些设备配置类数据
push_attributes = {
config_1: cur_attributes.config_1 || 0,
config_2: cur_attributes.config_2 || "",
config_3: cur_attributes.config_3 || false
}
}
return push_attributes;
}
在此基础上,您可以增加一些必要的逻辑,符合您的设备业务需求。
例如:判断设备属性 config_4
上次更新是由云平台下发,则追加到本次下发属性中。修改函数中的相关片段如下:
...
push_attributes = {
config_1: cur_attributes.config_1 || 0,
config_2: cur_attributes.config_2 || "",
config_3: cur_attributes.config_3 || false
}
if (Cloud.getAttributeMetadata('config_4').type == 'push') {
push_attributes.config_4 = cur_attributes.config_4;
}
...
有了以上规则后,我们来测试一下。我们在云平台上修改要下发给设备的几个属性,如下图:
设备开机后,订阅属性下发主题 attributes/push
,然后向属性上报主题 attributes
发布以下属性数据:
{
"start": 1,
"temperature": 24,
"rssi": 28
}
接着设备会立即收到云端下发的消息:
{
"config_1": 20,
"config_2": "OK",
"config_3": true
}
设备通过这些下发消息完成相应的动作。
如果您的设备是通过 TCP 接入 ThingsCloud,那么该方案的思路不变,只是要用到自定义数据上报规则,使用自定义数据流来自动下发数据。
详细了解 ThingsCloud 消息规则,请浏览 消息规则