实时状态控制台 WebSocket 指南
WebSocket 服务主要用于向 Web 监控控制台 和 移动端 App 客户端 提供毫秒级的实时数据更新。本系统完全兼容 Pusher Channels Protocol 协议规范,使得开发者可以使用成熟的 Pusher 客户端 SDK 无缝接入。
1. 实时消息链路拓扑
整个实时数据通信链路中,设备上报的数据在业务后端被处理后,通过 Redis 发布/订阅(Pub/Sub)机制 跨服务器广播,最终由 WebSocket 服务器(基于 Reverb / Laravel 服务器)实时推送到所有在线订阅的客户端。
mermaid
sequenceDiagram
participant Device as IoT 终端设备
participant Broker as MQTT Broker
participant Core as 业务后台
participant Redis as Redis Pub/Sub
participant WSS as WebSocket Server
participant Web as Web 监控控制台
Device->>Broker: 1. 发布遥测数据 (MQTT)
Broker->>Core: 2. 推送遥测数据 (共享订阅)
Core->>Core: 3. 解析并校验报警阈值
Note over Core, Redis: 当触发报警或有新状态更新时
Core->>Redis: 4. 发布事件报文 (Publish)
Redis-->>WSS: 5. 跨节点广播消息 (Subscribe)
WSS-->>Web: 6. 实时推送状态更新 (WSS Wires)- 网关桥接: 业务后台处理设备遥测并评估业务规则(如温度过高报警)。
- 事件广播: 当触发报警或传感器数值跳变时,业务后台将实时状态写入 Redis。
- WSS 推送: WebSocket 服务器从 Redis 接收到新报文后,快速定位当前在线并已订阅对应私有通道的 WebSocket 连接,实施实时推送。
2. 通道分类规范 (Channels)
系统基于 Pusher 规范将实时推送划分为以下三类通道,并具备不同的鉴权策略:
2.1 公共通道 (Public Channels)
- 用途: 系统级全局广播。例如平台维护通知、全网设备故障公告。
- 安全要求: 免认证,任何建立 WebSocket 连接的客户端均可直接订阅。
- 通道命名示例:
public-system-announcements - 客户端代码:javascript
echo.channel('public-system-announcements') .listen('SystemAlert', (e) => { console.log('系统维护公告:', e.message); });
2.2 私有通道 (Private Channels)
- 用途: 针对特定设备的遥测数据和告警推送。
- 安全要求: 强制鉴权。客户端订阅时,必须发起 HTTP 请求到后端的鉴权接口(
/broadcasting/auth),网关验证 JWT 通过并签名后才允许订阅。 - 通道命名示例:
private-device.{device_id} - 客户端代码:javascript
echo.private('device.dev_f49b10a2') .listen('.TelemetryUpdated', (e) => { updateDashboard(e.metrics); // 渲染实时仪表盘 }) .listen('.DeviceAlarm', (e) => { triggerNotificationAlert(e); // 报警弹窗 });
2.3 存在通道 (Presence Channels)
- 用途: 追踪在线用户/设备。例如用于大屏幕控制台,实时查看目前有哪些运维工程师、技术支持人员在线监控。
- 安全要求: 强制鉴权。除具备私有通道特性外,还能感知通道内成员的上线(
joining)与离线(leaving)事件。 - 通道命名示例:
presence-room.{room_id}