跳转至

WebSocket API

本文引用的文件 - main.c - webui_server.c - webui_server.h - config.h - rest_api.c - rest_api.h - ble_gateway.h - index.html - devices.html - gw_mqtt.c

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排除指南
  9. 结论
  10. 附录

简介

本文件为 ESP32S3 BLE 网关的 WebSocket API 文档,目标是帮助开发者与集成商理解如何通过 WebSocket 实时接收 BLE 设备状态变化、系统状态变更以及错误通知。文档涵盖以下内容: - 连接建立流程(连接 URL、握手协议、认证方式) - 消息格式与实时数据推送机制 - 客户端连接示例与消息处理思路 - 心跳机制、重连策略与错误处理 - 消息队列管理与并发连接限制

需要特别说明的是:当前仓库中未发现 WebSocket 服务器或客户端实现代码。本文在不虚构现有实现的前提下,基于项目中已有的网络栈(HTTP/HTTPS、SPIFFS、MQTT)与配置信息,提供一套可落地的 WebSocket API 设计方案与接入指南,便于后续扩展。

项目结构

该项目采用 ESP-IDF 组件化架构,主要模块如下: - 应用入口与系统初始化:负责引导启动流程、网络模式选择、服务初始化等 - WebUI 服务器:提供静态页面与 REST API - REST API:提供状态查询、设备管理等接口 - 配置与硬件抽象:定义网络端口、LED 引脚、BLE 参数等 - MQTT 客户端:用于远程控制与状态上报 - BLE 网关接口:设备发现、连接、回调注册等

graph TB
A["应用入口<br/>main.c"] --> B["WebUI 服务器<br/>webui_server.c"]
B --> C["REST API 注册<br/>rest_api.c"]
A --> D["BLE 网关接口<br/>ble_gateway.h"]
A --> E["MQTT 客户端<br/>gw_mqtt.c"]
A --> F["全局配置<br/>config.h"]
B --> G["静态页面<br/>data/*.html"]

图表来源 - main.c - webui_server.c - rest_api.c - config.h - ble_gateway.h - gw_mqtt.c

章节来源 - main.c - webui_server.c - rest_api.c - config.h

核心组件

  • 全局配置(端口、网络参数等)
  • WebUI 默认端口:80
  • WebSocket 端口:81(预留)
  • 最大客户端数:4(WebUI)
  • WebUI 服务器
  • 基于 ESP-IDF httpd 启动,支持静态文件与 REST API
  • 提供 /api/status、/api/devices 等接口
  • REST API
  • 提供状态查询、设备列表、扫描控制等接口
  • BLE 网关接口
  • 设备结构体、扫描/连接/断开、设备回调注册等
  • MQTT 客户端
  • 支持鉴权、心跳、缓冲区大小等配置

章节来源 - config.h - webui_server.c - rest_api.c - ble_gateway.h - gw_mqtt.c

架构总览

下图展示从浏览器到 BLE 网关的整体数据流,包括 HTTP/WebSocket 接入层、BLE 状态采集层与消息分发层。

graph TB
subgraph "客户端"
W["浏览器/移动端"]
end
subgraph "接入层"
H["HTTP/HTTPS 服务器<br/>WebUI + REST API"]
WS["WebSocket 服务器<br/>待实现"]
end
subgraph "业务层"
BG["BLE 网关接口<br/>设备发现/连接"]
CFG["配置管理<br/>NVS/SPIFFS"]
end
subgraph "消息与状态"
MQ["MQTT 客户端<br/>远程控制/订阅"]
ST["系统状态<br/>内存/网络/设备数"]
end
W --> H
W --> WS
H --> BG
WS --> BG
BG --> ST
BG --> MQ
H --> CFG
WS --> CFG

图表来源 - webui_server.c - rest_api.c - ble_gateway.h - gw_mqtt.c - config.h

详细组件分析

WebSocket 连接与握手

  • 连接 URL
  • WebSocket 端点:ws://:81/ws
  • 若启用 TLS,则使用 wss://
  • 握手协议
  • 使用标准 WebSocket 协议,版本 13
  • 可选子协议:ble-status、gateway-events
  • 认证方式
  • 令牌认证:请求头 Authorization: Bearer
  • 或 Cookie 认证:登录后由 WebUI 会话维持
  • 并发连接限制
  • 建议最大连接数:4(与 WebUI 最大客户端一致)

章节来源 - config.h

消息格式与推送机制

  • 消息类型
  • 系统状态更新:包含网关标识、固件版本、运行时间、可用堆内存、网络连接状态、接口名、IP 地址、BLE 设备数量
  • BLE 设备事件:设备发现、连接/断开、RSSI 变化、广告数据片段
  • 错误通知:网络异常、BLE 初始化失败、MQTT 断线、存储空间不足
  • 消息队列管理
  • 使用环形缓冲队列或固定长度数组,按 FIFO 策略丢弃最旧消息以避免阻塞
  • 每个连接维护独立的发送队列,避免跨连接干扰
  • 实时推送触发条件
  • BLE 设备状态变化(发现/消失/连接/断开)
  • 系统资源阈值触发(低内存、网络切换)
  • MQTT/网络状态变化
sequenceDiagram
participant C as "客户端"
participant S as "WebSocket 服务器"
participant BG as "BLE 网关接口"
participant ST as "系统状态"
C->>S : "建立 WebSocket 连接"
S->>C : "握手成功,返回连接确认"
BG->>ST : "采集系统状态"
BG->>BG : "扫描/连接状态变更"
BG-->>S : "事件数据"
S-->>C : "实时推送消息"
C->>S : "心跳包"
S-->>C : "心跳响应"

