【问题标题】:HL7V2 HAPI parser exception while receiving data via TCP/IP通过 TCP/IP 接收数据时出现 HL7V2 HAPI 解析器异常
【发布时间】:2021-05-19 16:20:07
【问题描述】:

我正在使用版本为 2.3 的 HAPI hapi-structures-v25 库来解析 HL7v2 消息并将其转换为 FHIR 资源。在通过 TCP 侦听器使用 HAPI 接收和解析 HL7V2 消息时,我遇到了一个奇怪的问题。

确定消息的编码。以下是消息的前 50 个字符以供参考,尽管这可能不是问题所在:MSH|^~\&|test|DrJhonDoe|TEST|UNKNOWN|20210216190432||ADT^A01^ADT_A01|60b647d4-b5a5 -4fae-a928-d4a3849de3c8|T|2.5

奇怪的是,当我尝试将此消息作为主函数中的字符串发送时,我没有收到此错误。只有当我通过 TCP/IP 将数据接收到我的 Java 函数时,我才会收到此错误。我尝试使用 Mirth 以及外部工具将 HL7 消息发送到我的接收 TCP 端口,结果是一样的。

这是我正在尝试处理的 HL7v2 消息示例

MSH|^~\\&|test|Dr.JhonDoe|TEST|UNKNOWN|20210216190432.7||ADT^A01^ADT_A01|60b647d4b5a54faea928d4a3849de3c8|T|2.5
EVN||20210216|20210216|

从 tcp/ip 接收数据时,我使用 UTF-8 字符集将字节转换为字符串。

InputStream in = connection.getInputStream();
OutputStream out = connection.getOutputStream();
receivedMessageSize = in.read(receivedByeBuffer);
String incomingHl7Message = new String(receivedByeBuffer, StandardCharsets.UTF_8);

我正在正确收到消息。但不确定为什么会出现错误。

【问题讨论】:

  • hl7Message 传递给 parser.parse 时是否正确?你在调试器中检查过吗?您是否确认其中没有任何不可打印的字符?您可能需要使用一些显示不可打印字符的文本编辑器;记事本++可能是。
  • 这正是我在这里面临的问题。我确定了这个问题。这是因为只获得 。通过普通的基本 TCP 接收数据时,我没有遇到这个问题。但是这个问题只有在通过 MLLP 接收数据时才会出现,我找不到更好的方法来处理传入字节中的这些字符@AmitJoshi

标签: java string tcp mirth hapi


【解决方案1】:

正如您提到的,您正确地收到了消息,我认为这与 HL7 无关。我的第一个猜测是这可能是与字节到字符串转换有关的问题。

但是,在 cmets 中与您讨论时,您说导致问题的字符串中存在 MLLP 字符。

我知道一些 MLLP 解析器会删除 MLLP 字符(<VT><FS><CR>);但有些没有。应用程序应删除它们。

在将字节转换为字符串之后并在调用parser.parse(hl7Message) 之前,只需使用Java 中的一些字符串替换方法删除这些字符。

我不懂java,但是hl7Message.replace(...., "") 这样的东西应该可以工作。

【讨论】:

    【解决方案2】:

    正如 Amit 的回答中提到的,它需要在 JAVA 中进行转义。当通过 MLLP 传输时,HL7v2 会将<VT>, <CR> Unicode 数据添加到文本中。这里需要的理解是这些不是垃圾字符。通过 MLLP 协议,消息的开始和结束由这些 un​​icode 字符标记,以描述帧的开始和结束。

    HAPI HL7 解析无法解析这些特殊(不可打印)字符。很高兴我在同一个论坛上找到了一个解决方案,可以在 Java 中明智地处理它。 How to remove control characters from java string?

    一个简单的正则表达式就可以解决问题,如下所示:

    .replaceAll("[\\p{Cntrl}&&[^\r\n\t]]", "");
    

    还要确保您编码的字符也可以使用 JAVA 正确处理。通常 JAVA 不擅长处理反斜杠。所以,转义反斜杠.replace("\\", "\\\\")

    这样就可以了。

    【讨论】:

    • 这可能不是一个完整的解决方案。事实上,MLLP 是一种流协议,而不是典型的套接字连接。因此,我们首先需要使用帧字符来读取消息流。但在 Java 中实现这一点并不走运。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2012-06-25
    • 2018-10-19
    • 1970-01-01
    • 2012-09-27
    • 2011-09-13
    相关资源
    最近更新 更多