HL7v2

Health Level Seven International versión 2 (HL7v2) es un formato de mensajería clínica que proporciona datos sobre los eventos que se producen dentro de una organización.

Consulta la documentación sobre el paquete de productos HL7 versión 2 para obtener más información sobre HL7v2.

Almacenes HL7v2

Un almacén HL7v2 es un almacén de datos que reside en un conjunto de datos. Los almacenes HL7v2 guardan mensajes HL7v2.

El recurso HL7V2Store proporciona una representación de los atributos de un almacén HL7v2. Para cada uno de tus almacenes HL7v2, puedes configurar diferentes opciones, como:

  • Publicar los cambios de un almacén HL7v2 (si, por ejemplo, tu aplicación recibe un mensaje nuevo) en un tema de Pub/Sub.
  • Cómo analizar los mensajes ingeridos en un almacén HL7v2.

Mensajes HL7v2

Los mensajes HL7v2 sin formato pueden ser difíciles de leer. Echa un vistazo al siguiente mensaje de ejemplo:

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|

La API Cloud Healthcare puede hacer lo siguiente:

  1. Analiza un mensaje.
  2. Extraer varios campos del segmento de encabezado del mensaje (MSH) para permitir el filtrado.
  3. Representar el contenido del mensaje como datos JSON para el posterior procesamiento o intercambio de datos.

El recurso Message proporciona una representación de un mensaje HL7v2. Incluye información como la siguiente:

  • Hora en la que se creó el mensaje.
  • Quién ha creado el mensaje
  • Qué datos contiene el mensaje

El recurso Message del mensaje anterior tiene este aspecto:

{
  "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"
        }
      }
    ]
  }
}

Crear e ingerir mensajes

Puede almacenar mensajes HL7v2 en un almacén HL7v2 mediante los siguientes métodos:

  • messages.create: crea un recurso Message y lo almacena en el almacén HL7v2. La respuesta de este método contiene el cuerpo del mensaje.

  • messages.ingest: ingiere un recurso Message y lo almacena en el almacén HL7v2. La respuesta de este método contiene el cuerpo del mensaje y un campo de confirmación, hl7ack, que verifica que el mensaje se ha aceptado.

    Es importante que tengas en cuenta lo siguiente acerca del valor del campo hl7ack:

    • El valor contiene un tipo de respuesta. Un tipo de respuesta AA indica Application Accept, lo que significa que el mensaje se ha validado e ingerido correctamente.
    • Las instalaciones de envío y de recepción se invierten.
    • El valor contiene el ID de control del mensaje original.

Si tu aplicación requiere una respuesta ACK, usa messages.ingest. Si tu aplicación no requiere una respuesta ACK, usa messages.create. ACK Las respuestas no se conservan en los almacenes HL7v2.

Al crear o ingerir un mensaje HL7v2, el servidor asigna un ID al mensaje. Puedes usar este ID al interactuar con el mensaje (por ejemplo, para eliminarlo o etiquetarlo con etiquetas definidas por el usuario).

MLLP y el adaptador Google Cloud MLLP

El protocolo de capa inferior mínimo (MLLP) es el estándar que se usa para transmitir mensajes HL7v2 a través de conexiones TCP/IP en una red, como la de un hospital.

MLLP no ofrece una asignación exacta a la API REST HL7v2 de la API Cloud Healthcare, que usa HTTP. Por lo tanto, se debe usar un adaptador MLLP para convertir los mensajes transmitidos a través de MLLP en un formato que pueda aceptar una API HTTP/REST. Para transmitir mensajes a través de MLLP y, a continuación, a la API Cloud Healthcare, usa el adaptador MLLP de Google Cloud. Para ver un tutorial sobre cómo usar este adaptador MLLP, consulta el artículo Transmitir mensajes HL7v2 a través de conexiones TCP/IP.

