| | |
| | | |
| | | ## 1. 目标 |
| | | |
| | | 本文档用于指导 JHM 服务在生产环境中部署、配置和联调。 |
| | | 本文档用于指导 JHM 服务在生产环境中的打包、部署、配置、联调和验收。 |
| | | |
| | | 当前服务支持: |
| | | 当前服务能力包括: |
| | | |
| | | - 透析机 `EE 55` 固定帧协议 |
| | | - 血压计 `AA 55` 变长协议 |
| | | - 透析机 `EE 55` 固定帧协议解析 |
| | | - 血压计 `AA 55` 变长协议解析 |
| | | - MQTT 上报 |
| | | - 阿里云上报 |
| | | - 阿里云物模型上报 |
| | | - 批量聚合发送 |
| | | - 血压触发的整包立即发送 |
| | | |
| | | ## 2. 打包产物 |
| | | |
| | | 执行: |
| | | 在项目根目录执行: |
| | | |
| | | ```bash |
| | | ```powershell |
| | | npm run build |
| | | ``` |
| | | |
| | | 生成目录: |
| | | 如果只需要 Windows 包: |
| | | |
| | | ```powershell |
| | | npm run build:win |
| | | ``` |
| | | |
| | | 如果只需要 Linux 包: |
| | | |
| | | ```powershell |
| | | npm run build:linux |
| | | ``` |
| | | |
| | | 打包完成后生成目录: |
| | | |
| | | ```text |
| | | dist/ |
| | | 生产实施部署文档.md |
| | | win-x64/ |
| | | jhm-service.exe |
| | | 生产实施部署文档.md |
| | | runtime/ |
| | | config.json |
| | | alModel.json |
| | | 生产实施部署文档.md |
| | | logs/ |
| | | service/ |
| | | install-service.ps1 |
| | | uninstall-service.ps1 |
| | | linux-x64/ |
| | | jhm-service |
| | | 生产实施部署文档.md |
| | | runtime/ |
| | | config.json |
| | | alModel.json |
| | | 生产实施部署文档.md |
| | | logs/ |
| | | service/ |
| | | install-service.sh |
| | | uninstall-service.sh |
| | | jhm-service.service.tpl |
| | | ``` |
| | | |
| | | 说明: |
| | | |
| | | - `runtime/` 是现场主要维护目录。 |
| | | - `logs/` 为运行日志目录。 |
| | | - `service/` 为系统服务安装脚本模板。 |
| | | - 打包脚本会先清理旧的 `build/` 和 `dist/` 目录。 |
| | | |
| | | ## 3. 部署前检查 |
| | | |
| | | 部署前确认: |
| | | 部署前确认以下信息已准备完成: |
| | | |
| | | - 目标服务器 IP、系统、开放端口 |
| | | - 设备透传盒目标 TCP 地址和端口 |
| | | - `devices[].ip` 与现场实际来源 IP 一致 |
| | | - MQTT 或阿里云连接参数已准备完成 |
| | | - 目标服务器操作系统和架构是否正确 |
| | | - 目标服务器开放了业务监听端口 |
| | | - 透传盒子目标 TCP 地址和端口已配置正确 |
| | | - `devices[].ip` 与服务端实际看到的设备来源 IP 一致 |
| | | - MQTT 或阿里云连接参数已确认可用 |
| | | - `alModel.json` 与平台物模型保持一致 |
| | | - 现场是否需要血压时间字段 `M` |
| | | - 现场是否需要“血压触发整包立即发送” |
| | | |
| | | ## 4. 配置文件说明 |
| | | |
| | | 主要修改文件: |
| | | 主要配置文件: |
| | | |
| | | ```text |
| | | runtime/config.json |
| | | ``` |
| | | |
| | | 当前推荐结构: |
| | | 推荐配置结构如下: |
| | | |
| | | ```json |
| | | { |
| | | "send": { |
| | | "mode": "batch", |
| | | "flushIntervalMs": 60000, |
| | | "alignToMinute": true, |
| | | "includeDeviceIdField": true, |
| | | "deviceIdField": "n", |
| | | "publishOnShutdown": true, |
| | | "channels": ["aliyun"] |
| | | }, |
| | | "logging": { |
| | |
| | | "protocol": { |
| | | "alModelPath": "./alModel.json", |
| | | "bloodPressure": { |
| | | "publishTime": true |
| | | "publishTime": true, |
| | | "flushImmediately": true |
| | | } |
| | | }, |
| | | "devices": [ |
| | | { |
| | | "deviceId": "JHM-001", |
| | | "ip": "192.168.33.1", |
| | | "ip": "169.254.233.58", |
| | | "name": "1号透析机" |
| | | } |
| | | ] |
| | |
| | | |
| | | ### 4.1 `send` |
| | | |
| | | - `channels`:可选 `mqtt`、`aliyun` |
| | | - `mode`:发送模式,支持 `batch` 和 `immediate` |
| | | - `flushIntervalMs`:批量发送周期,单位毫秒,当前推荐 `60000` |
| | | - `alignToMinute`:是否按整分钟对齐发送 |
| | | - `includeDeviceIdField`:发送时是否在 payload 中带设备编号字段 |
| | | - `deviceIdField`:设备编号字段名,当前默认 `n` |
| | | - `publishOnShutdown`:停机前是否补发一次缓存数据 |
| | | - `channels`:发送通道,可选 `mqtt`、`aliyun` |
| | | |
| | | 常见组合: |
| | | |
| | | - 只发 MQTT:`["mqtt"]` |
| | | - 只发阿里云:`["aliyun"]` |
| | | - 双发:`["mqtt", "aliyun"]` |
| | | - 双通道发送:`["mqtt", "aliyun"]` |
| | | |
| | | ### 4.2 `logging` |
| | | |
| | | - `enabled`:是否写本地日志 |
| | | - `console`:是否输出控制台 |
| | | - `enabled`:是否写本地日志文件 |
| | | - `console`:是否输出控制台日志 |
| | | - `dir`:日志目录 |
| | | - `filePrefix`:日志文件前缀 |
| | | - `level`:`debug/info/warn/error` |
| | | - `filePrefix`:日志文件名前缀 |
| | | - `level`:日志级别,支持 `debug`、`info`、`warn`、`error` |
| | | |
| | | ### 4.3 `tcp` |
| | | |
| | | - `host`:监听地址,生产建议 `0.0.0.0` |
| | | - `host`:监听地址,生产推荐 `0.0.0.0` |
| | | - `port`:TCP 监听端口 |
| | | - `maxConnections`:最大连接数 |
| | | - `socketTimeoutMs`:连接超时时间 |
| | | - `socketTimeoutMs`:连接空闲超时时间 |
| | | - `keepAlive`:是否启用 KeepAlive |
| | | - `keepAliveDelayMs`:KeepAlive 延迟 |
| | | - `noDelay`:是否关闭 Nagle |
| | | - `keepAliveDelayMs`:KeepAlive 首次探测延迟 |
| | | - `noDelay`:是否关闭 Nagle 算法 |
| | | - `backlog`:监听队列长度 |
| | | - `maxBufferBytes`:解码缓冲区上限 |
| | | - `maxBufferBytes`:单连接解码缓冲区上限 |
| | | |
| | | ### 4.4 `mqtt` |
| | | |
| | | - `protocol`:通常为 `mqtt` |
| | | - `protocol`:通常填写 `mqtt` |
| | | - `host`:Broker 地址 |
| | | - `port`:Broker 端口 |
| | | - `username`:用户名 |
| | | - `password`:密码 |
| | | - `defaultTopicPrefix`:topic 前缀 |
| | | - `defaultTopicPrefix`:Topic 前缀 |
| | | - `topicTemplate`:如使用模板模式,可替代默认前缀模式 |
| | | |
| | | topic 规则: |
| | | 默认 Topic 规则: |
| | | |
| | | ```text |
| | | {defaultTopicPrefix}/{deviceId} |
| | |
| | | - `tupleApiBaseUrl`:三元组接口基础地址 |
| | | - `tupleApiPath`:三元组接口路径 |
| | | - `autoRegister`:是否允许自动注册 |
| | | - `registerRetryMs`:失败重试冷却时间 |
| | | - `connectTimeoutMs`:连接超时时间 |
| | | - `registerRetryMs`:三元组请求失败后的冷却重试时间 |
| | | - `connectTimeoutMs`:阿里云设备连接超时时间 |
| | | |
| | | ### 4.6 `protocol` |
| | | |
| | | - `alModelPath`:模型文件路径 |
| | | - `bloodPressure.publishTime`:是否发布血压监测时间 `M` |
| | | - `alModelPath`:物模型文件路径 |
| | | - `bloodPressure.publishTime`:是否上报血压时间字段 `M` |
| | | - `bloodPressure.flushImmediately`:血压报文到达后是否立即触发一次整包发送 |
| | | |
| | | 规则: |
| | | `publishTime` 规则: |
| | | |
| | | - `true`:发布 `N/O/P/M` |
| | | - `false`:只发布 `N/O/P` |
| | | - `true`:上报 `N/O/P/M` |
| | | - `false`:仅上报 `N/O/P` |
| | | - 未配置时默认 `true` |
| | | |
| | | 如果现场平台未接血压时间字段,建议配置: |
| | | `flushImmediately` 规则: |
| | | |
| | | - `true`:血压到达后,先缓存 `N/O/P/M`,再立即发送当前设备缓存中的整包物模型 |
| | | - `false`:血压仅进入缓存,继续等待定时批量发送 |
| | | - 未配置时默认 `true` |
| | | |
| | | 如果平台不接收血压时间字段,可配置: |
| | | |
| | | ```json |
| | | { |
| | | "protocol": { |
| | | "alModelPath": "./alModel.json", |
| | | "bloodPressure": { |
| | | "publishTime": false |
| | | "publishTime": false, |
| | | "flushImmediately": true |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | 如果现场明确要求“只按分钟发送,不要血压即时触发”,可配置: |
| | | |
| | | ```json |
| | | { |
| | | "protocol": { |
| | | "alModelPath": "./alModel.json", |
| | | "bloodPressure": { |
| | | "publishTime": true, |
| | | "flushImmediately": false |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | |
| | | - `ip` |
| | | - `name` |
| | | |
| | | 注意: |
| | | 注意事项: |
| | | |
| | | - `ip` 必须与服务端实际看到的客户端 IP 一致 |
| | | - 如果经过 NAT,要填写 NAT 后服务端看到的 IP |
| | | - `ip` 必须与服务端实际看到的客户端来源 IP 完全一致 |
| | | - 如果经过 NAT,需要填写 NAT 后服务端可见的来源 IP |
| | | - 如果现场使用备注字段,也建议同步补齐 `name`,便于日志识别 |
| | | |
| | | ## 5. 血压计协议补充 |
| | | ## 5. 发送行为说明 |
| | | |
| | | 血压计示例报文: |
| | | ### 5.1 普通透析机指标 |
| | | |
| | | 透析机指标默认先进入聚合器缓存,在批量模式下按 `flushIntervalMs` 周期整包发送。 |
| | | |
| | | ### 5.2 血压报文 |
| | | |
| | | 血压报文示例: |
| | | |
| | | ```text |
| | | AA 55 0E BA 00 78 50 59 08 08 08 08 08 10 |
| | | ``` |
| | | |
| | | 解析含义: |
| | | 解析结果: |
| | | |
| | | - `00 78`:收缩压 `N` |
| | | - `50`:舒张压 `O` |
| | | - `59`:脉搏 `P` |
| | | - 后 5 字节:时间 `M` |
| | | - 后 5 个时间字节:时间 `M` |
| | | |
| | | 发布时间开启时: |
| | | 当 `publishTime=true` 时,血压指标示例: |
| | | |
| | | ```json |
| | | { |
| | |
| | | } |
| | | ``` |
| | | |
| | | 发布时间关闭时: |
| | | 当 `publishTime=false` 时,血压指标示例: |
| | | |
| | | ```json |
| | | { |
| | |
| | | } |
| | | ``` |
| | | |
| | | ## 6. Windows 部署 |
| | | 当 `flushImmediately=true` 时,行为如下: |
| | | |
| | | 1. 血压数据先写入缓存。 |
| | | 2. 立即触发一次当前设备的整包物模型发送。 |
| | | 3. 原有 1 分钟批量发送机制继续保留,不冲突。 |
| | | |
| | | 这样做的好处: |
| | | |
| | | - 血压结果更快到平台 |
| | | - 平台收到的仍然是完整物模型,不是单独的血压字段 |
| | | - 定时发送继续兜底,避免其他指标长时间不落地 |
| | | |
| | | ## 6. 模拟与联调 |
| | | |
| | | 项目内置 TCP 模拟器: |
| | | |
| | | ```powershell |
| | | npm run start:simulator -- --host 127.0.0.1 --port 9000 |
| | | ``` |
| | | |
| | | 说明: |
| | | |
| | | - 当前 `start:simulator` 默认会带透析机报文和血压报文混合发送 |
| | | - 如仅需发送血压,可执行 `npm run start:simulator:bp` |
| | | |
| | | 自定义血压参数示例: |
| | | |
| | | ```powershell |
| | | npm run start:simulator -- --bp-systolic 135 --bp-diastolic 88 --bp-pulse 76 |
| | | ``` |
| | | |
| | | ## 7. Windows 部署 |
| | | |
| | | 建议目录: |
| | | |
| | |
| | | .\jhm-service.exe --config .\runtime\config.json |
| | | ``` |
| | | |
| | | ## 7. Linux 部署 |
| | | 如需安装为服务,可使用: |
| | | |
| | | ```powershell |
| | | cd .\service |
| | | .\install-service.ps1 |
| | | ``` |
| | | |
| | | 卸载服务: |
| | | |
| | | ```powershell |
| | | cd .\service |
| | | .\uninstall-service.ps1 |
| | | ``` |
| | | |
| | | ## 8. Linux 部署 |
| | | |
| | | 建议目录: |
| | | |
| | |
| | | ./jhm-service --config ./runtime/config.json |
| | | ``` |
| | | |
| | | ## 8. 验证建议 |
| | | 如需安装为 systemd 服务,可参考: |
| | | |
| | | ```bash |
| | | cd ./service |
| | | chmod +x ./install-service.sh ./uninstall-service.sh |
| | | ./install-service.sh |
| | | ``` |
| | | |
| | | ## 9. 运行日志说明 |
| | | |
| | | 当前服务运行日志统一输出中文,默认写入: |
| | | |
| | | ```text |
| | | runtime/logs 或配置中的 logging.dir |
| | | ``` |
| | | |
| | | 重点关注以下日志: |
| | | |
| | | - TCP 监听成功 |
| | | - 设备连接和断开 |
| | | - 收到指标 |
| | | - 血压报文触发整包立即发送 |
| | | - MQTT 发布成功或失败 |
| | | - 阿里云属性上报成功或失败 |
| | | |
| | | ## 10. 验收建议 |
| | | |
| | | 部署完成后建议执行: |
| | | |
| | |
| | | npm run verify:commands |
| | | ``` |
| | | |
| | | 重点确认: |
| | | 现场重点确认: |
| | | |
| | | - TCP 端口监听正常 |
| | | - 设备连接日志正常 |
| | | - 原透析机数据解析正常 |
| | | - TCP 监听正常 |
| | | - 设备接入 IP 匹配正常 |
| | | - 透析机 `EE 55` 报文解析正常 |
| | | - 血压计 `AA 55` 报文解析正常 |
| | | - `M` 字段是否符合现场需求 |
| | | - 血压到达后是否按预期立即整包发送 |
| | | - 1 分钟批量发送是否仍正常执行 |
| | | - MQTT 或阿里云上报结果正常 |
| | | - 日志文件持续输出正常 |