HL7协议解析

目录

一、前言介绍

二、协议格式

1.格式及类型说明

2.MSH--消息头

3.PID--患者基本信息

4.PV1--患者入院信息

5.OBR--记录的请求信息

6.OBX--观测结果

三、简单解析示例

1.自定义消息

2.HL7数据解析示例

四、socket项目示例--已更新


一、前言介绍

        最近研究对接医院设备,所需时间最多的还是研究协议/解析数据,对接的难度不大,各个厂家各个版本的参数标识都不一致,请对接时索要确定文档来确定参数标识的实际参数含义,如部分厂家会传递会有两个一样的标识,需要通过OBX段的Sub-ID来二次确认参数

--所需jar

    <dependency>
      <groupId>ca.uhn.hapi</groupId>
      <artifactId>hapi-base</artifactId>
      <version>2.3</version>
    </dependency>
     <!-- HL7解析 版本具体看医院协议的版本 -->
    <dependency>
      <groupId>ca.uhn.hapi</groupId>
      <artifactId>hapi-structures-v26</artifactId>
      <version>2.3</version>
    </dependency>
    <dependency>
      <groupId>ca.uhn.hapi</groupId>
      <artifactId>hapi-structures-v24</artifactId>
      <version>2.3</version>
    </dependency>

-- 解析的示例数据

MSH|^~\&|^GoldwayG||||20230727132606||ORU^R01^ORU_R01|09FB744EBB0000000127|P|2.6|||||||||2.16.840
PID|||PatientID||PatientName||19990807|F|
PV1||I|科室^房间^床号&网络床号^医院^^^^^4376B491^设备名称|&&0|||^主治医生姓名|^顾问医生姓名||||||||||A|VisitNumber||||||||||||||||||||||| | |20230725000000|
OBR||||MONITOR|||20230727132606
OBX|1|NM|0002-4182^HR^MDIL||60|0004-0aa0^bpm^MDIL|||||X
OBX|2|NM|0002-5000^RESP^MDIL||40|0004-0ae0^rpm^MDIL|||||X
OBX|3|NM|0002-4bb8^SpO2^MDIL||96|0004-0220^%^MDIL|||||F

二、协议格式

注:这里只会标注常用的字段说明

1.格式及类型说明

分隔符说明

|域分隔符
^组件分隔符
~重复分隔符
\转义符
&子组件分隔符

说明:一般常用的是|和^,如示例中的PV1,PV1-3 指第三个|后的内容(患者位置信息),PV1-3.1指第一个^前的内容(患者科室)

数据类型说明

NM整数
ST字符串
SN比率
CNE枚举值
DTM日期
SI序列id
IS用户定义表的编码
2.MSH--消息头

示例  MSH|^~\&||KC009910821G|||20230810095016+0800||ORU^R01|202308100950161337|P|2.4

序号数据类型字段说明
1ST域分隔符
3HD发送端软件
4HD发送端设备
7TS消 息 的 日 期 和 时 间
9MSG消息类型
12VID版本
3.PID--患者基本信息

示例 PID|||PatientID||PatientName||19990807|F|

序号数据类型字段说明
3CX病人标识列表
5XPN病人姓名
7DTM出生日期
8IS性别
19STSSN号码
4.PV1--患者入院信息

示例 PV1||I|科室^房间^床号&网络床号^医院^^^^^4376B491^设备名称|&&0|||^主治医生姓名|^顾问医生姓名

序号数据类型字段说明
2IS病人分类
3PL位置信息
3.1ST科室
3.2ST房间
3.3ST/PL床号/厂家不同
3.3.1ST床号
3.3.2ST网络床号/部分厂家
3.9ST设备 MAC 地址
3.10ST设备名称
7XCN主治医师
8XCN助理医师
19CX挂号号码
44DTM入院日期/时间
5.OBR--记录的请求信息

示例 OBR||||1^MON_PARAM^99COMEN|||20131213202904

序号数据类型字段说明
2EIPlacer 序号
3EIFiller 序号
6DTM请求时间
7DTM监测时间
6.OBX--观测结果

示例 OBX||NM|150344^MDC_TEMP^MDC|1.2.1.150344|39.0||36.0^39.0||||F|||20230810095017
 

序号数据类型字段说明
2ID数值类型
3CWE监测参数标识
4ST监测参数 Sub-ID
5监测参数值
6CWE单位
11ID观察结果状态
14DTM观察时间

三、简单解析示例

1.自定义消息
import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.model.AbstractMessage;
import ca.uhn.hl7v2.model.v24.segment.*;
import ca.uhn.hl7v2.parser.DefaultModelClassFactory;
import ca.uhn.hl7v2.parser.ModelClassFactory;
import com.example.hl7.v24.message.datatype.PV1;

import java.util.List;

/**
 * @author pw
 */
public class ORU_R01 extends AbstractMessage {
    public ORU_R01() {
        this(new DefaultModelClassFactory());
    }

    public ORU_R01(ModelClassFactory factory) {
        super(factory);
        this.init(factory);
    }

    private void init(ModelClassFactory factory) {
        try {
            this.add(MSH.class, true, false);
            this.add(PV1.class,true, false);
            this.add(OBR.class,true, false);
            this.add(OBX.class,true, false);
        } catch (HL7Exception var3) {
            log.error("Unexpected error creating ADT_A01 - this is probably a bug in the source code generator.", var3);
        }

    }

    @Override
    public String getVersion() {
        return "2.4";
    }

    public List<OBX> getOBX2All() throws HL7Exception {
        return this.getAllAsList("OBX2", OBX.class);
    }

