【问题标题】:How to send HL7 ACK message as a TCP response?如何发送 HL7 ACK 消息作为 TCP 响应?
【发布时间】:2021-01-04 05:08:57
【问题描述】:

我正在通过 TCP 连接接收 HL7 消息。这些消息将始终为 ADT 类型。我正在使用 Kestrel 来侦听这些消息,并使用 NHAPI 包来处理它们。我用David Fowler's Kestrel sample code 设置了一个 TCP 监听器。所以基于这个示例代码

internal class HL7Listener : ConnectionHandler
{
    public override async Task OnConnectedAsync(ConnectionContext connection)
    {
        try
        {
            // handle the incoming message
        }
        catch (Exception exception)
        {
            // handle exceptions
        }
        finally
        {
            ACK acknowledgement = new ACK(); // create an ACK message
            PipeParser pipeParser = new PipeParser();
            string ackMessage = pipeParser.Encode(acknowledgement); // produces => MSH|^~\&|||||||ACK|||2.3
            byte[] ackMessageBytes = Encoding.UTF8.GetBytes(ackMessage);
            
            await connection.Transport.Output.WriteAsync(ackMessageBytes); // send the ACK
        }
    }
}

我正在使用工具 7Edit 将 HL7 消息发送到我的应用程序。存储库中的回声示例(上面的链接)工作正常。 echo 示例代码会生成这样的日志

但是在使用我的代码时出现此错误

所以我认为我没有正确转换 ACK 消息。任何想法如何解决这个问题?

【问题讨论】:

  • Piped HL7 通常来自血液检测仪等设备。所以 ack 通常只有一个字符(有时带有返回)。因此,您必须阅读设备手册才能了解 ACK 使用什么。您不需要等待,这可能是您的问题。由于您没有发送另一条消息,设备可能会超时。你认为什么会让代码在等待之后继续?示例代码最后没有等待。示例代码等待读取而不是写入。

标签: c# hl7 kestrel nhapi mllp


【解决方案1】:

我怀疑您在发送 ACK 时没有实现MLLP(也称为 LLP)协议。我知道,7Edit 希望实现 MLLP。这样,当您向 7Edit(TCP/MLLP 客户端)发送 ACK 时,它会在您的传入数据中查找 Start Block。它永远找不到它。考虑到垃圾,它只会丢弃您的整个消息并继续等待;如您所见,这会导致超时。

也许你应该在 7Edit 中寻找一些设置来禁用 MLLP;但这将是临时解决方案。更好的是,您实现 MLLP 块。

Description                 HEX     ASCII   Symbol
Message starting character  0B      11      <VT>
Message ending characters   1C,0D   28,13   <FS>,<CR>

实施 MLLP 后,您的消息(您在套接字上编写的内容)应该如下所示:

<VT>MSH|^~\\&|......|ACK|......<FS><CR>

请注意,&lt;VT&gt;&lt;CR&gt;&lt;FS&gt; 是上述消息中的占位符。

您应该修改以下代码行:

byte[] ackMessageBytes = Encoding.UTF8.GetBytes(ackMessage);

如下:

ackMessage = ((char) 11).ToString() + ackMessage + ((char) 28).ToString() + ((char) 13).ToString();
byte[] ackMessageBytes = Encoding.UTF8.GetBytes(ackMessage);

更多详情可以参考this解答。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2020-08-01
    • 1970-01-01
    • 2020-06-25
    相关资源
    最近更新 更多