# 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 透析机协议 固定格式: ```text EE 55 NN XX1 XX2 XX3 XX4 CY ``` 说明: - `EE 55`:包头 - `NN`:命令字 - `XX1 XX2 XX3 XX4`:4 字节数据区 - `CY`:校验和 校验规则: ```text CY = (NN + XX1 + XX2 + XX3 + XX4) & 0xFF ``` ### 4.2 血压计协议 示例: ```text AA 55 0E BA 00 78 50 59 08 08 08 08 08 10 ``` 字段说明: - `AA 55`:包头 - `0E`:整帧长度 - `BA`:命令字 - `00 78`:收缩压,高字节在前 - `50`:舒张压 - `59`:脉搏 - 后续 5 字节:时间字段 - 最后 1 字节:校验和 校验规则: ```text 校验和 = 从 AA 开始到最后一个数据字节的累加和,保留低 8 位 ``` ## 5. 血压计解析结果 当前血压计 `0xBA` 报文会一次生成一组指标: ```json { "N": 120, "O": 80, "P": 89, "M": "2026-04-15 09:30" } ``` 字段映射: - `N`:收缩压 - `O`:舒张压 - `P`:脉搏 - `M`:血压监测时间 其中时间字段 `M` 由 5 个字节组装为: ```text 20YY-MM-DD HH:mm ``` ## 6. 血压时间字段开关 为了兼容现场平台暂时未接入 `M` 的情况,新增配置: ```json "protocol": { "alModelPath": "./alModel.json", "bloodPressure": { "publishTime": true } } ``` 规则: - `publishTime: true`:发布 `N/O/P/M` - `publishTime: false`:只发布 `N/O/P` - 未配置时默认按 `true` 处理 关闭后的血压计发布对象示例: ```json { "N": 120, "O": 80, "P": 89 } ``` ## 7. alModel 对应关系 血压计新增指标需要在 `alModel.json` 中存在对应标识: - `N`:收缩压 - `O`:舒张压 - `P`:脉搏 - `M`:血压监测时间 如果某个标识不在 `alModel.json` 中,解码器不会发布该字段。 ## 8. 启动方式 安装依赖: ```powershell npm install ``` 启动服务: ```powershell npm run start ``` 验证命令: ```powershell npm test npm run verify:commands ``` ## 9. 当前实现结论 当前服务已经具备: - 原透析机协议解析 - 血压计变长协议解析 - 单连接混合协议流解析 - 按 `alModel.json` 过滤字段 - 按配置选择是否发布血压时间 `M` - 转发到 MQTT、阿里云