From 7885cede659f3255be56f77c1eef2ada7387d6f1 Mon Sep 17 00:00:00 2001
From: chenyc <501753378@qq.com>
Date: 星期日, 22 三月 2026 16:23:21 +0800
Subject: [PATCH] 初始化项目

---
 docs/protocol.md |  230 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 230 insertions(+), 0 deletions(-)

diff --git a/docs/protocol.md b/docs/protocol.md
new file mode 100644
index 0000000..9eade0c
--- /dev/null
+++ b/docs/protocol.md
@@ -0,0 +1,230 @@
+# 山外山血透机远程通讯协议(V1.11)整理摘要
+
+> 说明:本文件是根据你提供的协议截图做的技术要点整理,方便在网关程序中实现解析逻辑,非原文逐字抄录。
+
+## 1. 通信总览
+
+- **传输方式**:TCP
+- **服务器端口**:默认 `10000`
+- **终端角色**:血液透析机作为 TCP 客户端,主动连接透析中心服务器并发送数据
+- **信息粒度**:协议以“数据帧”为单位,不同业务含义对应不同“数据帧类型”
+
+## 2. 帧总体结构
+
+每一帧的基本结构如下(按顺序排列):
+
+| 字段           | 长度    | 说明                       |
+|----------------|---------|----------------------------|
+| 帧头           | 4 字节  | 固定标识,文中示例为 `0x55555555`(十六进制) |
+| 机器类型       | 1 字节  | 标识具体机型               |
+| 机器编号       | 5 字节  | 机器的出厂编号             |
+| 机器运行模式   | 1 字节  | 当前运行模式(待机 / 透析 / 滤过等) |
+| 数据帧类型     | 1 字节  | 区分运行参数、报警信息、血压测量等帧 |
+| 协议版本       | 1 字节  | 版本号编码(见后文)       |
+| 保留           | 7 字节  | 预留字段                   |
+| 数据信息       | N 字节  | 实际业务数据区             |
+
+### 2.1 机器类型
+
+机器类型字段为 1 字节,主要取值示意:
+
+- `0x01`:SWS-4000
+- `0x02`:SWS-4000A
+- `0x31`:SWS-6000
+- `0x32`:SWS-6000A
+
+### 2.2 机器编号
+
+- 机器编号为 **5 字节**,表示机器出厂编号,例如文档示例:`6210100001`。
+- 协议未在截图中明确说明编码方式,一般实现中可按 **ASCII** 或 **BCD** 存储,需要结合现场抓包确认。
+
+### 2.3 机器运行模式
+
+机器运行模式为 1 字节,常见取值(节选):
+
+| 值    | 模式示意           |
+|-------|---------------------|
+| 0x00  | 待机                |
+| 0x01  | 透析                |
+| 0x02  | 滤过 / 净化         |
+| 0x03  | 透析滤过            |
+| 0x04  | 序贯-透析           |
+| 0x05  | 单纯超滤            |
+| 0x06  | 序贯-单超           |
+| 0x07  | 预充                |
+| 0x08  | 清洗                |
+| 0x09  | 清洗消毒            |
+| 0x0C  | 自检                |
+| 0x14  | 透析结束            |
+| 0x15  | 清洗结束            |
+| 0x16  | 透析滤过结束        |
+| 0x17  | 单纯超滤结束        |
+| 0x18  | 序贯治疗结束        |
+| ...   | 其它模式参见原表    |
+
+> 上表为对截图模式表的概括,具体值-文案映射可按业务需要在网关侧定义常量或枚举,不影响解析。
+
+### 2.4 数据帧类型
+
+数据帧类型字段为 1 字节,主要取值:
+
+- `0x1F`:**运行参数帧**(定期上报透析运行过程中的各种参数)
+- `0x26`:**报警信息帧**(产生报警 / 解除报警即时上报)
+- `0x29`:**血压测量数据帧**(每次测量血压后即时上报)
+
+### 2.5 协议版本编码
+
+- 协议版本字段为 1 字节。
+- 编码规则:取协议版本号中的**数字部分**乘以 100,再转为 16 进制传输。
+  - 例如当前版本 `V1.10` → 数值 `1.10 × 100 = 110` → 十六进制 `0x6E`。
+
+## 3. 运行参数帧(0x1F)
+
+### 3.1 报文特性
+
+- **数据帧类型**:`0x1F`
+- **数据区长度**:约 220 字节
+- **发送时机**:
+  - 客户端(透析机)与服务器建立 TCP 连接成功后;
+  - 当透析机处于“治疗界面”时,每隔约 **4 秒**向服务器发送一次运行参数帧。
+
+### 3.2 运行参数数据区结构(节选)
+
+数据区由多个字段按固定偏移排布。截图中的表按“偏移值(从 0 开始)+ 字节数 + 含义”的形式列出。下面摘录部分关键字段,辅助和 `schema.json` 中的物模型做对应:
+
+> 注意:偏移和长度根据截图识别,实际以正式文档为准,解析实现时建议结合真实抓包核对。
+
+| 偏移 | 长度 (Byte) | 含义示意                          | 对应物模型(示例) |
+|------|-------------|------------------------------------|--------------------|
+| 0    | 4           | 设置治疗时间 (s)                  | `SetTreatmentTime` |
+| 4    | 4           | 已治疗时间 (s)                    | `K` / 自定义       |
+| 8    | 2~4         | 血泵流量 (ml/min)                 | `D`                |
+| 10   | 1           | 血泵运行标志 0/1 停止/运行        | `xlyxbj`           |
+| 11   | 1           | 抗凝方式 0/1 无抗凝/肝素抗凝      | `klfs`             |
+| 12   | 1           | 肝素泵运行标志 0/1 停止/运行      | `z`                |
+| 13   | 2~4         | 肝素泵流量 (ml/h,放大 10 倍)     | `E`                |
+| 17   | 2~4         | 肝素提前结束时间 (min)            | `gstqjssj`         |
+| 21   | 4           | 超滤总量 (ml)                     | `A`                |
+| 25   | 4           | 已超滤量 (ml)                     | `B`                |
+| 29   | 1           | 超滤泵运行标志 0/1 停止/运行      | `cllyxbj`          |
+| 30   | 1           | 旁路标志 0/1 旁路关/旁路开        | `plbj`             |
+| 31   | 2~4         | 透析液流量 (ml/min)               | `L`                |
+| 33   | 2~4         | 透析液实际温度 (℃,放大 10 倍)   | `F`                |
+| 35   | 2~4         | 透析液电导值 (mS/cm,放大 100 倍) | `G`                |
+| 37   | 2~4         | 血液总量/超滤率等                 | `C`/自定义        |
+| 41   | 4           | 已补入置换液量 (ml)               | `ypyzhyl`          |
+| 45   | 1~2         | 补液补入模式 0/1 前稀释/后稀释    | `pyprfs`           |
+| 46   | 2           | 内毒素滤器 1 使用时间 (h)         | `ldslq`            |
+| 48   | 2           | 内毒素滤器 2 使用时间 (h)         | `ldslq2sysj`       |
+| 50   | 4           | 机器总运行时间 (min)              | `jqzyxsj`          |
+| 54   | 2           | 动脉压 (mmHg)                      | `o`                |
+| 56   | 2           | 静脉压 (mmHg)                      | `H`                |
+| 58   | 2           | 跨膜压 (mmHg)                      | `J`                |
+| 60   | 2           | 透析液压 (kPa,放大 10 倍)        | `I`                |
+| 62   | 1~2         | 尿素下降率 (%)                    | `lsxjl`            |
+| 64   | 1~2         | 实时清除率值 (放大 100 倍)        | `ssqclz`           |
+| 66   | 1~2         | 静脉血温 (℃,放大 10 倍)         | `jmyxh`            |
+| 68   | 1~2         | 动脉血温 (℃,放大 10 倍)         | `dmyxw`            |
+| 69   | 1~2         | 相对血容量 (%)                    | `xdxrl`            |
+| 其余 | 若干        | 预留/扩展字段                     | 见原文             |
+
+通过上述偏移-字段对照,可以在程序中将运行参数帧直接拆解成结构化对象,然后再映射到 `schema.json` 中定义的属性标识符。
+
+## 4. 报警信息帧(0x26)
+
+### 4.1 报文特性
+
+- **数据帧类型**:`0x26`
+- **数据区长度**:约 150 字节
+- **发送时机**:
+  - 透析机每当产生报警时,立即发送一个报警信息帧;
+  - 报警解除后,同样发送一个报警信息帧,用于表示“报警消除”。
+
+### 4.2 报警信息数据区结构(概要)
+
+截图中给出的字段包括(偏移从 0 开始):
+
+- 报警编号(2 字节)
+- 报警类型(1 字节):0/1 → 消除报警 / 产生报警
+- 产生报警时间:按 年-月-日-时-分-秒 分别占若干字节存储(类似 `YYYY-MM-DD HH:MM:SS` 拆分编码)
+- 预留字段若干
+
+网关侧实现时可将这些字段合并为:
+
+```json
+{
+  "alarmCode": <number>,
+  "alarmType": 0 | 1,  // 0=解除, 1=产生
+  "alarmTime": "YYYY-MM-DD HH:MM:SS"
+}
+```
+
+并按需要记录报警历史或转发至上位系统。
+
+## 5. 血压测量数据帧(0x29)
+
+### 5.1 报文特性
+
+- **数据帧类型**:`0x29`
+- **数据区长度**:约 150 字节
+- **发送时机**:
+  - 客户端与服务器建立 TCP 连接成功后;
+  - 血液透析机每测量一次血压,立即发送一帧血压测量数据。
+
+### 5.2 血压测量数据区结构(概要)
+
+根据截图表格,主要包含:
+
+- 测量模式(1 字节):0/1 → 手动测量 / 自动测量
+- 测量结果(1 字节):0/1 → 测量出错 / 测量成功
+- 测量时间:年、月、日、时、分、秒(各占若干字节,类似报警时间编码方式)
+- 血压与心率:
+  - 收缩压 (mmHg)
+  - 舒张压 (mmHg)
+  - 脉搏/心率
+  - 平均动脉压 (mmHg)
+- 预留字段
+
+在网关中可归纳为:
+
+```json
+{
+  "bpMode": 0 | 1,        // 手动/自动
+  "bpResult": 0 | 1,      // 出错/成功
+  "bpTime": "YYYY-MM-DD HH:MM:SS",
+  "systolic": <number>,   // 收缩压
+  "diastolic": <number>,  // 舒张压
+  "heartRate": <number>,  // 心率
+  "map": <number>         // 平均动脉压
+}
+```
+
+## 6. 与现有网关代码的对应关系建议
+
+结合你仓库中的 `schema.json` 与 README 里的物模型介绍,推荐的映射思路:
+
+1. **帧头识别与拆包**
+   - 在 `protocol.js` 中:
+     - 按 4 字节帧头 = `0x55555555` 查找帧起始;
+     - 之后根据固定总长度(例如 4+1+5+1+1+1+7+数据区长度)从流中截取完整帧;
+     - 未完整的一部分留在 buffer 中等待下一次数据。
+
+2. **公共头部解析**
+   - 把机器类型、机器编号、运行模式、数据帧类型、协议版本先解析出来,挂在统一的 `meta` 上。
+
+3. **按数据帧类型分支解析**
+   - 当 `frameType == 0x1F` → 调用 `parseRunParams()`,按上文偏移表解析运行参数;
+   - 当 `frameType == 0x26` → 调用 `parseAlarm()`;
+   - 当 `frameType == 0x29` → 调用 `parseBloodPressure()`。
+
+4. **与物模型字段对齐**
+   - 运行参数里的:超滤总量、已超滤量、血泵流量、动/静/跨膜压、透析液温度/电导、尿素下降率、相对血容量等,对应 `schema.json` 中的 `A/B/C/D/F/G/H/I/J/...` 和诸如 `lsxjl`、`xdxrl` 等自定义标识符;
+   - 在解析函数中直接生成以这些 **identifier** 为 key 的对象,方便后续 `PropertyMapper` 直接透传或做二次包装。
+
+5. **时间与缩放处理**
+   - 所有“放大 N 倍”的数值(如温度放大 10 倍、电导放大 100 倍、清除率放大 100 倍)建议在解析时还原为物理量(除以 N),再存入缓存;
+   - 年/月/日/时/分/秒推荐组合成标准字符串 `YYYY-MM-DD HH:mm:ss`,便于上位系统直接使用。
+
+---
+
+上面这份 `docs/protocol.md` 已经在仓库里生成,你可以打开对照原 PDF 看是否有需要补充或修正的地方。如果你愿意,下一步我可以基于这份整理直接把 `src/protocol.js` 的拆包和字段解析逻辑改成真实实现。需要的话告诉我你希望**优先解析哪些字段**(比如只要运行参数中的 A/B/C/D/F/G/H/I/J 和动静脉压等)。
\ No newline at end of file

--
Gitblit v1.8.0