设备影子是什么
设备影子是物联网平台在云端维护的一份「设备状态副本」。设备在线时实时上报状态,云端影子同步更新;设备离线时,应用依然能读到它最后的状态,并能把新的配置写进影子,等设备上线后再同步给它。
没有影子时,应用查状态要先判断设备在不在线;有了影子,应用永远只跟云端的影子打交道,简单可靠。
设备影子 = 云的记忆,离线不失联。
- 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清字段。
- 订阅监听变化。
平台落地实践
主流物联网平台都内置设备影子:阿里云物联网平台叫设备影子,腾讯云 IoT 叫设备属性,AWS IoT 叫 Device Shadow。接入时先建产品、建设备,再用平台 SDK 读写影子。
自建影子用 Redis 存 JSON 文档最省事,版本号用自增计数,订阅通知走 MQTT 主题或 WebSocket。影子文档别存太大,超过几十 KB 就按字段拆。
小结与延伸阅读
设备影子让「云端看设备」和「设备看云端」都只跟一份状态文档打交道:desired 下发、reported 回报、version 防冲突。离线配置、状态查询、批量控制都变得简单可靠。
- MQTT 接入读《MQTT 安全与设备管理实战》。
- 平台选型读《物联网平台选型实战》。
- NB-IoT 优化读《NB-IoT 网络优化实战》。