如何发送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答案。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...