向设备下发消息
向设备下发消息
通过前边的章节,我们已经实现了设备上报数据到云平台,这可以满足很多的物联网数据采集场景。
还有很多场景下,我们需要通过云端向设备主动发送消息,我们统称为云端下发消息。这里的云端既包括云平台本身,也包括基于云平台 API 开发的 SaaS 应用、手机 App 等。
下发属性
对于一个温湿度传感器设备,我们将温度、湿度这些指标看成是设备的属性,如果您了解面向对象的程序开发,您一定很容易理解属性的含义。
在 ThingsCloud 中,设备属性既可以上报,也可以下发。
类似 温度、湿度 这样的数值永远来自设备自身的感知,通过设备上报给云平台。
而 温度告警阈值 是由使用者或应用端来确定,通过云平台下发给设备。
还有 继电器开关 通常也是由云端下发到设备,实现照明、电机、水泵、风扇等负载的开关。
我们来实战一下如何从云平台下发属性数据到设备,以及设备如何实时接收。
提示
关于属性类型的详细介绍,请浏览 属性类型。
下发数值属性
首先我们来完成一次从云端向设备下发数值类型的属性,我们在设备端使用 MQTT
接入协议实时接收云平台下发的消息。
在设备端订阅如下主题:
attributes/push
这里我们可以用 MQTT.fx 来模拟设备完成订阅。
接着,我们在控制台进入设备详情页的【属性】页面,点击【下发属性】,填写要下发的属性数据,使用 JSON
格式,包含两个温度阈值,即用于设备本地告警的温度最大值和最小值。如下图:
提交后,我们可以看到设备属性列表中增加了刚刚下发的属性,它们的类型是 云端下发
。如下图:
这时,在 MQTT.fx 工具上我们收到了一条消息,正是我们刚刚从个云端下发的属性数据。如下图:
一旦设备拥有该下发属性后,我们还可以直接在设备属性的菜单中,快速下发数据,如下图:
到此,我们完成了下发属性值给设备,设备在收到告警阈值属性值后,可用于本地告警判断,通过设备上的 LED 灯来指示告警状态。
下发开关属性
接着,我们再来下发开关量属性。
开关量只有两个状态 ON 和 OFF,在 JSON
中表示为 true
和 false
。
在控制台对设备的下发属性 JSON
中,我们让继电器1闭合、继电器2断开,如下图:
对于已存在的开关量类型属性,设备详情页概览中会在属性下方自动显示开关按钮,您也可以直接点击开关来完成属性下发。如下图:
下发命令
另一些时候,我们要下发给设备一些消息,要求设备执行一些动作,但并不希望云端直接修改设备本身的某种属性。
例如,我们要向设备发送一个立即打开开关的指令,设备在收到消息后,触发继电器完成开关导通。然后设备向云平台上报新的开关状态。
之所以不用下发属性的方式,是因为我们希望开关状态这个属性能真实代表开关实际状态,所以要让设备在实际完成动作后,主动向云平台报告新状态。
这时我们就需要用到 下发命令,这是 ThingsCloud 支持的内置设备访问协议。
在云平台下发命令之前,我们同样在设备上需要先订阅如下主题,这里我们采用 MQTT.fx 客户端工具来模拟。
command/send/+
对于不支持 +
MQTT 通配符的设备,可以订阅如下主题:
command/send/1000
接下,我们在控制台中给设备提交一个下发命令,如下图:
命令就像是一个远程函数调用,它包含命令名称和参数,而这些都可以由我们来自定义。这里我们定义的命令名称是:
changeSwitch
参数是 JSON
格式,就像函数调用的参数一样,您可以将多个参数放在 JSON
结构中。这里我们发送的参数是:
{
"state": "ON"
}
提交成功后,我们会在设备上收到 MQTT 消息,如下图:
同时,在控制台的设备命令历史中,可以看到刚刚下发的命令详情,如下图:
云平台会记录所有下发给设备的命令,我们可以在控制台查看,或者通过 API 获取。