4. 医疗设备数据采集与协议解析

医院里真正“活”的数据,绝大多数并不来自信息系统,而是来自床旁设备:监护仪每秒输出心电、血氧、无创血压;呼吸机持续上报潮气量、气道压力、PEEP;输液泵按滴速和累计量推送运行状态;检验设备在完成一批样本后吐出结果与质控标记。把这些数据稳定、准确地接入医院系统,是设备集成工程中最核心也最琐碎的一环。本章围绕“怎么采、怎么解、怎么转”三个问题展开。

一、采集的物理与逻辑通道

采集首先要解决“从哪里拿数据”。常见通道有四类:

  • 串口(RS-232/RS-485):老式监护仪、部分输液泵、血气分析仪常用。RS-232 点对点,RS-485 可总线挂多台。参数典型为 9600/19200 bps、8 数据位、1 停止位、无校验,但厂商常自定义。
  • 网口(TCP/UDP):现代监护仪、呼吸机主流方式。设备作为服务端监听某端口,采集程序作为客户端连接;也有设备主动向指定 IP 推送。
  • HL7 v2 接口:检验设备(LIS 侧)几乎都提供 HL7 over MLLP,用 0x0B 起始、0x1C 0x0D 结束。
  • 厂商中间件/SDK:如 Philips IntelliBridge、GE CARESCAPE 网关,把私有协议封装成标准输出,降低解析难度但增加授权成本。

工程上第一步不是写代码,而是拿到设备的接口说明书(Interface Specification),确认波特率、帧格式、心跳机制、是否要求主动查询(polling)还是被动接收(unsolicited)。这一步缺失,后面所有解析都是猜测。

二、私有协议的解析方法

私有协议没有统一标准,但结构上高度相似,通常由帧头、长度、设备/消息类型、数据域、校验、帧尾组成。以某类监护仪常见的 ASCII 帧为例:

0x02 "MSH|^~\&|MINDRAY|..." 0x03 0x0D
或二进制帧:
AA 55 | LEN(2B) | MSG_TYPE(1B) | PAYLOAD(N) | CRC16(2B) | 0D 0A

解析的关键动作是状态机拆帧:先找帧头,再读长度字段确定整帧边界,收满后校验 CRC,通过才交给字段解析器。切忌用“按行读”处理二进制帧,因为数据域里可能恰好出现 0x0A。

字段解析要建立参数映射表,把设备内部编号翻译成临床语义。例如某呼吸机上报 0x21 表示“吸气潮气量”,单位 mL,整型放大 10 倍,则原始值 4520 对应 452.0 mL。映射表应包含:参数代码、名称、单位、数据类型、缩放因子、有效范围、无效值(如 0xFFFF 表示传感器脱落)。

建议把映射表做成可配置的 JSON 或数据库表,而不是硬编码在程序里。不同型号、不同固件版本的参数代码经常变化,配置化能让现场工程师不改代码就完成适配。

三、标准协议:HL7 v2 与数据格式转换

检验设备、部分高端监护仪输出 HL7 v2.x 消息。一条 ORU^R01 结果消息的核心段是:

MSH|^~\&|LAB|HOSP|LIS|HOSP|20240515103000||ORU^R01|MSG0001|P|2.4
PID|1||P123456||张三||19800101|M
OBR|1|ORD001|LAB001|CBC^血常规
OBX|1|NM|WBC^白细胞||6.8|10*9/L|4.0-10.0|N|||F
OBX|2|NM|HGB^血红蛋白||135|g/L|120-160|N|||F

解析 HL7 要按层级拆:段(Segment)用 \r 分隔,字段用 |,组件用 ^,重复用 ~。OBX 段中第 5 字段是值,第 6 字段是单位,第 7 字段是参考范围,第 8 字段是异常标志(N 正常、H 偏高、L 偏低)。这些字段直接决定临床系统里结果是否标红。

