微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何发送HL7 ACK消息作为TCP响应?

如何解决如何发送HL7 ACK消息作为TCP响应?

我正在通过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消息发送到我的应用程序。来自存储库的回显示例(上面的链接)工作正常。回声示例代码产生这样的日志

enter image description here

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

enter image description here

所以我认为我没有正确转换ACK消息。有任何解决方法的想法吗?

解决方法

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

也许您应该在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>

请注意,<VT><CR><FS>是以上消息中的占位符。

您应该修改以下代码行:

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

如下:

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

有关更多详细信息,请参见this答案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。