HL7v2

La versión 2 internacional del nivel de salud siete (HL7v2) es un formato de mensaje clínico que proporciona datos sobre los eventos que ocurren dentro de una organización.

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

Almacenes de HL7v2

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

El recurso HL7V2Store proporciona una representación de los atributos de un almacén de HL7v2. En cada uno de tus almacenes de HL7v2, puedes elegir opciones como las siguientes:

  • Si se deben publicar cambios en el almacén de HL7v2 (si, por ejemplo, tu aplicación recibe un mensaje nuevo) en un tema de Pub/Sub
  • Cómo analizar los mensajes transferidos a un almacén de HL7v2

Mensajes de HL7v2

Los mensajes de HL7v2 sin procesar pueden ser difíciles de leer. Por ejemplo, tomemos el siguiente mensaje:

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 de Cloud Healthcare puede hacer lo siguiente:

  1. Analiza un mensaje.
  2. Extrae varios campos del segmento de encabezado del mensaje (MSH) para permitir el filtrado.
  3. Representa el contenido del mensaje como datos JSON para el procesamiento en mayor grado o el intercambio de datos.

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

  • La hora en la que se creó el mensaje
  • Quién creó el mensaje
  • Qué datos contiene el mensaje

El recurso Message del mensaje anterior se ve así:

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

Crea y transfiere mensajes

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

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

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

    Ten en cuenta la siguiente información importante sobre el 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 validó y se transfirió correctamente.
    • La instalación de envío y la de recepción están revertidas.
    • 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. Las respuestas ACK no se conservan en los almacenes de HL7v2.

Cuando creas o transfieres un mensaje de HL7v2, el servidor le asigna un ID. Puedes usar este ID cuando interactúes con el mensaje (por ejemplo, para borrar el mensaje o colocarle etiquetas definidas por el usuario).

MLLP y el adaptador de MLLP de Google Cloud

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

MLLP no ofrece una asignación exacta a la API de REST de HL7v2 de la API de Cloud Healthcare, que usa HTTP. Por lo tanto, se debe usar un adaptador de MLLP para convertir los mensajes transmitidos a través de MLLP en un formato que una API de HTTP o de REST pueda aceptar. Para transmitir mensajes en MLLP y, luego, a la API de Cloud Healthcare, usa el adaptador de MLLP de Google Cloud. Para obtener un instructivo mediante este adaptador de MLLP, consulta Transmite mensajes de HL7v2 en conexiones de TCP/IP.

Si tu aplicación requiere que una autoridad de confianza firme el mensaje de HL7v2, usa el adaptador de MLLP de autorización binaria de Google Cloud. Para obtener un instructivo mediante este adaptador de MLLP, consulta Transmite mensajes de HL7v2 en conexiones de TCP/IP con autorización binaria.

El adaptador no analiza ni inspecciona los mensajes de HL7v2. La API de Cloud Healthcare analiza y valida los mensajes a medida que se transfieren a un almacén de HL7v2. Luego, puedes realizar una validación adicional del mensaje si los observas o lo etiquetas para su análisis.

Mientras se ejecuta, el adaptador mantiene abierta una conexión de TCP de larga duración entre la red del sistema de atención médica y el adaptador. También expone un socket de TCP para aceptar mensajes de HL7v2 en MLLP. El adaptador determina los límites del mensaje mediante la detección de los bytes del bloque del inicio y del final de cada mensaje, como se define en el estándar de MLLP.

Cuando el adaptador de MLLP recibe un mensaje de HL7v2 del sistema de atención médica a través de la conexión de TCP, lo transfiere al almacén de HL7v2. Luego, la tienda responde de forma síncrona al adaptador de 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 de MLLP envía la respuesta ACK o NACK al sistema de atención médica.

El adaptador de MLLP también puede escuchar una suscripción de Pub/Sub asociada con el almacén de HL7v2. Cuando se crea o transfiere un mensaje de HL7v2 en el almacén, el adaptador de MLLP recibe la notificación y publica el mensaje en el sistema de atención médica.

MLLP y la seguridad

MLLP no admite de forma nativa ninguna encriptación ni autenticación. Por lo tanto, una conexión de TCP que usa MLLP debe estar unida 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 de MLLP y tu aplicación local. Para obtener más información, consulta Configura Cloud VPN.

HL7v2, MLLP y Pub/Sub

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

Lee Configura las notificaciones de Pub/Sub para ver cómo usar los temas de Pub/Sub con la implementación de HL7v2 de la API de Cloud Healthcare.

La arquitectura Google Cloud, HL7v2 y MLLP

En el siguiente diagrama, se muestra cómo se envía un mensaje de HL7v2 desde un sistema de atención médica y se transfiere a la API de Cloud Healthcare. El adaptador de MLLP se implementa en Google Kubernetes Engine y el mensaje se transmite a través de una VPN mediante Cloud VPN. Después de la transferencia, una aplicación del suscriptor que está suscrita al tema de Pub/Sub del almacén de HL7v2 recibe una notificación de que el mensaje se transfirió. La API de Cloud Healthcare también genera un ACK para el adaptador de MLLP y lo envía de regreso al túnel VPN y al sistema de atención médica.

El mensaje de HL7v2 que se envía desde el sistema de atención médica es un mensaje de "ADT", que es un mensaje común en HL7v2. Cuando un sistema de atención médica envía un mensaje de ADT, no espera a que se genere un mensaje nuevo ni se envíe de regreso desde el sistema remoto o local.

mllp_adapter

En el diagrama, se muestra lo siguiente:

  1. El sistema local de atención médica
  2. Que un mensaje de HL7v2 de ADT sale del sistema de atención médica
  3. Que el mensaje de HL7v2 se transfiere a través del adaptador de MLLP a un almacén de HL7v2
  4. Que el tema configurado de Pub/Sub del almacén de HL7v2 recibe una notificación que indica que se transfirió un mensaje
  5. Que una aplicación del suscriptor escucha las notificaciones de transferencia de mensajes de HL7v2 desde su tema de Pub/Sub