如何解决如何发送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消息发送到我的应用程序。来自存储库的回显示例(上面的链接)工作正常。回声示例代码产生这样的日志
所以我认为我没有正确转换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 举报,一经查实,本站将立刻删除。