说明:本文件是根据你提供的协议截图做的技术要点整理,方便在网关程序中实现解析逻辑,非原文逐字抄录。
10000每一帧的基本结构如下(按顺序排列):
| 字段 | 长度 | 说明 |
|---|---|---|
| 帧头 | 4 字节 | 固定标识,文中示例为 0x55555555(十六进制) |
| 机器类型 | 1 字节 | 标识具体机型 |
| 机器编号 | 5 字节 | 机器的出厂编号 |
| 机器运行模式 | 1 字节 | 当前运行模式(待机 / 透析 / 滤过等) |
| 数据帧类型 | 1 字节 | 区分运行参数、报警信息、血压测量等帧 |
| 协议版本 | 1 字节 | 版本号编码(见后文) |
| 保留 | 7 字节 | 预留字段 |
| 数据信息 | N 字节 | 实际业务数据区 |
机器类型字段为 1 字节,主要取值示意:
0x01:SWS-40000x02:SWS-4000A0x31:SWS-60000x32:SWS-6000A6210100001。机器运行模式为 1 字节,常见取值(节选):
| 值 | 模式示意 |
|---|---|
| 0x00 | 待机 |
| 0x01 | 透析 |
| 0x02 | 滤过 / 净化 |
| 0x03 | 透析滤过 |
| 0x04 | 序贯-透析 |
| 0x05 | 单纯超滤 |
| 0x06 | 序贯-单超 |
| 0x07 | 预充 |
| 0x08 | 清洗 |
| 0x09 | 清洗消毒 |
| 0x0C | 自检 |
| 0x14 | 透析结束 |
| 0x15 | 清洗结束 |
| 0x16 | 透析滤过结束 |
| 0x17 | 单纯超滤结束 |
| 0x18 | 序贯治疗结束 |
| ... | 其它模式参见原表 |
上表为对截图模式表的概括,具体值-文案映射可按业务需要在网关侧定义常量或枚举,不影响解析。
数据帧类型字段为 1 字节,主要取值:
0x1F:**运行参数帧**(定期上报透析运行过程中的各种参数)0x26:**报警信息帧**(产生报警 / 解除报警即时上报)0x29:**血压测量数据帧**(每次测量血压后即时上报)V1.10 → 数值 1.10 × 100 = 110 → 十六进制 0x6E。0x1F数据区由多个字段按固定偏移排布。截图中的表按“偏移值(从 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 中定义的属性标识符。
0x26截图中给出的字段包括(偏移从 0 开始):
YYYY-MM-DD HH:MM:SS 拆分编码)网关侧实现时可将这些字段合并为:
{
"alarmCode": <number>,
"alarmType": 0 | 1, // 0=解除, 1=产生
"alarmTime": "YYYY-MM-DD HH:MM:SS"
}
并按需要记录报警历史或转发至上位系统。
0x29根据截图表格,主要包含:
在网关中可归纳为:
{
"bpMode": 0 | 1, // 手动/自动
"bpResult": 0 | 1, // 出错/成功
"bpTime": "YYYY-MM-DD HH:MM:SS",
"systolic": <number>, // 收缩压
"diastolic": <number>, // 舒张压
"heartRate": <number>, // 心率
"map": <number> // 平均动脉压
}
结合你仓库中的 schema.json 与 README 里的物模型介绍,推荐的映射思路:
protocol.js 中:
0x55555555 查找帧起始;meta 上。frameType == 0x1F → 调用 parseRunParams(),按上文偏移表解析运行参数;frameType == 0x26 → 调用 parseAlarm();frameType == 0x29 → 调用 parseBloodPressure()。schema.json 中的 A/B/C/D/F/G/H/I/J/... 和诸如 lsxjl、xdxrl 等自定义标识符;PropertyMapper 直接透传或做二次包装。YYYY-MM-DD HH:mm:ss,便于上位系统直接使用。上面这份 docs/protocol.md 已经在仓库里生成,你可以打开对照原 PDF 看是否有需要补充或修正的地方。如果你愿意,下一步我可以基于这份整理直接把 src/protocol.js 的拆包和字段解析逻辑改成真实实现。需要的话告诉我你希望**优先解析哪些字段**(比如只要运行参数中的 A/B/C/D/F/G/H/I/J 和动静脉压等)。