HL7 协议入门

2020-08-23  本文已影响0人  lesliefang
MSH|^~\&|Mindray|Gateway|||||ORU^R01|2|P|2.3.1| <CR> 
PID|||M1015_00010||John^||20091112|M|||^^^^||| <CR>
PV1||I|^^ICU&Bed5&3232241659&0&0|||||||||||||||A||||||||||||||||||||||||||20091201111211 <CR> 
OBR||||Mindray Monitor|||20091203121631| <CR> 
OBX||NM|52^Height||169.0||||||F <CR> 
OBX||NM|51^Weight||59.0||||||F <CR> 
OBX||CE|2302^BloodType||1^A||||||F <CR> 
OBX||CE|2303^PACE_Switch||0^Off||||||F <CR> 
OBX||NM|101^HR|2101|60||||||F <CR> 
OBX||NM|151^RR|2102|20||||||F <CR> 
OBX||NM|200^T1|2104|37.00||||||F <CR>

每个HL7 message 都是由多个段(Segment)组成,每个段都以回车(<CR>)结尾

每个段最开始的 3 个大写字母表示段的唯一标识,如 MSH (message header)表示消息头,PID (patient identity)表示病人唯一标识,
PV1 (patient visit) 表示病人的一些基本信息如床号等。这些段的含义都是 HL7 标准里定义的。

每个段有包含多个域(Field), field 之间用 | 分隔。如果一个 field 没有被使用就什么都不用写,这就是很多两个域分隔符之间什么都没有的原因。每个 field 在段中都有一个序号(SEQ),每个段有多少个 field, 各个 field 的序号和含义都是 HL7 标准中定义的,我们可以只使用其中一部分 field。(有些 field 是必须出现的,不能省略,必须传值)

每个 field 又可以包含多个 Component (组件) , component 之间用 ^ 分隔
如 52^Height

一个 component 又可以包含多个 Sub component (子组件), 子组件之间用 & 分隔,如 ICU&Bed5&3232241659&0&0 (包含5个子组件)

message.png separator.png

是不是很简单,像

MSH|^~\&|Mindray|Gateway|||||ORU^R01|2|P|2.3.1| <CR> 

MSH 表示消息头段,前面 5 个字符 |^~& 是第一个Field定义分隔符
Mindray 是第二个 Field,Gateway 是第三个 Field , 4,5,6,7 这四个Field 没有用到,第 8 个 Field 是 ORU^R01(包含两个组件)

那么HL7 消息解析是不是很简单呢???首先用回车符分隔各个段,一个段再用 | 分隔出各个 Field ,再参考协议文档就解析出了各个数据了。

由于 HL7 Message 是一个应用层高层协议,没有定义消息的开始和停止。所以应用时一般会在 TCP 上加一层 HL7 low-level 协议来定义消息的开始和结束。

HL7.png lower level.png

有了 HL7 Low-Level protocol 我们就可以很容易的从 TCP 字节流中分离出一个一个的 HL7 消息了。(Netty 中用一个分隔符拆包就行了。)

上一篇下一篇

猜你喜欢

热点阅读