编辑 | blame | 历史 | 原始文档

JH2028 新协议 TCP 网关服务

这是一个独立的新项目,用于适配设备厂商 2026-05-11 版 JH2028 对外接口通讯协议。

服务通过 TCP 接收串口透传盒子发来的数据,按来源 IP 匹配设备编号,解析新版 55 AA 协议帧,为每台设备缓存最后一次完整数据,并在收到实时数据或血压数据后立即上报到 MQTT 和/或阿里云。

老项目不参与本项目运行;本项目也不兼容旧版 EE 55 协议。

协议格式

新版帧格式:

55 AA LEN TT CMDTYPE CMDID CMDDATA CRC8

字段说明:

55 AA     固定帧头
LEN       帧总长度,包含帧头和 CRC
TT        发送序列号,仅记录,不回复
CMDTYPE   命令类型
CMDID     命令 ID
CMDDATA   命令数据
CRC8      从帧头开始计算的 CRC8 校验

当前支持的命令:

CMDTYPE=01 CMDID=00  设备实时数据
CMDTYPE=01 CMDID=01  血压数据

服务端不回复 ACK。多字节字段按 PDF 文档要求使用小端解析。

字段映射

实时数据 CMDTYPE=01, CMDID=00

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

N       收缩压
O       舒张压
P       心率
M       血压监测时间,使用服务端接收时间,格式 yyyy-mm-dd HH:mm:ss

以下字段不上传、不处理:

平均压
心率不齐
血压错误码

如果收到血压错误码报文,服务只记录日志,不更新缓存,不上报血压字段。

运行行为

每台设备都会维护一份最后状态缓存。

收到实时数据时:

1. 解码实时数据
2. 更新该设备缓存
3. 立即上传完整缓存

收到血压数据时:

1. 解码 N/O/P
2. 写入 M=服务端接收时间
3. 合并到该设备缓存
4. 立即上传完整缓存

上传失败只记录日志,不做补发。

配置说明

主配置文件是 config.json。打包后主要维护 runtime/config.json

大屏配置:

{
  "dashboard": {
    "enabled": true,
    "host": "0.0.0.0",
    "port": 9100,
    "title": "JH2028 设备中央监测大屏",
    "staleDataMs": 180000
  }
}

服务启动后,在浏览器打开:

本机访问:http://127.0.0.1:9100
局域网访问:http://服务器真实IP:9100

注意:0.0.0.0 只表示服务监听所有网卡,不是浏览器访问地址。不要在浏览器里打开 http://0.0.0.0:9100

大屏会展示设备在线/离线状态、数据是否超时、最近实时数据、最近血压数据和当前缓存指标。

设备按 TCP 来源 IP 匹配:

{
  "deviceId": "JH-001",
  "ip": "192.168.1.10",
  "name": "1号透析机"
}

上报通道通过 send.channels 控制:

{
  "send": {
    "channels": ["mqtt", "aliyun"]
  }
}

可选组合:

["mqtt"]           只上报 MQTT
["aliyun"]         只上报阿里云
["mqtt","aliyun"]  同时上报 MQTT 和阿里云

MQTT Topic 沿用老项目规则:

defaultTopicPrefix/deviceId

例如:

touxiji/JH-001

阿里云三元组获取规则也沿用老项目:

deviceName = deviceId

常用命令

安装依赖:

npm install

启动服务:

npm start

指定配置文件启动:

node app.js --config ./config.json

运行模拟器:

npm run start:simulator -- --host 127.0.0.1 --port 9000

# 如果只想发送一轮后断开:
npm run start:simulator:once -- --host 127.0.0.1 --port 9000

只打印模拟报文,不连接 TCP 服务:

npm run print:simulator

运行测试:

npm test
npm run verify

打包 Windows 和 Linux:

npm run build

只打包 Windows:

npm run build:win

只打包 Linux:

npm run build:linux

打包产物

打包后目录结构:

dist/
  win-x64/
    jh2028-service.exe
    runtime/
      config.json
      alModel.json
    logs/
  linux-x64/
    jh2028-service
    runtime/
      config.json
      alModel.json
    logs/

Windows 试运行:

cd dist\win-x64
.\jh2028-service.exe --config .\runtime\config.json

Linux 试运行:

cd dist/linux-x64
chmod +x ./jh2028-service
./jh2028-service --config ./runtime/config.json

联调建议

目前项目使用模拟报文完成了协议验证。因为暂时没有厂家真实报文,现场联调时建议优先向厂家确认或抓取以下报文:

实时数据正常报文 1 条
血压正常报文 1 条
包含负压力的实时数据报文 1 条
血压错误码报文 1 条

拿到真实报文后,建议先用 decoder.js 增加验证用例,确认 CRC8、小端、有符号数和单位换算全部一致,再部署到现场。