数据格式转换的目标是把设备语义映射到院内统一数据模型。常见转换包括:

  • 单位换算:mg/dL 与 mmol/L(血糖换算系数 18.0182)、mmHg 与 kPa(7.5006)。
  • 时间归一:设备本地时间、UTC、HL7 的 YYYYMMDDHHMMSS 统一为带时区的 ISO 8601。
  • 编码归一:设备私有患者 ID、HL7 的 PID-3 与院内 EMPI 对齐,避免“同人不同号”。
  • 数值类型:字符串 "6.8" 转 float,无效值 0xFFFF 转 null,避免污染统计。

四、采集链路的整体视图

下面这张图把床旁设备、采集网关、协议解析、格式转换到院内系统的完整信号链画在一起,同时标出每一环最容易出问题的位置,便于现场排障时按图定位。

医疗设备数据采集与协议解析信号链 床旁设备层 监护仪 ECG/SpO₂/NIBP 呼吸机 Vt/Paw/PEEP 输液泵 速率/累计量/报警 检验设备 结果/质控 麻醉机/其他 参数/状态 物理/逻辑通道 RS-232/485 9600/19200 bps TCP/UDP 端口/心跳 HL7 MLLP 0x0B…0x1C0D 厂商网关 IntelliBridge 等 文件/共享目录 CSV/ASTM 采集网关 连接管理 重连/心跳/超时 状态机拆帧 帧头/长度/CRC 字段解析 参数映射表 格式转换 单位/时间/编码 本地缓存/断点续传 院内系统 重症监护信息系统(ICU CIS) 趋势/报警/评分 电子病历(EMR) 护理记录/医嘱闭环 实验室信息系统(LIS) 检验结果/质控 临床数据中心(CDR) 统一数据模型 报警/看板/科研 二次利用 易错:波特率/校验 不匹配 → 乱码 易错:按行读二进制帧 → 拆帧错位 易错:单位/时间/患者 ID 未归一 → 结果错配、趋势跳变

五、现场排障的实用判断

采集链路出问题时,按“物理层→链路层→解析层→语义层”逐级排查效率最高。物理层看线序、波特率、校验位是否与说明书一致;链路层看 TCP 是否连上、心跳是否超时、MLLP 起止符是否成对;解析层看 CRC 是否通过、字段偏移是否对得上;语义层看单位、时间、患者 ID 是否与院内一致。

一个常见现象是“数据能收到但数值明显不对”。例如监护仪 SpO₂ 显示 98,系统里却是 9.8 或 980。这通常是缩放因子用错:设备原始值 98 表示 98%,若程序误按 10 倍放大就得到 980。排查时先抓原始帧,对照接口说明书确认缩放因子,再检查转换代码。

不要在没有校验的情况下把设备原始数据直接写入临床数据库。CRC 失败、字段越界、单位未知的帧应被丢弃并记录日志,否则一条错误数据可能触发误报警,甚至影响用药决策。

六、可参考的参数映射配置片段

下面是一段可直接改造使用的参数映射配置示例,字段覆盖了采集解析中最关键的几项。实际部署时按设备型号分别维护。

{
  "device": "Mindray_UM_Series",
  "protocol": "private_binary",
  "frame": { "head": "AA55", "len_bytes": 2, "crc": "CRC16_MODBUS" },
  "params": [
    { "code": "0x21", "name": "潮气量", "unit": "mL", "type": "int16", "scale": 0.1, "range": [0, 2000], "invalid": "0xFFFF" },
    { "code": "0x22", "name": "气道峰压", "unit": "cmH2O", "type": "int16", "scale": 0.1, "range": [0, 80], "invalid": "0xFFFF" },
    { "code": "0x30", "name": "心率", "unit": "bpm", "type": "uint8", "scale": 1, "range": [0, 300], "invalid": "0xFF" },
    { "code": "0x31", "name": "血氧饱和度", "unit": "%", "type": "uint8", "scale": 1, "range": [0, 100], "invalid": "0xFF" }
  ]
}

把采集、解析、转换三件事拆开实现,各自可测试、可替换,是这类工程能长期稳定运行的关键。设备会换、固件会升级、院内数据模型会调整,只有分层清晰,改动才不会牵一发动全身。