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

JHM 工程化服务说明

1. 项目目标

本项目用于接收设备通过 TCP 上报的原始报文,解析后转发到 MQTT、阿里云,或同时发送到两者。

当前已支持两类数据源协议:

  • 透析机主协议:EE 55 固定 8 字节帧
  • 血压计协议:AA 55 变长帧

2. 主流程

  1. tcp-service.js 监听 TCP 端口
  2. 根据客户端来源 IP 匹配 config.json 中的设备
  3. 将原始字节流交给 decoder.js
  4. decoder.js 自动识别协议并解析
  5. 生成最小指标对象
  6. app.js 根据 send.channels 发送到 MQTT、阿里云

3. 核心文件职责

  • app.js:启动入口、加载配置、初始化日志与发送通道
  • tcp-service.js:TCP 监听、设备匹配、连接管理
  • decoder.js:双协议解码
  • mqtt-service.js:MQTT 发布
  • aliyun-service.js:阿里云物联网属性上报
  • config.json:运行配置
  • alModel.json:指标模型

4. 当前支持协议

4.1 透析机协议

固定格式:

EE 55 NN XX1 XX2 XX3 XX4 CY

说明:

  • EE 55:包头
  • NN:命令字
  • XX1 XX2 XX3 XX4:4 字节数据区
  • CY:校验和

校验规则:

CY = (NN + XX1 + XX2 + XX3 + XX4) & 0xFF

4.2 血压计协议

示例:

AA 55 0E BA 00 78 50 59 08 08 08 08 08 10

字段说明:

  • AA 55:包头
  • 0E:整帧长度
  • BA:命令字
  • 00 78:收缩压,高字节在前
  • 50:舒张压
  • 59:脉搏
  • 后续 5 字节:时间字段
  • 最后 1 字节:校验和

校验规则:

校验和 = 从 AA 开始到最后一个数据字节的累加和,保留低 8 位

5. 血压计解析结果

当前血压计 0xBA 报文会一次生成一组指标:

{
  "N": 120,
  "O": 80,
  "P": 89,
  "M": "2026-04-15 09:30"
}

字段映射:

  • N:收缩压
  • O:舒张压
  • P:脉搏
  • M:血压监测时间

其中时间字段 M 由 5 个字节组装为:

20YY-MM-DD HH:mm

6. 血压时间字段开关

为了兼容现场平台暂时未接入 M 的情况,新增配置:

"protocol": {
  "alModelPath": "./alModel.json",
  "bloodPressure": {
    "publishTime": true
  }
}

规则:

  • publishTime: true:发布 N/O/P/M
  • publishTime: false:只发布 N/O/P
  • 未配置时默认按 true 处理

关闭后的血压计发布对象示例:

{
  "N": 120,
  "O": 80,
  "P": 89
}

7. alModel 对应关系

血压计新增指标需要在 alModel.json 中存在对应标识:

  • N:收缩压
  • O:舒张压
  • P:脉搏
  • M:血压监测时间

如果某个标识不在 alModel.json 中,解码器不会发布该字段。

8. 启动方式

安装依赖:

npm install

启动服务:

npm run start

验证命令:

npm test
npm run verify:commands

9. 当前实现结论

当前服务已经具备:

  • 原透析机协议解析
  • 血压计变长协议解析
  • 单连接混合协议流解析
  • alModel.json 过滤字段
  • 按配置选择是否发布血压时间 M
  • 转发到 MQTT、阿里云