    public List<OBX> getOBXAll() throws HL7Exception {
        return this.getAllAsList("OBX", OBX.class);
    }
    public PID getPID() {
        return this.getTyped("PID", PID.class);
    }

    public PV1 getPV1() {
        return this.getTyped("PV1", PV1.class);
    }

    public OBR getOBR() {
        return this.getTyped("OBR", OBR.class);
    }

    public MSH getMSH() {
        return this.getTyped("MSH", MSH.class);
    }
}
2.HL7数据解析示例
import ca.uhn.hl7v2.DefaultHapiContext;
import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.HapiContext;
import ca.uhn.hl7v2.model.Message;
import ca.uhn.hl7v2.model.Type;
import ca.uhn.hl7v2.model.Varies;
import ca.uhn.hl7v2.model.v24.datatype.NM;
import ca.uhn.hl7v2.model.v24.datatype.ST;
import ca.uhn.hl7v2.model.v24.segment.OBX;
import ca.uhn.hl7v2.parser.CustomModelClassFactory;
import ca.uhn.hl7v2.parser.ModelClassFactory;
import ca.uhn.hl7v2.parser.PipeParser;
import com.example.HL7.v24.message.ORU_R01;

import java.util.List;

public class App {
    public static void main(String[] args) throws HL7Exception {
        //要解析的自定义HL7消息,数据以\r换行
        String hl7 = "MSH|^~\\&|^GoldwayG||||20230727132606||ORU^R01^ORU_R01|09FB744EBB0000000127|P|2.4|||||||||2.16.840\r" +
                "PID|||1||4 5 6^^|||M\r" +
                "PV1|||^^3|||||||||||||||A|2\r" +
                "ORC|NW|||||||||||||||||09FB744EBB\r" +
                "OBR||||MONITOR|||20230727132606\r" +
                "OBX|1|NM|0002-4182^HR^MDIL||96|0004-0aa0^bpm^MDIL|||||X\r" +
                "OBX|2|NM|0002-5000^RESP^MDIL|||0004-0ae0^rpm^MDIL|||||X\r" +
                "OBX|3|NM|0002-4bb8^SpO2^MDIL||96|0004-0220^%^MDIL|||||F\r" +
                "OBX|4|NM|0002-480a^SpO2_Pulse^MDIL|||0004-0aa0^bpm^MDIL|||||X||||||0002-4bb8^SpO2^MDIL";
        //创建hapi上线文
        HapiContext context = new DefaultHapiContext();
        //获取解析器
        PipeParser parser = context.getPipeParser();
        //创建自定义类工厂
        ModelClassFactory factory = new CustomModelClassFactory("com.example.HL7");
        //将自定义工厂类设置到上下文中,以便hapi可以找到对应的自定义消息,并解析
        context.setModelClassFactory(factory);
        //解析
        Message parse = parser.parse(hl7);
        String version = parse.getVersion();
        System.out.println("版本--"+version);
        if(parse instanceof ORU_R01){
            ORU_R01 zdyRes = (ORU_R01) parser.parse(hl7);
                List<OBX> obxAll = zdyRes.getOBXAll();
                for(OBX o:obxAll){
                    Varies roomNumber = o.getObservationValue(0);
                    Type data1 = roomNumber.getData();
                    String idCode = o.getObservationIdentifier().getIdentifier().getValue();
                    System.out.println("监测标识编码"+idCode);
                    if(data1 instanceof NM){
                        NM data = (NM)roomNumber.getData();
                        System.out.println(data.getValue());
                    }else if(data1 instanceof ST) {
                        ST data = (ST) roomNumber.getData();
                        System.out.println(data.getValue());
                    }
            }
        }
    }
}

四、socket项目示例--已更新

已于2024-04-10更新,修复示例代码与实际项目中的出入

链接:百度网盘
提取码:zi71

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
HL7(Health Level Seven)是用于在医疗机构和健康信息系统之间交换和共享数据的国际标准。HL7数据是以文本格式进行传输,在不同的系统之间进行解析和处理是很重要的。 使用Java解析HL7数据是相对简单和方便的。Java有许多开源库可用于处理和解析HL7消息。其中一种常用的库是HAPI(HL7 Application Programming Interface)。 HAPI库提供了一些类和方法,可以轻松地读取和解析HL7消息。它支持各种版本的HL7标准,并提供了一些有用的功能,例如验证消息结构和字段及生成HL7消息。 使用HAPI解析HL7消息的一般步骤如下: 1. 导入HAPI库:首先,在Java项目中导入HAPI库。可以通过将相关JAR文件添加到类路径中来实现。 2. 创建消息对象:使用HAPI库中的类,例如HL7Parser,创建一个HL7消息对象。 3. 读取HL7消息:使用创建的消息对象,通过调用相应方法,从文件、字符串或网络等来源读取HL7消息。 4. 解析消息:解析HL7消息的几种方式是使用HAPI库提供的类和方法进行逐个字段或分段的访问。可以使用消息对象的方法,如getSegment()、getField()、getRepetition()等。 5. 处理消息数据:一旦成功解析HL7消息,可以对消息内容进行进一步处理,例如提取患者信息、诊断信息或执行特定操作。 6. 错误处理:在解析HL7消息时,应考虑错误处理。HAPI库提供了一些异常类,例如HL7Exception,可用于处理解析过程中出现的错误。 总之,使用Java解析HL7消息是可行的,并且HAPI库是一种常用的工具,可以简化解析过程。通过了解HL7消息的结构和了解HAPI库的使用,可以有效处理和利用HL7数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值