From 747a86bb94006aaca721cfc0c0ce7061643a9ea6 Mon Sep 17 00:00:00 2001
From: chenyc <501753378@qq.com>
Date: 星期四, 20 八月 2026 12:19:35 +0800
Subject: [PATCH] gx
---
生产实施部署文档.md | 280 ++++++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 220 insertions(+), 60 deletions(-)
diff --git "a/\347\224\237\344\272\247\345\256\236\346\226\275\351\203\250\347\275\262\346\226\207\346\241\243.md" "b/\347\224\237\344\272\247\345\256\236\346\226\275\351\203\250\347\275\262\346\226\207\346\241\243.md"
index 3f4a5ff..7cb96d4 100644
--- "a/\347\224\237\344\272\247\345\256\236\346\226\275\351\203\250\347\275\262\346\226\207\346\241\243.md"
+++ "b/\347\224\237\344\272\247\345\256\236\346\226\275\351\203\250\347\275\262\346\226\207\346\241\243.md"
@@ -2,61 +2,106 @@
## 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": {
@@ -96,13 +141,14 @@
"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号透析机"
}
]
@@ -111,41 +157,51 @@
### 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}
@@ -157,27 +213,51 @@
- `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
+{
+ "protocol": {
+ "alModelPath": "./alModel.json",
+ "bloodPressure": {
+ "publishTime": false,
+ "flushImmediately": true
+ }
+ }
+}
+```
+
+如果现场明确要求“只按分钟发送,不要血压即时触发”,可配置:
+
+```json
+{
+ "protocol": {
+ "alModelPath": "./alModel.json",
+ "bloodPressure": {
+ "publishTime": true,
+ "flushImmediately": false
+ }
}
}
```
@@ -190,27 +270,34 @@
- `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
{
@@ -221,7 +308,7 @@
}
```
-发布时间关闭时:
+当 `publishTime=false` 时,血压指标示例:
```json
{
@@ -231,7 +318,38 @@
}
```
-## 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 部署
建议目录:
@@ -246,7 +364,21 @@
.\jhm-service.exe --config .\runtime\config.json
```
-## 7. Linux 部署
+如需安装为服务,可使用:
+
+```powershell
+cd .\service
+.\install-service.ps1
+```
+
+卸载服务:
+
+```powershell
+cd .\service
+.\uninstall-service.ps1
+```
+
+## 8. Linux 部署
建议目录:
@@ -262,7 +394,32 @@
./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. 验收建议
部署完成后建议执行:
@@ -271,10 +428,13 @@
npm run verify:commands
```
-重点确认:
+现场重点确认:
-- TCP 端口监听正常
-- 设备连接日志正常
-- 原透析机数据解析正常
+- TCP 监听正常
+- 设备接入 IP 匹配正常
+- 透析机 `EE 55` 报文解析正常
- 血压计 `AA 55` 报文解析正常
-- `M` 字段是否符合现场需求
+- 血压到达后是否按预期立即整包发送
+- 1 分钟批量发送是否仍正常执行
+- MQTT 或阿里云上报结果正常
+- 日志文件持续输出正常
--
Gitblit v1.8.0