Health Level Seven International バージョン 2(HL7v2)は、組織内で発生したイベントに関するデータを提供する医療メッセージ形式です。
HL7v2 について詳しくは、HL7 バージョン 2 製品スイートのドキュメントをご覧ください。
HL7v2 ストア
HL7v2 ストアは、データセット内に存在するデータストアです。HL7v2 ストアは HL7v2 メッセージを保持します。
HL7V2Store
リソースは、HL7v2 ストアの属性の表現を提供します。各 HL7v2 ストアに対して以下のようなオプションを選択できます。
- HL7v2 ストアへの変更(たとえば、アプリケーションが新しいメッセージを受信した場合など)を Pub/Sub トピックに公開するかどうか。
- HL7v2 ストアに取り込まれたメッセージをどのように解析するか。
HL7v2 メッセージ
未加工の HL7v2 メッセージは読みにくい場合があります。たとえば、次のようなメッセージを受け取ります。
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|
Cloud Healthcare API では次のことができます。
- メッセージを解析する。
- メッセージ ヘッダー セグメント(MSH)からいくつかのフィールドを抽出して、フィルタリングできるようにする。
- 以後の処理やデータ交換を行えるようにメッセージの内容を JSON データとして表現する。
Message
リソースは、HL7v2 メッセージの表現を提供します。これには次のような情報が含まれます。
- メッセージが作成された時刻
- メッセージの作成者
- メッセージに含まれるデータ
上記のメッセージの Message
リソースは次のようになります。
{ "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" } } ] } }
メッセージの作成と取り込み
次の方法で、HL7v2 ストアに HL7v2 メッセージを保存できます。
messages.create
:Message
リソースを作成し、HL7v2 ストアに保存します。このメソッドのレスポンスには、メッセージ本文が含まれます。messages.ingest
:Message
リソースを取り込み、HL7v2 ストアに保存します。このメソッドのレスポンスには、メッセージ本文と、メッセージが受け入れられたことを確認する確認応答フィールドhl7ack
が含まれています。hl7ack
フィールドの値に関する次の重要な情報に注意してください。- 値にはレスポンス タイプが含まれています。
AA
レスポンス タイプはApplication Accept
を示し、メッセージが検証されて正常に取り込まれたことを意味します。 - 送信側と受信側は逆になります。
- 値には元のメッセージのコントロール ID が含まれています。
- 値にはレスポンス タイプが含まれています。
アプリケーションで ACK
レスポンスが必要な場合は、messages.ingest
を使用します。アプリケーションが ACK
レスポンスを必要としない場合は、messages.create
を使用します。ACK
レスポンスは HL7v2 ストアに保持されません。
HL7v2 メッセージを作成または取り込むと、サーバーによってメッセージに ID が割り当てられます。この ID はメッセージの操作時に使用できます(メッセージを削除する場合や、メッセージにユーザー定義のラベルを付ける場合など)。
MLLP と Google Cloud MLLP アダプタ
Minimal Lower Layer Protocol(MLLP)は、病院などのネットワーク内の TCP/IP 接続で HL7v2 メッセージを送信するために使用される規格です。
MLLP では、HTTP を使用する Cloud Healthcare API HL7v2 REST API への正確なマッピングは提供されません。したがって、MLLP を介して送信されたメッセージを、HTTP API または REST API が受け入れられる形式に変換するために MLLP アダプタを使用する必要があります。MLLP 経由でメッセージを Cloud Healthcare API に送信するには、Google Cloud MLLP アダプタを使用します。この MLLP アダプタの使用方法については、TCP/IP 接続で HL7v2 メッセージを送信するをご覧ください。
信頼できる認証局によって HL7v2 メッセージが署名されている必要があるアプリケーションの場合は、Google Cloud Binary Authorization MLLP アダプタを使用してください。この MLLP アダプタの使用方法については、Binary Authorization による TCP/IP 接続を介した HL7v2 メッセージの送信をご覧ください。
アダプタは、HL7v2 メッセージを解析または検査しません。Cloud Healthcare API は、メッセージが HL7v2 ストアに取り込まれると、そのメッセージを解析して検証します。その後、メッセージを表示したり、分析のためのラベル付けによって、メッセージをさらに検証できます。
実行中、アダプタはケアシステム ネットワークとアダプタの間を長時間 TCP 接続したままにします。また、MLLP 経由で HL7v2 メッセージを受信するための TCP ソケットも公開します。アダプタは、MLLP 規格で定義されているように、各メッセージの開始ブロックバイトと終了ブロックバイトを検出して、メッセージ境界を決定します。
MLLP アダプタは、ケアシステムから TCP 接続を介して HL7v2 メッセージを受信すると、HL7v2 ストアにメッセージを取り込みます。ストアは ACK
または NACK
を使用して MLLP アダプタに同期的に応答します。ACK
は、メッセージの形式が正しく、有効なヘッダー セグメントがある場合に送信されます。MLLP アダプタは ACK
または NACK
レスポンスをケアシステムに送信します。
MLLP アダプタは、HL7v2 ストアに関連付けられた Pub/Sub サブスクリプションをリッスンすることもできます。HL7v2 メッセージが作成またはストアに取り込まれると、MLLP アダプタが通知を受信し、メッセージをケアシステムに公開します。
MLLP とセキュリティ
MLLP は、暗号化や認証をネイティブ サポートしません。そのため、MLLP を使用する TCP 接続は、仮想プライベート ネットワーク(VPN)を使用して安全な接続で保護する必要があります。Cloud VPN を使用すると、MLLP アダプタが実行される GKE クラスタとオンプレミス アプリケーションとの間に安全な接続を作成できます。詳細については、Cloud VPN の構成をご覧ください。
HL7v2、MLLP、Pub/Sub
Cloud Healthcare API で HL7v2 を使用する場合の基本的な側面は、Pub/Sub 通知を構成することです。Pub/Sub でサブスクライバー アプリケーションを使用することで、HL7v2 メッセージが作成された、または HL7v2 ストアに取り込まれたときに通知を受け取ることができます。
Cloud Healthcare API の HL7v2 実装で Pub/Sub トピックを使用する方法については、Pub/Sub 通知の構成をご覧ください。
HL7v2、MLLP、Google Cloud アーキテクチャ
次の図は、HL7v2 メッセージが医療システムから送信され、Cloud Healthcare API に取り込まれる仕組みを示しています。MLLP アダプタは Google Kubernetes Engine にデプロイされ、メッセージは Cloud VPN を使用して VPN 経由で送信されます。取り込み後、HL7v2 ストアの Pub/Sub トピックにサブスクライブしているサブスクライバー アプリケーションが、メッセージが取り込まれたという通知を受け取ります。Cloud Healthcare API は、MLLP アダプタ用の ACK
も生成し、VPN トンネルを介してケアシステムに送信します。
ケアシステムから送信される HL7v2 メッセージは「ADT」メッセージであり、これは HL7v2 の一般的なメッセージです。ケアシステムが ADT メッセージを送信する際に、新しいメッセージが生成されてリモートまたは、オンプレミス システムから返されることは想定されていません。
この図は次のことを示しています。
- オンプレミスのケアシステム
- ADT HL7v2 メッセージがケアシステムから送信されます。
- HL7v2 メッセージが、MLLP アダプタを介して HL7v2 ストアに取り込まれます。
- HL7v2 ストアの構成済み Pub/Sub トピックが、メッセージが取り込まれたという通知を受け取ります。
- サブスクライバー アプリケーションは、Pub/Sub トピックからの HL7v2 メッセージ取り込みの通知をリッスンします。