HL7v2

Health Level Seven International Version 2 (HL7v2) è un formato di messaggistica clinica che fornisce dati su eventi che si verificano all'interno di un'organizzazione.

Per ulteriori dettagli su HL7v2, consulta la documentazione per la suite di prodotti HL7 Version 2.

Archivi HL7v2

Un archivio HL7v2 è un datastore che si trova all'interno di un set di dati. Gli archivi HL7v2 contengono messaggi HL7v2.

La risorsa HL7V2Store fornisce una rappresentazione degli attributi di un archivio HL7v2. Per ogni archivio HL7v2 puoi scegliere ad esempio:

  • Indica se pubblicare modifiche all'archivio HL7v2 (ad esempio, l'applicazione riceve un nuovo messaggio) in un argomento Pub/Sub.
  • Come analizzare i messaggi importati in un archivio HL7v2.

Messaggi HL7v2

I messaggi HL7v2 non elaborati possono essere difficili da leggere. Ad esempio, analizziamo il seguente messaggio:

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|

L'API Cloud Healthcare può:

  1. Analizza un messaggio.
  2. Estrai diversi campi dal segmento dell'intestazione del messaggio (MSH) per consentire l'applicazione di filtri.
  3. Rappresenta i contenuti del messaggio come dati JSON per un'ulteriore elaborazione o lo scambio di dati.

La risorsa Message fornisce una rappresentazione di un messaggio HL7v2. e include informazioni quali:

  • L'ora in cui è stato creato il messaggio.
  • Chi ha creato il messaggio
  • Quali dati contiene il messaggio

La risorsa Message per il messaggio precedente ha un aspetto simile a questo:

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

Creazione e importazione dei messaggi

Puoi archiviare i messaggi HL7v2 in un archivio HL7v2 utilizzando i seguenti metodi:

  • messages.create: crea una risorsa Message e la archivia nell'archivio HL7v2. La risposta di questo metodo contiene il corpo del messaggio.

  • messages.ingest: importa una risorsa Message e la archivia nell'archivio HL7v2. La risposta di questo metodo contiene il corpo del messaggio e un campo di accettazione, hl7ack, che verifica che il messaggio sia stato accettato.

    Di seguito sono riportate alcune informazioni importanti sul valore del campo hl7ack:

    • Il valore contiene un tipo di risposta. Un tipo di risposta AA indica Application Accept, il che significa che il messaggio è stato convalidato e importato correttamente.
    • La struttura che invia il messaggio e quella che lo riceve sono invertite.
    • Il valore contiene l'ID di controllo del messaggio originale.

Se la tua applicazione richiede una risposta ACK, utilizza messages.ingest. Se la tua applicazione non richiede una risposta ACK, usa messages.create. Le risposte ACK non sono salvate in modo permanente negli archivi HL7v2.

Al momento di creare o importare un messaggio HL7v2, il server assegna un ID al messaggio. Puoi utilizzare questo ID durante l'interazione con il messaggio, ad esempio per eliminarlo o aggiungervi etichette definite dall'utente.

MLLP e l'adattatore MLLP di Google Cloud

Il protocollo di livello inferiore minimo (MLLP) è lo standard utilizzato per la trasmissione di messaggi HL7v2 su connessioni TCP/IP all'interno di una rete, ad esempio un ospedale.

MLLP non offre una mappatura esatta all'API REST HL7v2 dell'API Cloud Healthcare, che utilizza HTTP. Pertanto, è necessario utilizzare un adattatore MLLP per convertire i messaggi trasmessi tramite MLLP in un formato accettato da un'API HTTP/REST. Per trasmettere messaggi tramite MLLP e quindi all'API Cloud Healthcare, utilizza l'adattatore MLLP di Google Cloud. Per un tutorial sull'utilizzo di questo adattatore MLLP, vedi Trasmissione di messaggi HL7v2 su connessioni TCP/IP.

Se l'applicazione richiede la firma del messaggio HL7v2 da parte di un'autorità attendibile, utilizza l'adattatore MLLP di Autorizzazione binaria di Google Cloud. Per un tutorial sull'utilizzo di questo adattatore MLLP, vedi Trasmissione di messaggi HL7v2 su connessioni TCP/IP con Autorizzazione binaria.

