跳至主要內容

NB-IoT 设备休眠上电后立即接收下发数据

约 980 字大约 3 分钟

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 消息规则,请浏览 消息规则