Health Level 7 (HL7) 是国际电子医疗记录(EMR)标准之一。 HL7协议是一种应用层协议,其主要用途是在不同应用程序、医疗设备、医疗保健组织之间传递消息。本文将从多个方面详细介绍HL7协议。
一、HL7协议概述
HL7协议是一种规范,用于在不同设备、系统和组织中传输数据,包括病人诊断和治疗,药品管理和财务等。该协议的最新版本是HL7v3,它基于XML消息格式,不再使用之前版本的消息语法。HL7协议包括以下组件:
- 消息类型:描述消息的目的和内容。
- 字段:描述消息中要传输的数据。
- 数据类型:描述数据类型及其格式。
以下是HL7协议常用的消息类型:
MSH|^~\&|SendingApplication|SendingFacility|ReceivingApplication|ReceivingFacility|MessageControlID|ProcessingID|VersionID|
二、HL7协议消息格式
HL7协议消息的格式是由分隔符分隔的一些段和组成。分隔符可以是任何字符,但通常使用特殊的ASCII字符,如FS(字段分隔符),RS(记录分隔符)和ETX(结束文本)。 HL7协议定义的常用消息段是:
- MSH:消息头,包含消息的元数据,例如发送者和接收者的身份,消息控制ID和时间戳。
- PID:患者标识段,包含病人的个人身份信息。
- PV1:患者访问段,包含病人的入院信息。
- OBX:观测结果段,包含患者的诊断和治疗信息。
以下是一个HL7协议消息的示例:
MSH|^~\&|HL7DemoApp|HL7DemoFac|EHRApp|EHRFac|20210223090600||ADT^A01^ADT_A01|HL7DEMO0001|P|2.3|||| EVN|A01|20210223090600 PID|1||PAT0001^^^MRN||Doe^John^^^^L||19900101|M|||123 Main St.^^Anytown^MI^48080^^M||||||123456789| PV1|1|I|^^^Bed1^^^^^AssignFac~^^^Bed1^^^^^AssignFac|||||||||||||||||||||||||||||||||||||||||||||||||||||||| OBX|1||||RP^Respiratory Rate||16|/min||||||||F|| OBX|2||||TP^Temperature||37|Cel||||||||F||
三、HL7协议的应用场景
HL7协议主要用于医疗行业,在以下场景中广泛使用:
- EMR:将医疗记录从一家医院传输到另一家医院。
- PACS:在医生和影像设备之间传输患者的DICOM图像和文本报告。
- LIS:将实验室测试结果从实验室系统发送到电子病历系统,并与患者的临床信息进行整合。
- RIS:在放射科中,将诊断流程中的各个阶段进行转换。
四、 HL7协议的优势
HL7协议有以下的利益:
- 互操作性:HL7协议可以跨越各种前沿,从设备和应用程序到HIS(医院信息系统)和PACS(影像归档和通信系统)。
- 灵活性:HL7协议支持多种类型的数据消息,包括文本,图像,语音和其他多媒体文件。
- 可扩展性:HL7协议可以根据应用程序和患者需要进行自定义配置和扩展。
五、 HL7协议的代码实现
以下是HL7协议的代码示例:
// 引入HL7协议包 import ca.uhn.hl7v2.app.*; import ca.uhn.hl7v2.app.Connection; import ca.uhn.hl7v2.app.Initiator; import ca.uhn.hl7v2.app.SimpleServer; import ca.uhn.hl7v2.parser.*; import ca.uhn.hl7v2.model.*; import ca.uhn.hl7v2.model.v25.*; import java.io.IOException; import java.util.*; public class HL7MessageSender { public static void main(String[] args) { // 创建消息 ADT_A01 adt = new ADT_A01(); adt.initQuickstart("ADT", "A01", "P"); adt.getMSH().getMsh3_SendingApplication().getNamespaceID().setValue("TestSendingSystem"); adt.getMSH().getMsh5_ReceivingApplication().getNamespaceID().setValue("TestReceivingSystem"); adt.getMSH().getMsh9_MessageType().getMessageType().setValue("ADT"); adt.getMSH().getMsh9_MessageType().getTriggerEvent().setValue("A01"); adt.getMSH().getMsh10_MessageControlID().setValue("123456"); adt.getEVN().getRecordedDateTime().getTimeOfAnEvent().setValue("20200829090602"); adt.getPID().getPatientName(0).getFamilyName().getSurname().setValue("Doe"); adt.getPID().getPatientName(0).getGivenName().setValue("John"); adt.getPID().getPatientIdentifierList(0).getID().setValue("PAT0001"); adt.getPID().getDateTimeOfBirth().getTimeOfAnEvent().setValue("19900101"); adt.getPID().getAdministrativeSex().setValue("M"); adt.getPID().getAddress(0).getStreetAddress().getStreetOrMailingAddress().setValue("123 Main St."); adt.getPID().getAddress(0).getCity().setValue("Anytown"); adt.getPID().getAddress(0).getStateOrProvince().setValue("MI"); adt.getPID().getAddress(0).getZipOrPostalCode().setValue("48080"); adt.getPID().getAddress(0).getCountry().setValue("USA"); adt.getPID().getPhoneNumberHome(0).getTelephoneNumber().setValue("123456789"); adt.getPV1().getPatientClass().setValue("I"); adt.getOBX().getSetIDOBX().setValue("1"); adt.getOBX().getValueType().setValue("RP"); adt.getOBX().getObservationIdentifier().getIdentifier().setValue("Respiratory Rate"); adt.getOBX().getObservationValue(0).setValue("16"); adt.getOBX().getUnits().setValue("/min"); adt.getOBX().getObservationResultStatus().setValue("F"); // 创建连接 Connection connection; try { connection = new PipeParser().parse("localhost", 8080, "/hl7"); connection.getInitiator().sendAndReceive(adt); } catch (HL7Exception | IOException e) { e.printStackTrace(); } } }