监控离线与电源事件
适用场景
适用于后端更新设备可用性、产生告警或记录设备支持的供电变化信号,同时避免反复轮询设备状态。
device.connection.online和device.connection.offline表示连接状态变化。device.power.lost表示设备上报了断电信号。device.power.restored表示设备上报了供电恢复信号,但不代表网络连接已经恢复。- 不同设备类型不一定具有相同的电源检测能力。对产品承诺电源告警前,应检查设备类型定义和交付的设备文档;没有明确记录该能力时,不能推断为支持。
推荐流程
WebSocket 提供及时通知,但不是永久状态来源。当前状态应保存在你的服务中;发生事件缺口后,通过 REST 恢复。
分步骤实现
- 使用查询设备列表建立账号的初始状态。
- 开启电源相关 UI 或告警前,检查设备类型定义列表和交付的设备文档。通用操作列表不能证明设备支持电源检测。
- 创建 WebSocket Ticket,建立连接,并启动协议 Ping/Pong 与
session.ping。 - 收到
device.connection.offline后,停止把设备展示为可控制状态,并记录occurredAt。 - 收到
device.connection.online后,更新连接状态,但不要假定外设数据已经完成同步。需要当前状态时再刷新单台设备。 - 收到
device.power.lost后持久化并触发告警;收到device.power.restored后可以结束电源告警,但应等待device.connection.online后再恢复可控制状态。 - 电源事件只使用结构化 topic 和时间字段,不要解析固件原始文本或据此做程序分支。
- 重连后使用 REST 恢复账号状态基线,只立即确认关键设备。
关键接口与事件
| 用途 | 文档 |
|---|---|
| 当前账号状态基线 | 查询设备列表 |
| 确认单台设备 | 查询设备详情 |
| 在线和离线事件 | 设备连接事件 |
| 断电与上电事件语义 | 设备电源事件 |
| 心跳与恢复 | 心跳与重连 |
失败与恢复策略
- 检测连接关闭和心跳超时,使用有上限的指数退避和随机抖动重连。
- 不要复用
wsTicket;每次尝试建连前都创建新 ticket。 - 事件不会补发。重连后应重建当前状态,而不是假设断线期间没有事件。
- 重试或重连边界可能出现重复处理。使用已有的 topic、
deviceId、时间字段和最终状态实现幂等,不要依赖事件契约中不存在的字段。 - 电源与连接事件不保证顺序,也可能只有其中一类到达。不要从
online/offline推导供电变化。
生产环境注意事项
- 分别保存事件接收时间和设备的
occurredAt,便于观测延迟。 - 设计告警抑制和恢复规则,避免重连抖动产生重复事件单。
- 将 WebSocket 作为实时更新通道,将 REST 作为状态恢复路径。
- 设备接入时确认电源检测能力,不要因为其他设备类型支持就直接推断当前设备支持。
