Skip to content

实时状态控制台 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)
  1. 网关桥接: 业务后台处理设备遥测并评估业务规则(如温度过高报警)。
  2. 事件广播: 当触发报警或传感器数值跳变时,业务后台将实时状态写入 Redis。
  3. 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}