Как отправить сообщение HL7 ACK в качестве ответа TCP?
Я получаю сообщения HL7 через TCP-соединение. Эти сообщения всегда будут иметь тип ADT. Я использую Kestrel для прослушивания этих сообщений и пакет NHAPI для их обработки. Я взял пример кода Kestrel Дэвида Фаулера, чтобы настроить прослушиватель 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. Любые идеи, как это исправить?
1 ответ
Я сомневаюсь, что вы не реализуете протокол MLLP (также называемый LLP) при отправке ACK. Я знаю, 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);
Для получения дополнительной информации вы можете обратиться к этому ответу.