全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件
阿里云物联网套件

设备影子数据流

更新时间:2017-12-06 11:20:55

设备影子topic

  • IoT套件为每个设备预定义了两个Topic实现数据流转,定义的Topic都以固定格式呈现。
  • /shadow/update/${productKey}/${deviceName}
  • 设备和应用程序发布消息到此Topic,套件收到该topic的消息后会将消息中的状态更新到设备影子中。
  • /shadow/get/${productKey}/${deviceName}
  • 设备影子会更新状态到该Topic,设备订阅此Topic的消息。

示例:

  • 接下来以产品灯泡1号下面某个具体灯泡这个设备为例,productkey:10000;deviceName:lightbulb,设备以QoS=1发布订阅定义的两个Topic,举例说明设备,设备影子以及应用程序之间的通信。

设备主动上报状态:

  • 处理流程图reported_flow

  • 当灯泡lightbulb联网时,上报状态,它将向/shadow/update/10000/lightbulb这个Topic发送消息。发送的JSON消息格式:

  1. {
  2. "method": "update",
  3. "state": {
  4. "reported": {
  5. "color": "red"
  6. }
  7. },
  8. "version": 1
  9. }
method 表示设备或者应用程序对请求设备影子的操作类型,设备影子更新完之后的返回类型。当设备或者应用程序在更新状态的时候,固定为”update”,必填字段
state 包含设备发送给shadow的具体状态。在上报状态中,reported为必须字段,包含汇报的设备状态信息,这些信息会同步到设备影子文档中的reported部分
version 设备影子会检查请求中的version是否大于当前的version。只有在大于的情况,设备影子才会接受设备端的请求,更新设备影子,并将version更新到相应的版本
  • 当设备影子接受到灯泡上报状态时,成功更新影子文档
  1. {
  2. "state" : {
  3. "reported" : {
  4. "color" : "red"
  5. }
  6. },
  7. "metadata" : {
  8. "reported" : {
  9. "color" : {
  10. "timestamp" : 1469564492
  11. }
  12. }
  13. },
  14. "timestamp" : 1469564492,
  15. "version" : 1
  16. }
  • 更新设备影子之后,设备影子会返回结果给设备(灯泡),即发消息到/shadow/get/10000/lightbulb中,设备订阅该Topic。
  • 若更新成功,发送到Topic中的消息为:
  1. {
  2. "method":"reply",
  3. "payload": {
  4. "status":"success",
  5. "version": 1
  6. },
  7. "timestamp": 1469564576
  8. }
  • 若更新失败,发送到Topic中的消息为:
  1. {
  2. "method":"reply",
  3. "payload": {
  4. "status":"error",
  5. "content": {
  6. "errorcode": "${errorcode}",
  7. "errormessage": "${errormessage}"
  8. }
  9. },
  10. "timestamp": 1469564576
  11. }
errorCode errorMessage
400 不正确的json格式
401 影子json缺少method信息
402 影子json缺少state字段
403 影子json version不是数字
404 影子json缺少reported字段
405 影子json reported属性字段为空
406 影子json method是无效的方法
407 影子内容为空
408 影子reported属性个数超过128个
409 影子版本冲突
500 服务端处理异常

应用程序改变设备状态:

  • 处理流程图:desired_flow

  • 应用程序下发指令给设备影子,进而更改灯泡状态。应用程序发消息到Topic: /shadow/update/10000/lightbulb/中,消息如下:

  1. {
  2. "method": "update",
  3. "state": {
  4. "desired": {
  5. "color": "green"
  6. }
  7. },
  8. "version": 2
  9. }
  • 当应用程序发出更新请求,设备影子会更新其文档,那么影子文档将变为:
  1. {
  2. "state" : {
  3. "reported" : {
  4. "color" : "red"
  5. },
  6. "desired" : {
  7. "color" : "green"
  8. }
  9. },
  10. "metadata" : {
  11. "reported" : {
  12. "color" : {
  13. "timestamp" : 1469564492
  14. }
  15. },
  16. "desired" : {
  17. "color" : {
  18. "timestamp" : 1469564576
  19. }
  20. }
  21. },
  22. "timestamp" : 1469564576,
  23. "version" : 2
  24. }
  • 更新设备影子之后,设备影子会返回结果给设备(灯泡),即发消息到/shadow/get/10000/lightbulb中,这返回的消息由设备影子决定其构成.
  1. {
  2. "method":"control",
  3. "payload": {
  4. "status":"success",
  5. "state": {
  6. "reported": {
  7. "color": "red"
  8. },
  9. "desired": {
  10. "color": "green"
  11. }
  12. },
  13. "metadata": {
  14. "reported": {
  15. "color": {
  16. "timestamp": 1469564492
  17. }
  18. },
  19. "desired" : {
  20. "color" : {
  21. "timestamp" : 1469564576
  22. }
  23. }
  24. }
  25. },
  26. "version": 2,
  27. "timestamp": 1469564576
  28. }
  • 如果此时灯泡在线,并且订阅了Topic:/shadow/get/10000/lightbulb,就会收到消息,并根据desired文档的值更新状态(当然也可以选择不更新,例如有时间戳判断指令过期),将灯泡颜色变成绿色,更新完之后,上报最新状态,发消息到Topic:/shadow/update/10000/lightbulb中,消息如下:
  1. {
  2. "method": "update",
  3. "state": {
  4. "desired":"null"
  5. },
  6. "version": 3
  7. }
  • 上报状态之后,设备影子会同步更新,此时的影子文档如下:
  1. {
  2. "state" : {
  3. "reported" : {
  4. "color" : "green"
  5. }
  6. },
  7. "metadata" : {
  8. "reported" : {
  9. "color" : {
  10. "timestamp" : 1469564577
  11. }
  12. },
  13. "desired" : {
  14. "timestamp" : 1469564576
  15. }
  16. },
  17. "version" : 3
  18. }

设备主动获取设备影子内容:

  • 处理流程图:get_flow

  • 灯泡想要获取设备影子中保存的灯泡最新状态,先发一个固定消息到Topic: /shadow/update/10000/lightbulb中,具体的消息如下:

  1. {
  2. "method": "get"
  3. }
  • 当设备影子收到这条消息时,会发消息到/shadow/get/10000/lightbulb中,灯泡订阅该Topic,获得消息, 消息内容如下:
  1. {
  2. "method":"reply",
  3. "payload": {
  4. "status":"success",
  5. "state": {
  6. "reported": {
  7. "color": "red"
  8. },
  9. "desired": {
  10. "color": "green"
  11. }
  12. },
  13. "metadata": {
  14. "reported": {
  15. "color": {
  16. "timestamp": 1469564492
  17. }
  18. },
  19. "desired": {
  20. "color": {
  21. "timestamp": 1469564492
  22. }
  23. }
  24. }
  25. },
  26. "version": 2,
  27. "timestamp": 1469564576
  28. }

设备端删除影子属性

  • 处理流程图:delete_shadow
  • 灯泡想要删除设备影子中保存的灯泡某条属性状态,发送删除影子属性的json内容到Topic: /shadow/update/10000/lightbulb中,具体的消息如下:
  1. 删除影子某一属性shadow json格式
  2. {
  3. "method": "delete",
  4. "state": {
  5. "reported": {
  6. "color": "null",
  7. "temperature":"null"
  8. }
  9. },
  10. "version": 1
  11. }
  12. 删除影子全部属性的shadow json格式
  13. {
  14. "method": "delete",
  15. "state": {
  16. "reported":"null"
  17. },
  18. "version": 1
  19. }
  • 删除属性只需要把method置为”delete”,并且属性的值设置为”null”即可。
本文导读目录