多人心率监测 WebSocket 实时同步服务。支持设备端上报心率数据,大屏监控端实时展示多人心率快照与历史统计。
syncpulse/
├── src/
│ ├── index.js # 应用入口,启动 HTTP 与 WebSocket 服务
│ ├── config.js # 集中配置管理(支持环境变量覆盖)
│ ├── routes/
│ │ └── http.js # HTTP 路由(静态页面 + REST API)
│ ├── services/
│ │ └── room.js # 房间管理核心逻辑
│ └── ws/
│ └── handler.js # WebSocket 消息处理
├── public/
│ ├── index.html # 设备端页面
│ └── dashboard.html # 大屏监控页面
├── Dockerfile
├── .dockerignore
├── .gitignore
├── package.json
└── README.md
# 克隆项目
git clone <repository-url>
cd syncpulse
# 安装依赖
npm install
# 启动开发服务器(支持热重载)
npm run dev
# 或生产模式启动
npm start
启动后访问:
| 页面 | 地址 |
|---|---|
| 设备端 | http://localhost:3000 |
| 大屏监控 | http://localhost:3000/dashboard |
# 运行容器
docker run -d \
--name syncpulse \
-p 3000:3000 \
--restart unless-stopped \
docker.cnb.cool/anyexyz/syncpulse:latest
services:
syncpulse:
ports:
- "3000:3000"
restart: unless-stopped
image: docker.cnb.cool/anyexyz/syncpulse:latest
所有配置通过环境变量设置:
| 变量 | 默认值 | 说明 |
|---|---|---|
PORT | 3000 | 服务监听端口 |
MAX_ROOM_AGE_HOURS | 6 | 房间历史数据保留时长(小时) |
AGGREGATOR_INTERVAL_MS | 1000 | 心率快照聚合推送间隔(毫秒) |
GET /api/history?roomId=<roomId>
响应示例:
{
"roomId": "room-abc",
"records": [
{ "userId": "u1", "userName": "Alice", "deviceName": "Apple Watch", "bpm": 72, "timestamp": 1714617600000 }
],
"count": 1
}
GET /api/history/stats?roomId=<roomId>
响应示例:
{
"roomId": "room-abc",
"totalRecords": 100,
"users": {
"u1": { "userName": "Alice", "count": 60, "minBpm": 62, "maxBpm": 95, "avgBpm": 74 }
}
}
| 类型 | 字段 | 说明 |
|---|---|---|
join_room | roomId, userId, userName, deviceName, userColor, role | 加入房间(role: device / dashboard) |
heart_rate | bpm | 上报心率数据 |
device_disconnected | userId | 设备断开通知 |
| 类型 | 说明 |
|---|---|
room_state | 加入房间后返回当前在线设备列表 |
user_joined | 新设备加入房间广播 |
user_left | 设备离开房间广播 |
device_disconnected | 设备断开连接广播 |
heartbeat_snapshot | 定时聚合的心率快照(仅 dashboard 接收) |
history_batch | 历史记录批量推送(dashboard 加入时) |
git checkout -b feature/my-featuregit commit -m 'Add some feature'git push origin feature/my-featureA: 当前版本所有数据存储在内存中,服务重启后数据会丢失。房间记录默认保留 6 小时后自动清理。如需持久化,建议自行接入数据库。
A: 通过环境变量 PORT 设置。Docker 部署时通过 -e PORT=8080 传入。
A: 请确认 Dashboard 加入房间时 role 字段设置为 dashboard,且 roomId 与设备端一致。