跳至主要內容

向设备下发消息

约 1315 字大约 4 分钟

向设备下发消息

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

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

下发属性

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

在 ThingsCloud 中,设备属性既可以上报,也可以下发。

类似 温度湿度 这样的数值永远来自设备自身的感知,通过设备上报给云平台。

温度告警阈值 是由使用者或应用端来确定,通过云平台下发给设备。

还有 继电器开关 通常也是由云端下发到设备,实现照明、电机、水泵、风扇等负载的开关。

我们来实战一下如何从云平台下发属性数据到设备,以及设备如何实时接收。

提示

关于属性类型的详细介绍,请浏览 属性类型

下发数值属性

首先我们来完成一次从云端向设备下发数值类型的属性,我们在设备端使用 MQTT 接入协议实时接收云平台下发的消息。

在设备端订阅如下主题:

attributes/push

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

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

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

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

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

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

下发开关属性

接着,我们再来下发开关量属性。

开关量只有两个状态 ON 和 OFF,在 JSON 中表示为 truefalse

在控制台对设备的下发属性 JSON 中,我们让继电器1闭合、继电器2断开,如下图:

对于已存在的开关量类型属性,设备详情页概览中会在属性下方自动显示开关按钮,您也可以直接点击开关来完成属性下发。如下图:

下发命令

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

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

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

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

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

command/send/+

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

command/send/1000

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

下发命令
下发命令

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

changeSwitch

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

{
    "state": "ON"
}

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

下发命令
下发命令

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

下发命令
下发命令

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