Как отправить сообщение 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);

Для получения дополнительной информации вы можете обратиться к этому ответу.

Другие вопросы по тегам