Files
xiaozhi-esp32-server/main/mqtt-gateway/README.md
T
2025-07-05 13:47:49 +09:30

216 lines
4.9 KiB
Markdown

# MQTT+UDP 到 WebSocket 桥接服务
## 项目概述
这是一个用于物联网设备通信的桥接服务,实现了MQTT和UDP协议到WebSocket的转换。该服务允许设备通过MQTT协议进行控制消息传输,同时通过UDP协议高效传输音频数据,并将这些数据桥接到WebSocket服务。
## 功能特点
- **多协议支持**: 同时支持MQTT、UDP和WebSocket协议
- **音频数据传输**: 专为音频数据流优化的传输机制
- **加密通信**: 使用AES-128-CTR加密UDP数据传输
- **会话管理**: 完整的设备会话生命周期管理
- **自动重连**: 连接断开时自动重连机制
- **心跳检测**: 定期检查连接活跃状态
- **开发/生产环境配置**: 支持不同环境的配置切换
## 技术架构
- **MQTT服务器**: 处理设备控制消息
- **UDP服务器**: 处理高效的音频数据传输
- **WebSocket客户端**: 连接到聊天服务器
- **桥接层**: 在不同协议间转换和路由消息
## 项目结构
```
├── app.js # 主应用入口
├── mqtt-protocol.js # MQTT协议实现
├── ecosystem.config.js # PM2配置文件
├── package.json # 项目依赖
├── .env # 环境变量配置
├── utils/
│ ├── config-manager.js # 配置管理工具
│ ├── mqtt_config_v2.js # MQTT配置验证工具
│ └── weixinAlert.js # 微信告警工具
└── config/ # 配置文件目录
```
## 依赖项
- **debug**: 调试日志输出
- **dotenv**: 环境变量管理
- **ws**: WebSocket客户端
- **events**: Node.js 事件模块
## 安装要求
- Node.js 14.x 或更高版本
- npm 或 yarn 包管理器
- PM2 (用于生产环境部署)
## 安装步骤
1. 克隆仓库
```bash
git clone <仓库地址>
cd mqtt-websocket-bridge
```
2. 安装依赖
```bash
npm install
```
3. 创建配置文件
```bash
mkdir -p config
cp config/mqtt.json.example config/mqtt.json
```
4. 编辑配置文件 `config/mqtt.json`,设置适当的参数
## 配置说明
配置文件 `config/mqtt.json` 需要包含以下内容:
```json
{
"debug": false,
"development": {
"mac_addresss": ["aa:bb:cc:dd:ee:ff"],
"chat_servers": ["wss://dev-chat-server.example.com/ws"]
},
"production": {
"chat_servers": ["wss://chat-server.example.com/ws"]
}
}
```
## 环境变量
创建 `.env` 文件并设置以下环境变量:
```
MQTT_PORT=1883 # MQTT服务器端口
UDP_PORT=8884 # UDP服务器端口
PUBLIC_IP=your-ip # 服务器公网IP
```
## 运行服务
### 开发环境
```bash
# 直接运行
node app.js
# 调试模式运行
DEBUG=mqtt-server node app.js
```
### 生产环境 (使用PM2)
```bash
# 安装PM2
npm install -g pm2
# 启动服务
pm2 start ecosystem.config.js
# 查看日志
pm2 logs xz-mqtt
# 监控服务
pm2 monit
```
服务将在以下端口启动:
- MQTT 服务器: 端口 1883 (可通过环境变量修改)
- UDP 服务器: 端口 8884 (可通过环境变量修改)
## 协议说明
### 设备连接流程
1. 设备通过MQTT协议连接到服务器
2. 设备发送 `hello` 消息,包含音频参数和特性
3. 服务器创建WebSocket连接到聊天服务器
4. 服务器返回UDP连接参数给设备
5. 设备通过UDP发送音频数据
6. 服务器将音频数据转发到WebSocket
7. WebSocket返回的控制消息通过MQTT发送给设备
### 消息格式
#### Hello 消息 (设备 -> 服务器)
```json
{
"type": "hello",
"version": 3,
"audio_params": { ... },
"features": { ... }
}
```
#### Hello 响应 (服务器 -> 设备)
```json
{
"type": "hello",
"version": 3,
"session_id": "uuid",
"transport": "udp",
"udp": {
"server": "server-ip",
"port": 8884,
"encryption": "aes-128-ctr",
"key": "hex-encoded-key",
"nonce": "hex-encoded-nonce"
},
"audio_params": { ... }
}
```
## 安全说明
- UDP通信使用AES-128-CTR加密
- 每个会话使用唯一的加密密钥
- 使用序列号防止重放攻击
- 设备通过MAC地址进行身份验证
- 支持设备分组和UUID验证
## 性能优化
- 使用预分配的缓冲区减少内存分配
- UDP协议用于高效传输音频数据
- 定期清理不活跃的连接
- 连接数和活跃连接数监控
- 支持多聊天服务器负载均衡
## 故障排除
- 检查设备MAC地址格式是否正确
- 确保UDP端口在防火墙中开放
- 启用调试模式查看详细日志
- 检查配置文件中的聊天服务器地址是否正确
- 验证设备认证信息是否正确
## 开发指南
### 添加新功能
1. 修改 `mqtt-protocol.js` 以支持新的MQTT功能
2.`MQTTConnection` 类中添加新的消息处理方法
3. 更新配置管理器以支持新的配置选项
4.`WebSocketBridge` 类中添加新的WebSocket处理逻辑
### 调试技巧
```bash
# 启用所有调试输出
DEBUG=* node app.js
# 只启用MQTT服务器调试
DEBUG=mqtt-server node app.js
```