HL7v2

O Health Level Seven International versão 2 (HL7v2) é um formato de mensagens médicas que fornece dados sobre eventos que ocorrem dentro de uma organização.

Consulte a documentação do pacote de produtos HL7 versão 2 para mais detalhes sobre HL7v2.

Armazenamentos HL7v2

Um armazenamento HL7v2 é um armazenamento de dados que reside em um conjunto de dados. Os armazenamentos HL7v2 estocam mensagens HL7v2.

O recurso HL7V2Store fornece uma representação dos atributos de um armazenamento HL7v2. Para cada um dos armazenamentos HL7v2, é possível escolher opções como:

  • Se as alterações serão publicadas no armazenamento HL7v2 (se, por exemplo, o aplicativo receber uma nova mensagem) em um tópico do Pub/Sub.
  • Como analisar mensagens ingeridas em um armazenamento HL7v2.

Mensagens HL7v2

As mensagens HL7v2 brutas podem ser difíceis de ler. Por exemplo, veja a seguinte mensagem:

MSH|^~\&|FROM_APP|FROM_FACILITY|TO_APP|TO_FACILITY|20180101000000||ADT^A01|20180101000000|P|2.5|
EVN|A01|20110613083617|
PID|1|843125^^^^MRN|21004053^^^^MRN~2269030303^^^^ORGNMBR||SULLY^BRIAN||19611209|M|||123 MAIN ST^^CITY^STATE^12345|
PV1||I|H73 RM1^1^^HIGHWAY 01 CLINIC||||5148^MARY QUINN|||||||||Y||||||||||||||||||||||||||||20180101000000|

A API Cloud Healthcare pode realizar as seguintes ações:

  1. Analisar uma mensagem.
  2. Extrair vários campos do segmento de cabeçalho da mensagem (MSH, na sigla em inglês) para permitir a filtragem.
  3. Representar o conteúdo da mensagem como dados JSON para processamento ou troca de dados.

O recurso Message fornece uma representação de uma mensagem HL7v2. Ele inclui informações como:

  • a hora em que a mensagem foi criada;
  • quem criou a mensagem;
  • quais dados a mensagem contém.

O recurso Message da mensagem anterior tem esta aparência:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages/W5_pxOBkoLoCxiFxE4cg8zwEWRzMlOzIfaLBrZPf0Zg=",
  "data": "TVNIfF5+XCZ8RlJPTV9BUFB8RlJPTV9GQUNJTElUWXxUT19BUFB8VE9fRkFDSUxJVFl8MjAxODAxMDEwMDAwMDB8fEFEVF5BMDF8MjAxODAxMDEwMDAwMDB8UHwyLjV8DUVWTnxBMDF8MjAxMTA2MTMwODM2MTd8DVBJRHwxfDg0MzEyNV5eXl5NUk58MjEwMDQwNTNeXl5eTVJOfjIyNjkwMzAzMDNeXl5eT1JHTk1CUnx8U1VMTFleQlJJQU58fDE5NjExMjA5fE18fHwxMjMgTUFJTiBTVF5eQ0lUWV5TVEFURV4xMjM0NXwNUFYxfHxJfEg3MyBSTTFeMV5eSElHSFdBWSAwMSBDTElOSUN8fHx8NTE0OF5NQVJZIFFVSU5OfHx8fHx8fHx8WXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwyMDE4MDEwMTAwMDAwMHw=",
  "sendFacility": "FROM_FACILITY",
  "sendTime": "2018-01-01T00:00:00Z",
  "messageType": "ADT",
  "createTime": "2018-01-01T00:00:00Z",
  "patientIds": [
    {
      "value": "843125",
      "type": "MRN"
    },
    {
      "value": "21004053",
      "type": "MRN"
    },
    {
      "value": "2269030303",
      "type": "ORGNMBR"
    }
  ],
  "parsedData": {
    "segments": [
      {
        "segmentId": "MSH",
        "fields": {
          "5": "TO_FACILITY",
          "2": "FROM_APP",
          "3": "FROM_FACILITY",
          "0": "MSH",
          "1": "^~\\&",
          "10": "P",
          "4": "TO_APP",
          "9": "20180101000000",
          "8.1": "ADT",
          "11": "2.5",
          "8.2": "A01",
          "6": "20180101000000"
        }
      },
      {
        "segmentId": "EVN",
        "fields": {
          "1": "A01",
          "2": "20110613083617",
          "0": "EVN"
        }
      },
      {
        "segmentId": "PID",
        "fields": {
          "1": "1",
          "3[0].1": "21004053",
          "3[1].1": "2269030303",
          "3[0].5": "MRN",
          "0": "PID",
          "11.4": "STATE",
          "11.5": "12345",
          "2.1": "843125",
          "2.5": "MRN",
          "5.1": "SULLY",
          "11.3": "CITY",
          "8": "M",
          "11.1": "123 MAIN ST",
          "3[1].5": "ORGNMBR",
          "7": "19611209",
          "5.2": "BRIAN"
        }
      },
      {
        "segmentId": "PV1",
        "fields": {
          "44": "20180101000000",
          "7.1": "5148",
          "16": "Y",
          "2": "I",
          "3.2": "1",
          "3.4": "HIGHWAY 01 CLINIC",
          "7.2": "MARY QUINN",
          "3.1": "H73 RM1",
          "0": "PV1"
        }
      }
    ]
  }
}

Como criar e ingerir mensagens

