# JH2028 新协议 TCP 网关服务 这是一个独立的新项目,用于适配设备厂商 2026-05-11 版 JH2028 对外接口通讯协议。 服务通过 TCP 接收串口透传盒子发来的数据,按来源 IP 匹配设备编号,解析新版 `55 AA` 协议帧,为每台设备缓存最后一次完整数据,并在收到实时数据或血压数据后立即上报到 MQTT 和/或阿里云。 老项目不参与本项目运行;本项目也不兼容旧版 `EE 55` 协议。 ## 协议格式 新版帧格式: ```text 55 AA LEN TT CMDTYPE CMDID CMDDATA CRC8 ``` 字段说明: ```text 55 AA 固定帧头 LEN 帧总长度,包含帧头和 CRC TT 发送序列号,仅记录,不回复 CMDTYPE 命令类型 CMDID 命令 ID CMDDATA 命令数据 CRC8 从帧头开始计算的 CRC8 校验 ``` 当前支持的命令: ```text CMDTYPE=01 CMDID=00 设备实时数据 CMDTYPE=01 CMDID=01 血压数据 ``` 服务端不回复 ACK。多字节字段按 PDF 文档要求使用小端解析。 ## 字段映射 实时数据 `CMDTYPE=01, CMDID=00`: ```text AF 设定温度,原始值 / 10 F 当前透析液温度,原始值 / 10 A 设定超滤总量,单位 mL C 超滤率,单位 mL/h B 超滤量,单位 mL K 剩余时间,单位分钟 L 透析液流量,单位 mL/min D 有效血流量,单位 mL/min H 静脉压,int16,单位 mmHg o 动脉压,int16,单位 mmHg J 跨膜压,int16,单位 mmHg U 累计血流量,单位 mL G 电导率,单位 mS/cm Na 钠,单位 mmol/L HCO3 碳酸氢根,单位 mmol/L O2Sat 血氧饱和度,原始值 / 10 Hct 红细胞比容,原始值 / 10 Hb 血红蛋白,原始值 / 10 Tblood 血液温度,原始值 / 10 ktv Kt/V,原始值 / 10 ``` 血压数据 `CMDTYPE=01, CMDID=01`: ```text N 收缩压 O 舒张压 P 心率 M 血压监测时间,使用服务端接收时间,格式 yyyy-mm-dd HH:mm:ss ``` 以下字段不上传、不处理: ```text 平均压 心率不齐 血压错误码 ``` 如果收到血压错误码报文,服务只记录日志,不更新缓存,不上报血压字段。 ## 运行行为 每台设备都会维护一份最后状态缓存。 收到实时数据时: ```text 1. 解码实时数据 2. 更新该设备缓存 3. 立即上传完整缓存 ``` 收到血压数据时: ```text 1. 解码 N/O/P 2. 写入 M=服务端接收时间 3. 合并到该设备缓存 4. 立即上传完整缓存 ``` 上传失败只记录日志,不做补发。 ## 配置说明 主配置文件是 `config.json`。打包后主要维护 `runtime/config.json`。 大屏配置: ```json { "dashboard": { "enabled": true, "host": "0.0.0.0", "port": 9100, "title": "JH2028 设备中央监测大屏", "staleDataMs": 180000 } } ``` 服务启动后,在浏览器打开: ```text 本机访问:http://127.0.0.1:9100 局域网访问:http://服务器真实IP:9100 ``` 注意:`0.0.0.0` 只表示服务监听所有网卡,不是浏览器访问地址。不要在浏览器里打开 `http://0.0.0.0:9100`。 大屏会展示设备在线/离线状态、数据是否超时、最近实时数据、最近血压数据和当前缓存指标。 设备按 TCP 来源 IP 匹配: ```json { "deviceId": "JH-001", "ip": "192.168.1.10", "name": "1号透析机" } ``` 上报通道通过 `send.channels` 控制: ```json { "send": { "channels": ["mqtt", "aliyun"] } } ``` 可选组合: ```text ["mqtt"] 只上报 MQTT ["aliyun"] 只上报阿里云 ["mqtt","aliyun"] 同时上报 MQTT 和阿里云 ``` MQTT Topic 沿用老项目规则: ```text defaultTopicPrefix/deviceId ``` 例如: ```text touxiji/JH-001 ``` 阿里云三元组获取规则也沿用老项目: ```text deviceName = deviceId ``` ## 常用命令 安装依赖: ```powershell npm install ``` 启动服务: ```powershell npm start ``` 指定配置文件启动: ```powershell node app.js --config ./config.json ``` 运行模拟器: ```powershell npm run start:simulator -- --host 127.0.0.1 --port 9000 # 如果只想发送一轮后断开: npm run start:simulator:once -- --host 127.0.0.1 --port 9000 ``` 只打印模拟报文,不连接 TCP 服务: ```powershell npm run print:simulator ``` 运行测试: ```powershell npm test npm run verify ``` 打包 Windows 和 Linux: ```powershell npm run build ``` 只打包 Windows: ```powershell npm run build:win ``` 只打包 Linux: ```powershell npm run build:linux ``` ## 打包产物 打包后目录结构: ```text dist/ win-x64/ jh2028-service.exe runtime/ config.json alModel.json logs/ linux-x64/ jh2028-service runtime/ config.json alModel.json logs/ ``` Windows 试运行: ```powershell cd dist\win-x64 .\jh2028-service.exe --config .\runtime\config.json ``` Linux 试运行: ```bash cd dist/linux-x64 chmod +x ./jh2028-service ./jh2028-service --config ./runtime/config.json ``` ## 联调建议 目前项目使用模拟报文完成了协议验证。因为暂时没有厂家真实报文,现场联调时建议优先向厂家确认或抓取以下报文: ```text 实时数据正常报文 1 条 血压正常报文 1 条 包含负压力的实时数据报文 1 条 血压错误码报文 1 条 ``` 拿到真实报文后,建议先用 `decoder.js` 增加验证用例,确认 CRC8、小端、有符号数和单位换算全部一致,再部署到现场。