Si tu aplicación requiere que una autoridad de confianza firme el mensaje HL7v2, usa el adaptador MLLP de autorización binaria de Google Cloud. Para ver un tutorial sobre cómo usar este adaptador MLLP, consulta Transmitir mensajes HL7v2 a través de conexiones TCP/IP con autorización binaria.

El adaptador no analiza ni inspecciona los mensajes HL7v2. La API Cloud Healthcare analiza y valida los mensajes a medida que se ingieren en un almacén HL7v2. A continuación, puedes validar el mensaje viéndolo o etiquetándolo para analizarlo.

Mientras se ejecuta, el adaptador mantiene abierta una conexión TCP duradera entre la red del sistema de asistencia y el adaptador. También expone un socket TCP para aceptar mensajes HL7v2 a través de MLLP. El adaptador determina los límites de los mensajes detectando los bytes de inicio y de fin de bloque de cada mensaje, tal como se define en el estándar MLLP.

Cuando el adaptador MLLP recibe un mensaje HL7v2 del sistema de asistencia a través de la conexión TCP, lo ingiere en el almacén HL7v2. A continuación, la tienda responde de forma síncrona al adaptador MLLP con ACK o NACK. Se envía un ACK si el mensaje tiene el formato correcto y un segmento de encabezado válido. El adaptador MLLP envía la respuesta ACK o NACK al sistema de asistencia.

El adaptador MLLP también puede monitorizar una suscripción de Pub/Sub asociada al almacén HL7v2. Cuando se crea o se ingiere un mensaje HL7v2 en el almacén, el adaptador MLLP recibe la notificación y publica el mensaje en el sistema de asistencia.

MLLP y seguridad

MLLP no admite de forma nativa ningún cifrado ni autenticación. Por lo tanto, una conexión TCP que utilice MLLP debe envolverse en una conexión segura mediante una red privada virtual (VPN). Puedes usar Cloud VPN para crear una conexión segura entre el clúster de GKE en el que se ejecuta el adaptador MLLP y tu aplicación on-premise. Para obtener más información, consulta Configurar Cloud VPN.

HL7v2, MLLP y Pub/Sub

Un aspecto fundamental del uso de HL7v2 con la API Cloud Healthcare es la configuración de las notificaciones de Pub/Sub. Si usas una aplicación de suscriptor con Pub/Sub, puedes recibir notificaciones cuando se cree o se ingiera un mensaje HL7v2 en un almacén HL7v2.

Consulta Configurar notificaciones de Pub/Sub para ver cómo usar temas de Pub/Sub con la implementación de HL7v2 de la API Cloud Healthcare.

Arquitectura de HL7v2, MLLP y Google Cloud

En el siguiente diagrama se muestra cómo se envía un mensaje HL7v2 desde un sistema de asistencia y se ingiere en la API Cloud Healthcare. El adaptador MLLP se despliega en Google Kubernetes Engine y el mensaje se transmite a través de una VPN mediante Cloud VPN. Después de la ingestión, una aplicación suscriptora suscrita al tema de Pub/Sub del almacén HL7v2 recibe una notificación de que se ha ingerido el mensaje. La API Cloud Healthcare también genera un ACK para el adaptador MLLP y lo envía de vuelta a través del túnel VPN al sistema de asistencia.

El mensaje HL7v2 enviado desde el sistema de asistencia es un mensaje "ADT", que es un mensaje habitual en HL7v2. Cuando un sistema de asistencia envía un mensaje ADT, no espera que el sistema remoto o local genere y devuelva un nuevo mensaje.

mllp_adapter

En el diagrama se muestra lo siguiente:

  1. El sistema de asistencia local.
  2. Un mensaje HL7v2 de ADT abandona el sistema de asistencia.
  3. El mensaje HL7v2 se ingiere a través del adaptador MLLP en un almacén HL7v2.
  4. El tema de Pub/Sub configurado del almacén HL7v2 recibe una notificación de que se ha ingerido un mensaje.
  5. Una aplicación de suscriptor escucha las notificaciones de las ingestiones de mensajes HL7v2 de su tema de Pub/Sub.