L'adattatore non analizza né analizza i messaggi HL7v2; l'API Cloud Healthcare analizza e convalida i messaggi man mano che vengono importati in un archivio HL7v2. Puoi quindi eseguire un'ulteriore convalida del messaggio visualizzandolo o etichettandolo per l'analisi.

Durante l'esecuzione, l'adattatore mantiene aperta una connessione TCP di lunga durata tra la rete del sistema sanitario e l'adattatore. Espone anche un socket TCP per accettare messaggi HL7v2 su MLLP. L'adattatore determina i limiti dei messaggi rilevando i byte dei blocchi iniziali e di fine di ciascun messaggio, come definito nello standard MLLP.

Quando l'adattatore MLLP riceve un messaggio HL7v2 dal sistema di assistenza tramite la connessione TCP, importa il messaggio nell'archivio HL7v2. Lo store risponde quindi in modo sincrono all'adattatore MLLP con ACK o NACK. Viene inviato un ACK se il messaggio ha il formato corretto e ha un segmento di intestazione valido. L'adattatore MLLP invia la risposta ACK o NACK al sistema di assistenza sanitaria.

L'adattatore MLLP può anche ascoltare una sottoscrizione Pub/Sub associata all'archivio HL7v2. Quando un messaggio HL7v2 viene creato o importato nell'archivio, l'adattatore MLLP riceve la notifica e lo pubblica nel sistema di assistenza sanitaria.

MLLP e sicurezza

MLLP non supporta alcuna crittografia o autenticazione in modo nativo. Di conseguenza, una connessione TCP che utilizza MLLP deve essere sottoposta a wrapping in una connessione sicura utilizzando una rete privata virtuale (VPN). Puoi utilizzare Cloud VPN per creare una connessione sicura tra il cluster GKE su cui è in esecuzione l'adattatore MLLP e la tua applicazione on-premise. Per ulteriori informazioni, consulta Configurazione di Cloud VPN.

HL7v2, MLLP e Pub/Sub

Un aspetto fondamentale dell'utilizzo di HL7v2 con l'API Cloud Healthcare prevede la configurazione delle notifiche Pub/Sub. Utilizzando un'applicazione di sottoscrizione con Pub/Sub, è possibile ricevere notifiche quando un messaggio HL7v2 viene creato o importato in un archivio HL7v2.

Consulta la pagina relativa alla configurazione delle notifiche Pub/Sub per informazioni su come utilizzare gli argomenti Pub/Sub con l'implementazione HL7v2 dell'API Cloud Healthcare.

Architettura HL7v2, MLLP e Google Cloud

Il seguente diagramma mostra come un messaggio HL7v2 viene inviato da un sistema sanitario e importato nell'API Cloud Healthcare. Viene eseguito il deployment dell'adattatore MLLP in Google Kubernetes Engine e il messaggio viene trasmesso tramite una VPN utilizzando Cloud VPN. Dopo l'importazione, un'applicazione abbonato sottoscritta all'argomento Pub/Sub dell'archivio HL7v2 riceve una notifica che indica che il messaggio è stato importato. L'API Cloud Healthcare genera inoltre un valore ACK per l'adattatore MLLP e lo invia attraverso il tunnel VPN e al sistema sanitario.

Il messaggio HL7v2 inviato dal sistema di assistenza sanitaria è un messaggio "ADT", che è un messaggio comune in HL7v2. Quando un sistema di assistenza sanitaria invia un messaggio ADT, non si aspetta che venga generato e restituito un nuovo messaggio dal sistema remoto/on-premise.

mllp_adapter

Il diagramma mostra quanto segue:

  1. Il sistema di assistenza on-premise.
  2. Un messaggio ADT HL7v2 lascia il sistema di assistenza.
  3. Il messaggio HL7v2 viene importato attraverso l'adattatore MLLP in un archivio HL7v2.
  4. L'argomento Pub/Sub configurato dell'archivio HL7v2 riceve una notifica che indica che un messaggio è stato importato.
  5. Un'applicazione di sottoscrizione rimane in ascolto delle notifiche relative alle importazioni di messaggi HL7v2 dal relativo argomento Pub/Sub.