使用Baidu IoT Edge SDK
用户可以在设备端安装百度智能云提供的SDK,并配置连接信息,实现设备与百度智能云物接入的快速对接。
有关IoT Edge SDK的下载和安装,请查看:https://github.com/baidu/iot-edge-sdk-for-iot-parser/releases/tag/v1.0.1
使用开源MQTT客户端SDK
如果设备端已经调用了Paho(即MQTT Client SDK),可以通过与特定的topic通信实现与百度智能云的对接。在物接入中定义了系统topic用于物接入服务和设备端基于物接入服务以及MQTT协议进行通信。
其中,clientID填写物影子名称。
更新设备状态到设备影子
将信息推送到主题'$baidu/iot/shadow/{deviceName}/update',可实现将设备状态更新到设备影子。
示例:
pub $baidu/iot/shadow/myDeviceName/update
{
"requestId": "{requestId}",
"reported": {
"memoryFree": "32MB",
"light": "green"
},
"desired": {
"rotate": 100
},
"profileVersion": 5,
"lastUpdatedTime": {
"reported": {
"light": 1494904250
},
"desired": {
"rotate": 1494904250
}
}
}
- "requestId"为请求的唯一标识符,每一个请求的requestId是唯一的,可随机生成。
- reported为可选字段,代表物影子中设备上报的最新状态。服务端能通过MQTT或HTTP从reported字段中拿到物影子的最新状态。
- desired为可选字段,代表控制端期望设备变换到的目标状态。设备端通过MQTT从desired字段中拿到某个属性的期望值(如”light”:”red"),就收到了控制端期望执行的操作,硬件即可执行相关操作。硬件执行相关操作后,应该把对应的值上报到reported字段上。用户可以通过判断repoeted与desired的差别来判断是否反控成功。
- “profileVersion”为可选字段,当未指定profileVersion时,物接入接收设备影子更新请求后,会将profileVersion自动加1;若指定profileVersion,物接入会检查请求中的profileVersion是否大于当前的profileVersion。只有在大于的情况,物接入才会接受设备端的请求,更新设备影子,并将profileVersion更新到相应的版本。
- "lastUpdatedTime"为可选字段,"lastUpdatedTime.reported"和"lastUpdatedTime.desired"中的时间表示属性("reported"和"desired")的更新时间,如果没有相应字段,则更新时间由系统时间决定。注意只有当相应位置的属性键值对存在于本次请求中,且请求更新时间为非负整数(毫秒为单位),相应的时间更新有效,无效的更新时间会被替换为系统时间。此外,若本次请求中属性的更新时间早于系统中该属性已存储的更新时间,则该属性的本次更新时间判断为过时,不予更新。
更新设备影子适用于两种应用场景:
- 设备同步状态到物接入服务。设备在状态发生变化时,将实时的状态同步到物接入服务,包括状态的自动变化以及设备反控后状态的变化。更新设备状态,通常更新"reported"字段中的相关属性。对于反控后更新状态,设备可以用实时状态同时更新该属性的“reported”和“desired”中的值。
- 通过MQTT协议反控设备状态。如果需要通过MQTT协议反控设备属性,可以通过更新"desired"字段实现。当物影子接收到"desired"相关属性的更新后,会diff设备影子中"reported"和“desired”相关字段,将diff后的结果发送到delta主题。设备端通过订阅delta主题,可将设备状态同步到“desired”的状态。状态反控后,更新设备影子,使"reported"和"desired"的值一致。物影子对设备的反控请参考通过设备影子控制设备状态。
订阅主题获取设备影子更新成功后的结果:
sub $baidu/iot/shadow/myDeviceName/update/accepted
{
"requestId": "{requestId}",
"reported": {
"firewareVersion": "1.0.0",
"light": "green"
},
"desired": {
"light": "red"
},
"lastUpdatedTime": {
"reported": {
"firewareVersion": 1494904250,
"light": 1494904250
},
"desired": {
"light": 1494904250
}
},
"profileVersion": 10
}
订阅主题获取设备影子更新失败后的结果:
sub $baidu/iot/shadow/myDeviceName/update/rejected
{
"requestId": "{requestId}",
"code": "{errorCode}",
"message": "{errorMessage}"
}
从设备影子获取设备状态
发送请求到主题'$baidu/iot/shadow/{deviceName}/get',可以获取该设备在设备影子中的所有状态信息。
示例:
pub $baidu/iot/shadow/myDeviceName/get
{
"requestId": "{requestId}"
}
订阅主题获取设备影子:
sub $baidu/iot/shadow/myDeviceName/get/accepted
{
"requestId": "{requestId}",
"reported": {
"firewareVersion": "1.0.0",
"light": "green"
},
"desired": {
"light": "red"
},
"lastUpdatedTime": {
"reported": {
"firewareVersion": 1494904250,
"light": 1494904250
},
"desired": {
"light": 1494904250
}
},
"profileVersion": 10
}
同时,可以订阅获取设备影子失败的相关消息:
sub $baidu/iot/shadow/myDeviceName/get/rejected
{
"requestId": "{requestId}",
"code": "{errorCode}",
"message": "{errorMessage}"
}
通过设备影子控制设备状态
控制端可以通过MQTT协议更新设备影子中的‘desired’字段,达到反控设备的目的。物影子在接受到‘desired’字段更新后,会比较'reported'和‘desired’之间的差异,并将diff结果发送到主题'$baidu/iot/shadow/{deviceName}/delta'。
例如,当前‘reported’中的‘light’字段为green,控制端将'desired'中的'light'字段更新为'red',此时物影子会通过delta主题反控设备:
sub $baidu/iot/shadow/myDeviceName/delta
{
"requestId": "{requestId}",
"desired": {
"light": "red"
}
}
若设备更新状态失败,可将相关错误信息发送到物影子:
pub $baidu/iot/shadow/myDeviceName/delta/rejected
{
"requestId": "{requestId}",
"code": "{errorCode}",
"message": "{errorMessage}"
}
清空设备影子
支持通过MQTT主题‘$baidu/iot/shadow/{deviceName}/delete’清空设备影子。
示例:
pub $baidu/iot/shadow/myDeviceName/delete
{
"requestId": "{requestId}"
}
通过订阅‘$baidu/iot/shadow/{deviceName}/delete/accepted’可以获取设备影子清空成功后的response。
sub $baidu/iot/shadow/myDeviceName/delete/accepted
{
"requestId": "{requestId}",
"reported": {
"firewareVersion": "1.0.0",
"light": "green"
},
"desired": {
"light": "red"
},
"lastUpdatedTime": {
"reported": {
"firewareVersion": 1494904250,
"light": 1494904250
},
"desired": {
"light": 1494904250
}
},
"profileVersion": 10
}
主题'$baidu/iot/shadow/{deviceName}/delete/rejected'推送清空设备影子失败后的相关信息
sub $baidu/iot/shadow/myDeviceName/delete/rejected
{
"requestId": "{requestId}",
"code": "{errorCode}",
"message": "{errorMessage}"
}
订阅设备影子的变化
可以通过主题"$baidu/iot/shadow/{deviceName}/update/documents"订阅设备影子中reported字段内容的变化。物接入在收到设备影子的update请求、并成功更新后,如果reported字段内容有变(变化条件包括:增加属性、减少属性、属性值有变化),会把reported字段中更新属性的当前值和更新前的值发送到“documents”主题。
示例:
sub $baidu/iot/shadow/{deviceName}/update/documents
{
"requestId": "{requestId}",
"profileVersion": 10,
"current": {
"light": "green"
},
"previous": {
"light": "red"
}
}
订阅设备快照
documents topic只反映了reported字段内容中发生变化的属性状态,如在reported字段内容变化时,需要订阅设备的全量的属性状态,可以通过主题"$baidu/iot/shadow/{deviceName}/update/snapshot"获取。该主题内容会包括shadow的reported字段的全部属性,此外还包含相应的lastUpdatedTime、profileVersion字段内容。
示例:
sub $baidu/iot/shadow/{deviceName}/update/snapshot
{
"requestId": "{requestId}",
"profileVersion": 10,
"reported": {
"light": "green"
},
"lastUpdatedTime": {
"reported": {
"light": 1494904250
}
}
}
Device Profile
Device Profile由Device Registry和Device Shadow两部分组成。
{
"name": "test", //设备名称
"id": "098f6bcd4621d373cade4e832627b4f6", //设备ID
"description": "测试设备", //设备描述
"state": "online", //设备状态,online/offline/unknown
"templateId": "123456", //设备模板ID
"templatedName": "TestTemplate", //设备模板名称
"createTime": 1494904250, //创建时间
"lastActiveTime": 149490300, //最后一次设备影子(reported)更新时间
"attributes": {
"region": "Shanghai" //设备Tag
},
"device": { //设备影子
"reported": {
"firewareVersion": "1.0.0",
"light": "green"
},
"desired": {
"light": "red"
},
"lastUpdatedTime": {
"reported": {
"firewareVersion": 1494904250,
"light": 1494904250
},
"desired": {
"light": 1494904250
}
},
"profileVersion": 10
}
}