图表来源 - ble_gateway.h - rest_api.c

客户端连接示例与消息处理

  • 连接示例(伪代码思路)
  • 使用浏览器原生 WebSocket API 或第三方库(如 Socket.IO)
  • 设置超时与重连逻辑(指数退避)
  • 订阅特定主题(如 ble-status),解析 JSON 消息
  • 消息处理建议
  • 对系统状态消息:更新 UI 状态卡
  • 对 BLE 事件消息:刷新设备列表与连接状态
  • 对错误消息:弹窗提示并记录日志

章节来源 - index.html - devices.html

心跳机制与重连策略

  • 心跳机制
  • 保活间隔:建议 30 秒
  • 心跳消息:{"type":"ping","timestamp":}
  • 服务端响应:{"type":"pong","timestamp":}
  • 重连策略
  • 初始延迟:1 秒,最大延迟:60 秒
  • 重连次数上限:10 次
  • 失败原因分类:网络不可达、认证失败、服务端拒绝
  • 资源保护
  • 连接过多时拒绝新连接,返回错误码 429 Too Many Requests

章节来源 - config.h

错误处理与告警

  • 常见错误
  • 连接被拒:401 未授权、403 禁止访问
  • 超时:602 网络超时、603 读取超时
  • 资源不足:604 内存不足、605 存储空间不足
  • 错误通知格式
  • {"type":"error","code":,"message":,"timestamp":}
  • 建议处理
  • 客户端记录错误并提示用户
  • 服务端记录日志并清理资源

章节来源 - webui_server.c

数据模型与字段说明

  • 系统状态对象
  • gateway_id:网关标识
  • firmware:固件版本
  • uptime:运行时间(秒)
  • heap_free:可用堆内存(字节)
  • network.connected:网络连接状态
  • network.ip:IP 地址
  • network.interface:活动接口名称
  • ble.devices:BLE 设备数量
  • BLE 设备对象
  • mac:设备 MAC 地址
  • name:设备名称
  • rssi:信号强度(dBm)
  • connected:是否已连接
  • last_seen:最后出现时间戳
  • adv_data:广告数据片段(最多 31 字节)
erDiagram
SYS_STATUS {
string gateway_id
string firmware
number uptime
number heap_free
boolean network_connected
string network_ip
string network_interface
number ble_devices
}
BLE_DEVICE {
string mac
string name
number rssi
boolean connected
number last_seen
bytes adv_data
}

图表来源 - rest_api.c - ble_gateway.h

依赖关系分析

  • 组件耦合
  • WebUI 服务器依赖 httpd 与 SPIFFS;REST API 依赖 cJSON 与网络管理
  • BLE 网关接口为纯接口定义,具体实现由底层驱动提供
  • MQTT 客户端与配置管理解耦,便于独立扩展
  • 外部依赖
  • ESP-IDF httpd、cJSON、nvs、spiffs、mqtt
  • 潜在循环依赖
  • 当前未发现直接循环依赖;若引入 WebSocket 服务器,需避免与 WebUI 互相依赖
graph LR
WS["webui_server.c"] --> HTTPD["ESP-IDF httpd"]
WS --> SPIFFS["SPIFFS"]
RA["rest_api.c"] --> HTTPD
RA --> CJSON["cJSON"]
BG["ble_gateway.h"] --> |接口| 底层驱动
MQ["gw_mqtt.c"] --> |配置| CFG["配置管理"]

图表来源 - webui_server.c - rest_api.c - gw_mqtt.c

章节来源 - webui_server.c - rest_api.c - gw_mqtt.c

性能考虑

  • 连接并发
  • 建议最大连接数不超过 4,避免抢占 CPU 与内存
  • 消息频率
  • BLE 事件按需推送,避免高频抖动;可合并同类型事件
  • 内存管理
  • 使用固定缓冲区与池化分配,减少碎片
  • 网络栈
  • WebUI 与 WebSocket 共享底层网络栈,注意优先级调度

故障排除指南

  • 无法连接
  • 检查 IP 与端口是否正确
  • 确认防火墙与路由器策略
  • 认证失败
  • 确认令牌有效性与过期时间
  • 检查会话是否过期
  • 心跳中断
  • 检查网络质量与 NAT 超时设置
  • 调整心跳间隔与超时阈值
  • 消息丢失
  • 检查队列容量与丢弃策略
  • 确认客户端消费速度

章节来源 - webui_server.c

结论

本文件提供了在现有 ESP32S3 BLE 网关基础上扩展 WebSocket API 的完整设计与实施指南。尽管当前仓库未包含 WebSocket 实现,但通过复用现有的 WebUI 与 REST API 模块,结合 BLE 网关接口与 MQTT 客户端,可以快速构建一套稳定、可扩展的实时通信能力。建议先完成 WebSocket 服务器的实现与测试,再逐步完善消息格式与错误处理机制。

附录

  • REST API 端点参考
  • GET /api/status:系统状态
  • GET /api/devices:BLE 设备列表
  • POST /api/devices/scan:开始/停止扫描
  • GET /api/config:获取配置
  • PUT /api/config:更新配置
  • 页面与交互
  • 仪表盘页面:周期性拉取 /api/status 更新状态卡
  • 设备页面:周期性拉取 /api/devices 更新设备表

章节来源 - rest_api.c - index.html - devices.html