您的位置:

HL7协议详解

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();
        }
    }
}