全部产品
云市场

设备影子

更新时间:2019-02-27 19:57:32

功能介绍

如果开启高级版,推荐使用高级版物模型能力,已经提供了更完整的能力用于替代设备影子功能。

设备影子是一个 JSON 文档,用于存储设备上报状态、应用程序期望状态信息。

  • 每个设备有且只有一个设备影子,设备可以通过MQTT获取和设置设备影子以此来同步状态,该同步可以是影子同步给设备,也可以是设备同步给影子。
  • 应用程序通过物联网平台的SDK获取和设置设备影子,获取设备最新状态或者下发期望状态给设备。

具体影子的详细介绍见物联网平台/设备端开发指南/设备影子章节, https://help.aliyun.com/document_detail/53930.html

SDK使用

版本需求

Aliyun IoT Python SDK version >= 1.1.0

主动更新影子

通过thing_update_shadow 的接口可以更新影子状态

  1. reported = {"color":"red"}
  2. # reported - 上报的影子数据
  3. # version - 影子数据的版本号,例子中为1
  4. res = linkkit.thing_update_shadow(reported, 1)
  5. if res == 0:
  6. print('success')

该接口主要异步化向云平台上报影子数据。

执行结果将异步返回,可以通过设置回调函数on_thing_shadow_get 获得相关结果,范例如下:

  1. linkkit.on_thing_shadow_get = on_thing_shadow_get
  2. ...
  3. def on_thing_shadow_get(self, payload, userdata):
  4. print("on_thing_shadow_get:", payload)

如果影子设置成功,回调中payload对象数据如下:

  1. {
  2. "method": "reply",
  3. "payload": {
  4. "status": "success",
  5. "version": 1
  6. },
  7. "timestamp": 1544686266
  8. }

查询影子数据

通过thing_get_shadow的接口可以查询最新的影子数据,范例如下:

  1. res = linkkit.thing_get_shadow()
  2. if res == 0:
  3. print('success')

该接口主要异步化向云平台提交一个查询影子的请求,返回rc。rc为0标识请求成功, 可以在异步的回调函数中关联该id获取最终的结果。

执行结果将异步返回,可以通过设置回调函数on_thing_shadow_get 获得相关结果,范例如下:

  1. linkkit.on_thing_shadow_get = on_thing_shadow_get
  2. ...
  3. def on_thing_shadow_get(self, payload, userdata):
  4. print("on_thing_shadow_get:", payload)

对于正确的get操作,异步返回的on_thing_shadow_get回调中payload对象数据范例如下:

  1. {
  2. "method": "reply",
  3. "payload": {
  4. "status": "success",
  5. "state": {
  6. "reported": {
  7. "color": "red"
  8. }
  9. },
  10. "metadata": {
  11. "reported": {
  12. "color": {
  13. "timestamp": 1544701176
  14. }
  15. }
  16. }
  17. },
  18. "timestamp": 1544784614,
  19. "version": 1
  20. }

为了更方便的获取影子信息,SDK也会本地缓存一份/shadow/get/{pk}/{dn} topic里面的影子数据,可以通过local_get_latest_shadow来读取。

监听影子变更

影子的作用是允许云端去更新影子desired状态,设备端可以通过设置回调函数on_thing_shadow_get 获得desired状态的变更执行结果将异步返回,可以通过设置回调函数on_thing_shadow_get 获得相关结果,范例如下:

  1. linkkit.on_thing_shadow_get = on_thing_shadow_get
  2. ...
  3. def on_thing_shadow_get(self, payload, userdata):
  4. print("on_thing_shadow_get:", payload)

对于desired的变更, on_thing_shadow_get回调中payload对象数据范例如下:

  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": 1544701176
  17. }
  18. },
  19. "desired": {
  20. "color": {
  21. "timestamp": 1544702121
  22. }
  23. }
  24. }
  25. },
  26. "timestamp": 1544702121,
  27. "version": 3
  28. }