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>
每個(gè)HL7 message 都是由多個(gè)段(Segment)組成逝她,每個(gè)段都以回車(<CR>)結(jié)尾
每個(gè)段最開始的 3 個(gè)大寫字母表示段的唯一標(biāo)識许赃,如 MSH (message header)表示消息頭,PID (patient identity)表示病人唯一標(biāo)識,
PV1 (patient visit) 表示病人的一些基本信息如床號等。這些段的含義都是 HL7 標(biāo)準(zhǔn)里定義的。
每個(gè)段有包含多個(gè)域(Field), field 之間用 |
分隔虏肾。如果一個(gè) field 沒有被使用就什么都不用寫,這就是很多兩個(gè)域分隔符之間什么都沒有的原因欢搜。每個(gè) field 在段中都有一個(gè)序號(SEQ)封豪,每個(gè)段有多少個(gè) field, 各個(gè) field 的序號和含義都是 HL7 標(biāo)準(zhǔn)中定義的,我們可以只使用其中一部分 field炒瘟。(有些 field 是必須出現(xiàn)的吹埠,不能省略,必須傳值)
每個(gè) field 又可以包含多個(gè) Component (組件) , component 之間用 ^
分隔
如 52^Height
一個(gè) component 又可以包含多個(gè) Sub component (子組件)疮装, 子組件之間用 &
分隔缘琅,如 ICU&Bed5&3232241659&0&0 (包含5個(gè)子組件)
是不是很簡單,像
MSH|^~\&|Mindray|Gateway|||||ORU^R01|2|P|2.3.1| <CR>
MSH 表示消息頭段廓推,前面 5 個(gè)字符 |^~& 是第一個(gè)Field定義分隔符
Mindray 是第二個(gè) Field刷袍,Gateway 是第三個(gè) Field , 4,5,6,7 這四個(gè)Field 沒有用到,第 8 個(gè) Field 是 ORU^R01(包含兩個(gè)組件)
那么HL7 消息解析是不是很簡單呢樊展?呻纹??首先用回車符分隔各個(gè)段专缠,一個(gè)段再用 | 分隔出各個(gè) Field 居暖,再參考協(xié)議文檔就解析出了各個(gè)數(shù)據(jù)了。
由于 HL7 Message 是一個(gè)應(yīng)用層高層協(xié)議藤肢,沒有定義消息的開始和停止。所以應(yīng)用時(shí)一般會在 TCP 上加一層 HL7 low-level 協(xié)議來定義消息的開始和結(jié)束糯景。
有了 HL7 Low-Level protocol 我們就可以很容易的從 TCP 字節(jié)流中分離出一個(gè)一個(gè)的 HL7 消息了嘁圈。(Netty 中用一個(gè)分隔符拆包就行了。)