如何发送 HL7 ACK 消息作为 TCP 响应?
How to send HL7 ACK message as a TCP response?
我正在通过 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 消息发送到我的应用程序。来自存储库(link 以上)的 echo 示例工作正常。 echo 示例代码生成这样的日志
但是在使用我的代码时出现此错误
所以我想我没有正确转换ACK消息。有什么解决办法吗?
我怀疑您在发送 ACK 时没有执行 MLLP(也称为 LLP)协议。我知道,7Edit 希望实施 MLLP。这样,当您向 7Edit(TCP/MLLP 客户端)发送 ACK 时,它会在您的传入数据中查找起始块。它永远找不到它。考虑到垃圾,它只是丢弃您的整个消息并继续等待;如您所见,这会导致超时。
也许你应该在 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);
详情可参考回答
我正在通过 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 消息发送到我的应用程序。来自存储库(link 以上)的 echo 示例工作正常。 echo 示例代码生成这样的日志
但是在使用我的代码时出现此错误
所以我想我没有正确转换ACK消息。有什么解决办法吗?
我怀疑您在发送 ACK 时没有执行 MLLP(也称为 LLP)协议。我知道,7Edit 希望实施 MLLP。这样,当您向 7Edit(TCP/MLLP 客户端)发送 ACK 时,它会在您的传入数据中查找起始块。它永远找不到它。考虑到垃圾,它只是丢弃您的整个消息并继续等待;如您所见,这会导致超时。
也许你应该在 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);
详情可参考