É possível armazenar mensagens HL7v2 em um armazenamento HL7v2 usando os seguintes métodos:

  • messages.create: cria um recurso Message e o salva no armazenamento HL7v2. A resposta desse método contém o corpo da mensagem.

  • messages.ingest: ingere um recurso Message e o salva no armazenamento HL7v2. A resposta desse método contém o corpo da mensagem e um campo de confirmação, hl7ack, que verifica se a mensagem foi aceita.

    Observe as seguintes informações importantes sobre o valor do campo hl7ack:

    • O valor contém um tipo de resposta. Um tipo de resposta AA indica Application Accept, o que significa que a mensagem foi validada e ingerida.
    • As instalações de envio e de recebimento são revertidas.
    • O valor contém o ID de controle da mensagem original.

Se o aplicativo exigir uma resposta ACK, use messages.ingest. Se o aplicativo não exigir uma resposta ACK, use messages.create. As respostas ACK não são mantidas em armazenamentos HL7v2.

Quando você cria ou ingere uma mensagem HL7v2, a mensagem recebe um código pelo servidor. É possível usar esse código ao interagir com a mensagem. Por exemplo, para excluir a mensagem ou aplicar rótulos definidos pelo usuário.

MLLP e o adaptador MLLP do Google Cloud

O protocolo mínimo de camada inferior (MLLP, na sigla em inglês) é o padrão usado para transmitir mensagens HL7v2 por conexões TCP/IP em uma rede, como um hospital.

O MLLP não oferece um mapeamento exato para a API REST HL7v2 da API Cloud Healthcare, que usa HTTP. Portanto, um adaptador MLLP precisa ser usado para converter mensagens transmitidas por MLLP em um formato que uma API HTTP/REST possa aceitar. Para transmitir mensagens pela MLLP e depois para a API Cloud Healthcare, use o adaptador MLLP do Google Cloud. Para um tutorial usando esse adaptador MLLP, consulte Como transmitir mensagens HL7v2 por conexões TCP/IP.

Se o aplicativo exigir que uma autoridade confiável assine a mensagem HL7v2, use o Adaptador MLLP de autorização binária do Google Cloud. Para um tutorial usando esse adaptador MLLP, consulte Como transmitir mensagens HL7v2 por conexões TCP/IP com autorização binária.

O adaptador não analisa nem inspeciona as mensagens HL7v2. A API Cloud Healthcare analisa e valida as mensagens conforme elas são ingeridas em um armazenamento HL7v2. Em seguida, é possível fazer mais validações na mensagem visualizando-a ou rotulando-a para análise.

Enquanto é executado, o adaptador mantém uma conexão TCP de longa duração aberta entre a rede do sistema de atendimento e o adaptador. Ele também expõe um soquete TCP para aceitar mensagens HL7v2 sobre MLLP. O adaptador determina os limites da mensagem detectando os bytes do bloco inicial e final de cada mensagem, conforme definido no padrão MLLP.

Quando o adaptador MLLP recebe uma mensagem HL7v2 do sistema de atendimento pela conexão TCP, ele ingere a mensagem no armazenamento HL7v2. Em seguida, o armazenamento responde de forma síncrona ao adaptador MLLP com ACK ou NACK. Um ACK será enviado se a mensagem for formada corretamente e tiver um segmento de cabeçalho válido. O adaptador MLLP envia a resposta ACK ou NACK para o sistema de atendimento.

O adaptador MLLP também pode detectar uma assinatura do Pub/Sub associada ao armazenamento HL7v2. Quando uma mensagem HL7v2 é criada ou ingerida no armazenamento, o adaptador MLLP recebe a notificação e publica a mensagem no sistema de atendimento.

MLLP e segurança

O MLLP não é compatível com nenhuma criptografia ou autenticação. Portanto, uma conexão TCP que usa o MLLP precisa ser encapsulada em uma conexão segura usando uma rede privada virtual (VPN). É possível usar o Cloud VPN para criar uma conexão segura entre o cluster do GKE em que o adaptador MLLP é executado e o aplicativo local. Para mais informações, consulte Como configurar o Cloud VPN.

HL7v2, MLLP e Pub/Sub

Um aspecto fundamental do uso do HL7v2 com a API Cloud Healthcare envolve a configuração de notificações do Pub/Sub. Ao usar um aplicativo de assinatura com o Pub/Sub, é possível receber notificações quando uma mensagem HL7v2 é criada ou ingerida em um armazenamento HL7v2.

Leia Como configurar notificações do Pub/Sub para ver como usar tópicos do Pub/Sub com a implementação HL7v2 da API Cloud Healthcare.

Arquitetura HL7v2, MLLP e Google Cloud

O diagrama a seguir mostra como uma mensagem HL7v2 é enviada de um sistema de saúde e ingerida na API Cloud Healthcare. O adaptador MLLP é implantado no Google Kubernetes Engine e a mensagem é transmitida por uma VPN usando o Cloud VPN. Após a ingestão, um aplicativo de assinatura inscrito no tópico Pub/Sub da loja HL7v2 recebe uma notificação de que a mensagem foi ingerida. A API Cloud Healthcare também gera um ACK para o adaptador MLLP e o envia de volta pelo túnel da VPN para o sistema de atendimento.

A mensagem HL7v2 enviada do sistema de atendimento é uma mensagem "ADT", que é uma mensagem comum no HL7v2. Quando um sistema de atendimento envia uma mensagem ADT, ele não espera que uma nova mensagem seja gerada e retornada do sistema remoto/local.

mllp_adapter

O diagrama mostra o seguinte fluxo:

  1. O sistema de atendimento no local.
  2. Uma mensagem ADT HL7v2 sai do sistema de atendimento.
  3. A mensagem HL7v2 é ingerida por meio do adaptador MLLP em um armazenamento HL7v2.
  4. O tópico do Pub/Sub configurado pelo armazenamento HL7v2 recebe uma notificação de que uma mensagem foi ingerida.
  5. Um aplicativo de assinatura detecta notificações de ingestão de mensagens HL7v2 do tópico do Pub/Sub.