This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
JMS 透析机 TCP 联机服务 — 管理与监控多台 GC-110N 透析设备。基于持久 TCP 长连接 + 定时 K 轮询,实时采集 32 项治疗参数,通过 MQTT / 阿里云 IoT 上传,并提供 Web 监控大屏。
npm start # 启动联机服务 + Dashboard
index.js (入口)
├── lib/logger.js 日志(单文件 service.YYYY-MM-DD.log,30 天保留)
├── lib/data-cache.js 内存数据缓存(Map<ip, deviceData>),变更时通知监听者
├── lib/device-manager.js 管理所有设备的启停,遍历 config.devices 创建连接
│ └── lib/device-connection.js 单设备 TCP 长连接 + K 轮询 + 重连
│ └── lib/protocol.js GC-110N K 格式解析(无校验和、CRLF 切帧、顺序无关解析器)
├── lib/upload/index.js 上传总控(顺序执行 MQTT → 阿里云)
│ ├── lib/upload/mqtt-uploader.js MQTT 单例客户端,topic: {prefix}/{deviceNo}
│ ├── lib/upload/aliyun-uploader.js 阿里云 IoT SDK 设备实例池,postProps 上报
│ │ └── lib/upload/tuple-api.js HTTP 请求三元组 API(60s 失败冷却)
│ └── lib/upload/field-mapper.js GC-110N ID → 阿里云 identifier 映射
└── dashboard/server.js HTTP + WebSocket 服务,每 2s 推送快照
└── dashboard/public/index.html 监控大屏单页
DeviceManager.startAll() 遍历 config.devices,为每台启用设备创建 DeviceConnectionDeviceConnection 建立 TCP 长连接 → 发 K 请求 → 定时轮询DataCache → 调 UploadManager.upload()UploadManager 将 items 按中文名映射为阿里云字段,构建 payload,顺序上传 MQTT 和阿里云Dashboard 通过 WebSocket 每 2 秒推送全量快照(设备列表 + 汇总 + 上传状态)K + 4位statusCode + [单字母ID + 定宽值]... + CRLF\r\n 切包pollIntervalMs: K 轮询间隔(默认 10s)connectTimeoutMs: TCP 握手超时(手动计时,不用 socket timeout 以免切断长连接)reconnectBaseMs / reconnectMaxMs: 重连退避基数/上限devices: 设备列表(ip/port/serialNumber/enabled)mqtt.enabled / aliyun.enabled: 上传开关(默认禁用)→ 发送 K 请求← 收到 K 响应(含原始报文)✂ TCP 断开↻ 计划重连↑ 上传成功[mqtt/...] / [aliyun/...] 上传通道事件GC-110N 单字母 ID 到阿里云物模型 identifier,按中文名称对应。映射表见 lib/upload/field-mapper.js。新增字段需两边同步——阿里云侧需先在物模型 TSL 中添加对应 identifier。