charging-cabinet/tasks/003-tcp-server.md
2026-07-02 05:38:01 +08:00

86 lines
2.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 任务003TCP通讯服务
## 目标
实现TCP长连接服务处理设备登录、签名验证、数据上报、指令下发。
## 技术栈
- Rust + Tokio
- TCP长连接
## 协议规范
### 通信规则
- 长连接无需PING包
- 空闲1分钟上报充电15秒上报
- 超时5000ms
- JSON去空格回车省流量LF处理粘包
- `dev_id`IMEI10进制
- `sub_device_id`485 ID
- `msg_id`自增会话ID
### 签名机制
- 设备首次连接调 `auth_str` 接口获取8位安全码仅一次
- `sign = SHA256(dev_id + auth_str + timestamp).substring(56, 63)`
- 时间戳秒级平台校验±60秒
### 接口清单
| 动作 | 方向 | 说明 |
|------|------|------|
| `login` | 设备→平台 | 登录需sign签名+timestamp |
| `auth_str` | 设备→平台 | 获取安全码(仅首次) |
| `off` | 双向 | 停止供电 |
| `status_post` | 设备→平台 | 定时状态上报rssi/status |
| `on` | 平台→设备 | 开始供电 |
| `open` | 平台→设备 | 开门错误码63=门锁故障) |
| `status_get` | 平台→设备 | 读取仓板状态 |
| `reset` | 平台→设备 | 设备重启 |
| `pow_fail` | 设备→平台 | 停电上报 |
## 实现要求
### TCP Server
- 监听端口3002可配置
- 连接管理:维护设备连接池
- 心跳检测5000ms超时断开
- 粘包处理LF分隔
### 登录流程
1. 设备发送 `{"act":"login","dev_id":"IMEI","msg_id":1,"timestamp":xxx,"sign":"xxx"}`
2. 平台验证签名
3. 验证通过 → 返回 `{"suc":1,"msg_id":1}`
4. 验证失败 → 返回 `{"suc":0,"err":"签名错误"}`
### 数据上报处理
- `status_post`解析status HEX数据存入Redis实时+ MySQL持久化
- `pow_fail`:记录停电日志
### 指令下发
- 提供API接口供HTTP服务调用
- 通过设备连接池下发指令
- 设备不在线时返回错误
## 项目结构
```
software/server/src/
├── tcp/
│ ├── mod.rs # TCP服务入口
│ ├── server.rs # TCP Server实现
│ ├── connection.rs # 连接管理
│ ├── protocol.rs # 协议解析
│ ├── handler.rs # 消息处理
│ └── commands.rs # 指令下发
```
## 质量约束
1. 完成代码后执行 `cargo check`,必须零报错、零警告
2. 分层拆分单函数≤80行命名语义化完整注释
3. 所有外部IO/网络请求异常捕获禁止裸panic
4. 分支逻辑全覆盖,不遗漏兜底分支
5. 常量抽离不使用废弃API
6. Rust内存安全合理管理所有权禁用unsafe无合理理由