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

2.6 KiB
Raw Blame History

任务003TCP通讯服务

目标

实现TCP长连接服务处理设备登录、签名验证、数据上报、指令下发。

技术栈

  • Rust + Tokio
  • TCP长连接

协议规范

通信规则

  • 长连接无需PING包
  • 空闲1分钟上报充电15秒上报
  • 超时5000ms
  • JSON去空格回车省流量LF处理粘包
  • dev_idIMEI10进制
  • sub_device_id485 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无合理理由