设备影子是什么

设备影子是物联网平台在云端维护的一份「设备状态副本」。设备在线时实时上报状态,云端影子同步更新;设备离线时,应用依然能读到它最后的状态,并能把新的配置写进影子,等设备上线后再同步给它。

没有影子时,应用查状态要先判断设备在不在线;有了影子,应用永远只跟云端的影子打交道,简单可靠。

设备影子 = 云的记忆,离线不失联。
影子三要素
  • desired期望状态(云端写)。
  • reported实际状态(设备报)。
  • version版本号防冲突。
设备影子配图:设备方块与云朵轮廓之间夹着一个发光的影子方块,影子方块同时连向设备与云端,两侧有双向箭头
影子夹在设备与云之间,两边都只跟影子说话。

影子数据结构

影子文档是一段 JSON,包含 state 和 version 两层。state 里分 desired 与 reported,应用读影子拿整个文档,按字段判断该下发还是已同步。

{
  "state": {
    "desired": { "power": "on", "brightness": 80 },
    "reported": { "power": "on", "brightness": 60 }
  },
  "version": 12
}

状态上报同步

设备周期上报或变化上报,把最新状态写进 reported。平台合并字段并递增 version。应用订阅影子更新事件,实时感知设备状态变化。

// 设备端上报(伪代码)
publish('shadow/update', {
  reported: { power: 'on', brightness: 80 }
});

离线配置下发

设备离线时,应用把新配置写入 desired。设备上线后平台自动把 desired 推给它,设备应用后回写 reported,影子完成闭环。这样批量改配置不用管设备在不在线,一次写入全部生效。

注意:desired 与 reported 不一致,说明设备还没应用配置;一致说明同步完成。平台控制台直接展示差异,一眼看出哪些设备没跟上。

冲突与版本控制

影子更新带版本号:更新时带上当前 version,服务端比对,版本不符返回冲突错误。这样两个应用同时写影子不会互相覆盖。

版本控制是影子正确性的地基。更新影子时永远带 version,读到的 version 是多少就传多少,别省略。

更新影子
  • GET读全量影子。
  • UPDATE带版本写。
  • DELETE清字段。
  • 订阅监听变化。