基于物影子快速搭建物联网应用

简介

本文档介绍了基于物接入快速搭建一个物联网应用的方式,帮助用户理解和使用物接入。阅读本示例前请先熟悉快速入门文档。

应用场景

一个智能设备(如智能家居设备)生产厂商,智能设备部署到各地,需要按照一定的频率回传状态数据。

应用端需要收到这些数据进行下一步消费。同时这些数据也需要用一个手机APP端实时查看。

云端创建设备影子

通过控制台或API创建物影子,每一个物影子就是一个连接到云端的实体设备。创建物影子时,每一个物影子都会生成一个连接用户名和密码,将该用户名密码的配置到设备端的连接程序中。

  • 如果使用MQTT开源SDK,则每个物影子有独立的MQTT连接,该用户名密码即作为MQTT连接的用户名密码,影子名称作为clientID。

  • 如果使用天工Edge SDK(下载地址:https://github.com/baidu/iot-edge-c-sdk),可以在如下路径中找到物接入的sample

并将如下位置,替换成要每个物影子生成的相对应的用户名、密码。

设备端发消息更新云端的物影子

如果使用物接入SDK,物接入设备型SDK已经封装好了更新物影子的函数 iotdm_client_update_shadow_with_binary,更新成功后,云端的物影子即更新了相应的值。对于物影子的操作,物接入不仅提供更新状态到物影子,还可以

  • 从物影子获取最新状态。
  • 通过物影子反控设备。
  • 获取本次物影子与上一次的变化。
  • 获取物影子的实时快照。

物接入设备型SDK都提供相应操作的封装函数,可以直接调用。物影子操作的相关介绍请参考:物影子操作

如果使用MQTT开源SDK,设备端按照生成的用户名密码连接云端后,可以向主题 $baidu/iot/shadow/{thingName}/update 发布消息。需要符合物影子的schema,具体详情请见:操作指南

其他功能,如从物影子获取最新状态、获取本次物影子与上一次的变化、获取物影子实时快照等操作也有相对应的mqtt主题,详情请参见操作指南

注意:
物影子名称是主题名称的一部分,如$baidu/iot/shadow/{thingName}/update,需要更新到设备端的代码中。
物影子生成的用户名密码,只能对该物影子进行操作,即只对该物影子的一系列主题有发布或订阅的权限。

设备端与云端通信(非更新物影子)

如果设备端除了更新物影子以外,还有其他的数据信息需要上传到云端。物接入提供自定义的主题,供用户使用。

  • define类主题,形如 $baidu/iot/define/{thingName}/#,用户可以在『#』处自定义字段,如$baidu/iot/define/{thingName}/abc/sys等。该主题的特点是,主题名中含有thingName(物影子名称)。物影子生成的用户名密码只能向该物影子发布和订阅消息,不能对其他物影子的define类主题发布和订阅消息。

  • general类主题,形如 $baidu/iot/general/#,用户可以在『#』处自定义字段,如$baidu/iot/general/alarm等。该主题的特点是,任意一个物影子的连接或者权限组的连接,都对该主题拥有订阅或发布权限,可以用于不同设备之间的通信。

应用服务消费设备的数据

用户的应用服务程序可以通过物接入的API接口,通过HTTP来获取设备的数据,如获取物影子实时数据等。

如果用户的应用服务程序需要实时订阅到物影子的变化,则可以通过MQTT的连接获取。

  • 物影子生成的用户名密码,同样可以在应用程序中连接到物接入,订阅与该物相关的主题,如$baidu/iot/shadow/{thingName}/update/accepted$baidu/iot/define/{thingName}/abc等,就可以实时订阅到设备端发到云端的消息。

  • 应用服务程序使用MQTT连接时需要注意:clientID不能是物影子名称。因为设备端的MQTT连接中的clientID是物影子名称,并以此来作为设备是否在线的判断标准,详情请参见:设备在线状态

  • 对于一个应用需要同时订阅多个设备的数据的情况,可以利用物接入设备型项目的权限管理来完成。物接入会为每一个权限组分配一个用户名密码,权限组可以添加多个设备,则这个权限组即拥有这多个设备的权限,包括物影子操作(shadow类主题)和物的自定义主题(define类主题)。一个业务应用用此权限组的用户名密码建立MQTT连接,即可以实时订阅该权限组里的设备的信息。