向设备下发消息


向设备下发消息

通过前边的章节,我们已经实现了设备上报数据到云平台,这可以满足很多的物联网数据采集场景。

还有很多场景下,我们需要通过云端向设备主动发送消息,我们统称为云端下发消息。这里的云端既包括云平台本身,也包括基于云平台 API 开发的 SaaS 应用、手机 App 等。

下发属性

对于一个温湿度传感器设备,我们将温度、湿度这些指标看成是设备的属性,如果您了解面向对象的程序开发,您一定很容易理解属性的含义。

在 ThingsCloud 中,设备属性既可以上报,也可以下发。像温度、湿度这样的数值永远来自设备自身的感知,然后报告给云平台,所以这类属性的类型是 设备上报 ,而温度告警阈值是由用户或 AI 确定,通过云平台下发给设备,所以这类属性的类型是 云端下发。还有其它类型的属性,我们在后边章节详细介绍。

下面我们来完成一次云端向设备下发属性,这里我们用 MQTT 接入协议来实现设备实时接收下发消息。

我们需要在设备上先订阅如下主题:

attributes/push

我们这里可以用 MQTT.fx 来模拟设备完成订阅。

接着,我们在控制台进入设备详情页的【属性】页面,点击【下发属性】,填写要下发的属性数据,使用 JSON 格式,包含两个温度阈值,即用于设备本地告警的温度最大值和最小值。如下图:

提交后,我们可以看到设备属性列表中增加了刚刚下发的属性,它们的类型是 云端下发。如下图:

这时,在 MQTT.fx 工具上我们收到了一条消息,正是我们刚刚从个云端下发的属性数据。如下图:

一旦设备拥有该下发属性后,我们还可以直接在设备属性的菜单中,快速下发数据,如下图:

到此,我们完成了下发属性值给设备,设备在收到告警阈值属性值后,可用于本地告警判断,通过设备上的 LED 灯来指示告警状态。

下发命令

另一些时候,我们要下发给设备一些消息,要求设备执行一些动作,但并不希望云端直接修改设备本身的某种属性。

例如,我们要向设备发送一个立即打开开关的指令,设备在收到消息后,触发继电器完成开关导通。然后设备向云平台上报新的开关状态。

之所以不用下发属性的方式,是因为我们希望开关状态这个属性能真实代表开关实际状态,所以要让设备在实际完成动作后,主动向云平台报告新状态。

这时我们就需要用到 下发命令,这是 ThingsCloud 支持的内置设备访问协议。

在云平台下发命令之前,我们同样在设备上需要先订阅如下主题,这里我们采用 MQTT.fx 客户端工具来模拟。

command/send/+

对于不支持 + MQTT 通配符的设备,可以订阅如下主题:

command/send/1000

接下,我们在控制台中给设备提交一个下发命令,如下图:

下发命令

命令就像是一个远程函数调用,它包含命令名称和参数,而这些都可以由我们来自定义。这里我们定义的命令名称是:

changeSwitch

参数是 JSON 格式,就像函数调用的参数一样,您可以将多个参数放在 JSON 结构中。这里我们发送的参数是:

{
    "state": "ON"
}

提交成功后,我们会在设备上收到 MQTT 消息,如下图:

下发命令

同时,在控制台的设备命令历史中,可以看到刚刚下发的命令详情,如下图:

下发命令

云平台会记录所有下发给设备的命令,我们可以在控制台查看,或者通过 API 获取。