ניהול נתוני FHIR מאפליקציית Android באמצעות OHS ו-Google Cloud

1. מבוא

ב-Codelab הזה נלמד איך להשתמש ב-OHS (Open Health Stack) וב-Google Cloud Healthcare API כדי ליצור פתרונות חדשניים בתחום הבריאות שהם מאובטחים, ניתנים להרחבה ועומדים בדרישות התאימות. השילוב של הכלים המתקדמים האלה מאפשר לעובדי מערכת הבריאות ולמפתחים ליצור פתרונות מבוססי-נתונים שיכולים לשפר באופן משמעותי את הטיפול במטופלים ואת התוצאות שלהם.

אנחנו מתכוונים להשתמש ביכולות של Open Health Stack ו-Google Cloud Healthcare API באפליקציה לנייד שמשתמשת ב-Android-FHIR SDK כדי לאפשר למשתמשים לנהל רשומות של מטופלים בפורמט FHIR ב-Google Cloud.

בואו נצלול לשלבי ההטמעה.

מה תפַתחו

בהטמעה הזו,

  • אנחנו נשתמש בספריית Structured Data Capture כדי לעבד שאלון, ובספריית FHIR Engine כדי לאחסן את תוכן ה-FHIR של התשובה
  • לאחר מכן, הנתונים יועלו אל Cloud FHIR Store באמצעות Cloud Healthcare API
  • לפני ההעלאה, נבצע אימות באמצעות Firebase

8514f90f016ecfc0.png

התרשים שלמעלה מייצג את התהליך. בבלוג אפשר לקרוא הסבר מפורט על כל רכיב.

2. דרישות

  • דפדפן, כמו Chrome או Firefox
  • פרויקט ב-Google Cloud שהחיוב בו מופעל
  • גרסה עדכנית של Android Studio
  • הגדרת אמולטור Android (אפשר גם להשתמש במכשיר Android פיזי)

יצירת הפרויקט

  1. ב-מסוף Google Cloud, בדף לבחירת הפרויקט, בוחרים או יוצרים פרויקט ב-Google Cloud.
  2. מוודאים שהחיוב מופעל בפרויקט ב-Cloud. כך בודקים אם החיוב מופעל בפרויקט
  3. מפעילים את ממשקי ה-API הנדרשים (BigQuery, ‏ Healthcare API)

הפעלת Cloud Shell

  1. תשתמשו ב-Cloud Shell, סביבת שורת פקודה שפועלת ב-Google Cloud וכוללת את bq שנטען מראש:

בפינה הימנית העליונה של Cloud Console, לוחצים על 'הפעלת Cloud Shell':

51622c00acec2fa.png

  1. אחרי שמתחברים ל-Cloud Shell, אמור להופיע אימות שכבר בוצע ושהפרויקט כבר מוגדר לפי מזהה הפרויקט. אם הפרויקט לא מוגדר, משתמשים בפקודה הבאה כדי להגדיר אותו:
gcloud config set project <YOUR_PROJECT_ID>

אפשר לעיין במאמרי העזרה בנושא פקודות gcloud ושימוש בהן.

3. הגדרת Healthcare API

  1. מוודאים ש-Healthcare API מופעל: עוברים אל API Library במסוף Google Cloud, מחפשים את Healthcare API, לוחצים על ENABLE (הפעלה) ומפעילים את ה-API ומוסיפים את חשבון השירות של Healthcare לפרויקט.
  2. הענקת הרשאות אדמין ב-BigQuery לחשבון השירות מריצים את פקודת gcloud הבאה במסוף Cloud Shell כדי להעניק הרשאה:
gcloud projects add-iam-policy-binding <<YOUR_PROJECT_ID>> \
--member=serviceAccount:service-<<PROJECT_NUMBER>>@gcp-sa-healthcare.iam.gserviceaccount.com  --role=roles/bigquery.admin

הערה: אפשר למצוא את PROJECT_ID ואת PROJECT_NUMBER במסוף. למידע נוסף על זיהוי הפרויקט, אפשר לעיין במסמך.

יצירת מערך נתונים של שירותי בריאות

ב-Cloud Shell, מריצים את הפקודה הבאה כדי ליצור את מערך הנתונים של Healthcare:

gcloud beta healthcare datasets create <<DATASET_ID>> --location=us-central1

מגדירים את המיקום לאזור.

יצירת מאגר נתונים של FHIR

ב-Cloud Shell, מריצים את הפקודה הבאה כדי ליצור את מאגר הנתונים של FHIR:

gcloud beta healthcare fhir-stores create <<FHIR_STORE>> \
  --dataset=<<DATASET_ID>> --location=us-central1 --version=r4

מגדירים את המיקום לאזור.

4. הגדרה וסטרימינג ב-BigQuery

המאמר הזה מסביר איך לשמור נתונים מ-FHIR Store במערך נתונים ב-BigQuery כדי שאפשר יהיה להריץ עליהם שאילתות, לתכנת אותם ולנתח אותם באמצעות היכולות של BigQuery ו-BQML.

יצירת מערך נתונים ב-BigQuery

מערך נתונים ב-BigQuery הוא אוסף של טבלאות. כל הטבלאות במערך נתונים מאוחסנות באותו מיקום. אפשר גם לצרף אמצעי בקרת גישה מותאמים אישית כדי להגביל את הגישה למערך נתונים ולטבלאות שלו.

ב-Cloud Shell, מריצים את הפקודה הבאה:

bq mk --location=us-central1 --dataset <<PROJECT_ID>>:<<BQ_DATASET>>

מגדירים את המיקום לאזור.

יצירת סטרימינג של BigQuery

כדי לייצא שינויים במשאבים ל-BigQuery בכל פעם שנוצר, מתעדכן, מתוקן או נמחק משאב FHIR במאגר FHIR, צריך להשתמש בסטרימינג. כל חנות יכולה להכיל עד 10 הגדרות סטרימינג.

  1. נכנסים לדף browser במסוף Google Cloud Healthcare.
  2. לוחצים על מערך הנתונים החדש שנוצר.
  3. לוחצים על מאגר הנתונים שנוצר 7acaa364337086aa.png
  4. לוחצים על 'הוספת הגדרות סטרימינג חדשות'.

caa2cc881d3406aa.png

  1. בוחרים את מערך הנתונים החדש שנוצר ב-BigQuery מהרשימה, את סוג הסכימה Analytics V2 ואת סוג המשאב Patient (אפשר לבחור כמה סוגי משאבים) מהרשימה, ולוחצים על Done (סיום).

1e038c694fcca1ef.png

זה הכול. ההגדרה הושלמה ואפשר לשמור נתונים במאגר FHIR ולהזרים אותם ל-BigQuery.

5. Cloud Functions (Write R4 Data to FHIR Datastore using Healthcare API)

‫Cloud Functions מאפשר לכם לכתוב את הקוד ולפרוס אותו בענן בצורה נוחה וללא שרת. הוא ניתן להרחבה, מבוסס על תשלום לפי שימוש, מבוסס על אירועים ופתוח מבחינת טכנולוגיה ותמיכה בשפות. מידע על תכונות נוספות מופיע במאמרי העזרה.

הפונקציה שנכתוב נועדה לבצע אימות ולכתוב נתונים שמגיעים בפורמט FHIR R4 אל מאגר הנתונים של FHIR באמצעות Cloud Healthcare API. כדי ליצור את הפונקציה של Cloud Functions:

  1. עוברים אל Cloud Functions ולוחצים על CREATE FUNCTION (יצירת פונקציה).
  2. מגדירים את השם ל-fhir-datastore-proxy, את האזור ל-us-central1 ואת אפשרות האימות ל-Require Authentication (נדרש אימות).
  3. מרחיבים את ההגדרות של זמן הריצה, ה-build, החיבורים והאבטחה. תוסיפו חמישה משתני סביבה של זמן ריצה:

שם: CLOUD_FUNCTIONS_ENDPOINT | ערך: כתובת ה-URL של נקודת הקצה של הפונקציה. הכתובת הזו מופיעה בקטע Authentication (אימות) שלמעלה, והיא תהיה מהצורה הבאה: https://us-central1-PROJECT_ID.cloudfunctions.net/fhir-datastore-proxy

שם: PROJECT_ID | ערך: מזהה הפרויקט

שם: DATASET_LOCATION | ערך: המיקום של מאגר הנתונים של FHIR

שם: DATASET_ID | ערך: המזהה של Healthcare Datastore

שם: FHIR_STORE_ID | ערך: מזהה מאגר FHIR

  1. לוחצים על Next (הבא) כדי לעבור לדף הבא, שבו נוסיף את הקוד
  2. עכשיו אמור להופיע עורך מוטבע. בוחרים ב-Java 17 כשפה ועוברים למחלקה HelloHttpFunction.java. משנים את השם שלו ל-FhirDatastoreProxy.java. אל תשכחו לשנות את השם של נקודת הכניסה ל-gcfv2.FhirDatastoreProxy
  3. מעתיקים את הקוד ממאגר הקודים ומדביקים אותו בכלי העריכה המוטבע
  4. עוברים לקובץ pom.xml ומעתיקים את קובץ ה-POM במאגר אל העורך המוטבע.
  5. לוחצים על DEPLOY (פריסה), והפונקציה תיצור ותפעל בקרוב

הערה:

  1. ה-Cloud Healthcare API שבו נעשה שימוש בפונקציה הזו משתמש ב-Application Default Credential כדי לאמת את הבקשות שמגיעות ל-Healthcare API
  2. שומרים את כתובת ה-URL של הפונקציה שפרסנו כדי שנוכל להפעיל אותה מאפליקציית Android. עד עכשיו יצרנו את כל החלקים שנדרשים לאפליקציית Android כדי לכתוב נתוני FHIR ל-BigQuery באמצעות Healthcare API באופן עצמאי. עכשיו צריך לוודא שכל החלקים מחוברים ושממשק ה-API מופעל כששולחים שאלון.

6. הגדרה של פרויקט Android ו-Firebase

נשתמש בגרסה עדכנית של Android Studio ובאמולטור של Android (אפשר גם להשתמש במכשיר Android פיזי). אחרי שהיא מוכנה, פועלים לפי השלבים הבאים:

  1. משכפלים את מאגר FHIR App Examples: ‏ https://github.com/google/fhir-app-examples
  2. פותחים את Android Studio, בוחרים באפשרות Import Project (ייבוא פרויקט) (Gradle,‏ Eclipse ADT וכו') ובוחרים את התיקייה cloudfunction/ מתוך קוד המקור שהורדתם קודם. פותחים את הקובץ app/google-services.json. הוא ריק וצריך למלא אותו.

מריצים את הפקודה ‎./gradlew signingReport כדי ליצור מפתח SHA-1, ורושמים את הערך של השדה SHA1 בקטע debug variant (גרסת ניפוי הבאגים).

מוסיפים את האפליקציה ל-Firebase באמצעות מסוף Firebase (פועלים לפי שלבים 1 ו-2). בשדה 'אישור חתימה לניפוי באגים SHA-1', ממלאים את הערך מהשלב הקודם.

מורידים את הקובץ google-services.json ומחליפים את התוכן מ-Firebase בקובץ הריק בתיקיית האפליקציה

‫Firebase SDK כבר נוסף לקובצי ה-build של Gradle

  1. פותחים את הקובץ FhirApplication.kt ומגדירים את השדה baseUrl לכתובת ה-URL של Cloud Function.
  2. בוחרים באפשרות 'סנכרון הפרויקט עם קובצי Gradle' בסרגל הכלים של Android Studio.

סיימנו את ההגדרה ואת הוספת התלות של ההטמעה.

7. הגדרה של שאלון ותשובה

כבר הגדרנו את השאלון במאגר. אבל בואו נבדוק את הקוד:

  1. מוודאים שהרכיב FragmentContainerView נמצא בתוך ConstraintLayout בקובץ app/src/main/res/layout/activity_main.xml
  2. מוודאים של-QuestionnaireFragment יש שאלון FHIR מקודד ב-JSON כדי לעבד את ה-Fragment

במקרה הזה נשתמש ב-json –‏ new-patient-registration-paginated.json – כדי לעבד את הפרגמנט. בדיקת הקבצים MainActivity.kt, ‏ AddPatientFragment.kt ו-AddPatientViewModel.kt

עכשיו, אחרי שאימתנו את הפראגמנט, את ה-JSON ואת המודל, אפשר להריץ את האפליקציה ולנסות להזין תשובות בשדות שבשאלון.

תראו את האימות של מחרוזות, תאריכים, שדות מספריים ותנאים אחרים

אתם יכולים להריץ את האפליקציה ולבדוק את היומן כדי לראות את הרשומה שנוצרה

9e1bb440074f1a88.png

כאן אפשר לקרוא מידע נוסף על השימוש בפרגמנטים. זהו, סיימנו להגדיר את קטע השאלון ואת התשובה.

8. תצוגת תוצאות של FHIRStore ומערך נתונים ב-BigQuery

אחרי שסיימנו את ההגדרה והעדכונים, לוחצים על Sync Project with Gradle Files (סנכרון הפרויקט עם קובצי Gradle). בסיום,

  1. מריצים את האפליקציה באמולטור Android וצופים בטעינת השאלון
  2. עונים על השאלות ולוחצים על 'שליחה' בחלק העליון.
  3. ההודעה 'הפרטים של המטופל נשמרו' אמורה להופיע באפליקציה

הצגת תוצאה של FHIR Store

נכנסים למסוף Google Cloud Healthcare FHIRViewer

1064f03b4e1e45f5.png

בוחרים את מאגר FHIR, את השאילתה ולוחצים על 'הפעלת חיפוש'. תוצאות החיפוש אמורות להופיע מיד מתחת. 37a070480a06362c.png

צפייה בתוצאה של מערך נתונים ב-BigQuery

עוברים אל מסוף Google Cloud BigQuery ובחלונית 'סייר' עוברים אל מערך הנתונים שיצרתם עבור הפרויקט הזה.

7c483ec6d578b8cd.png

לוחצים על 'תצוגה מקדימה' ורואים את אותו מספר ואת אותם נתונים שמופיעים במאגר Healthcare FHIR במערך הנתונים של BigQuery.

faafeae4a837a41c.png

עכשיו אפשר להריץ שאילתות BigQuery SQL, ‏ Analytics ולמידת מכונה על נתוני FHIR ששמרתם במערך הנתונים בענן.

9. חיפוש ויכולת אופליין

כדי לוודא שהאפליקציה של OHS powered Android FHIR SDK תפעל במצב אופליין, חשוב לפעול לפי הנחיות העיצוב שצריך להפעיל בהטמעה שמתוארת כאן.

יש שתי דרכים לחפש משאבי FHIR:

  1. כלי לצפייה ב-FHIR במסוף Google Cloud
  2. שיטת חיפוש FHIR באמצעות בקשות GET או POST

10. הדגמה של אפליקציה

עכשיו, אחרי שפיתחנו את האפליקציה, נשתמש בה ונראה את התוצאה בענן.

11. הסרת המשאבים

כדי לא לצבור חיובים לחשבון Google Cloud על המשאבים שבהם השתמשתם במאמר הזה:

  1. במסוף Google Cloud, עוברים לדף Manage resources.
  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על סמל המחיקה.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

12. מזל טוב

מעולה! בפרויקט הזה, יצרנו בהצלחה אפליקציה ל-Android לאחסון נתוני FHIR של מטופלים ולביצוע שאילתות לגביהם ב-FHIR Store של Cloud Healthcare ובמערך נתונים של BigQuery באמצעות Cloud Healthcare API ב-7 שלבים בלבד:

  1. הגדרת האפליקציה ל-Android
  2. הגדרה של Google Cloud Healthcare API
  3. יצירת קבוצת נתונים של נתונים רפואיים ומאגר נתונים של FHIR
  4. מערך נתונים שנוצר ב-BigQuery
  5. הגדרת BigQuery Stream לכתיבת נתונים מ-FHIR Datastore למערך נתונים ב-BigQuery
  6. פרסתם פונקציה של Cloud Functions כדי לכתוב נתוני R4 ב-FHIR Datastore
  7. הפעלת Cloud Functions מאפליקציית Android כשנשלחת תשובה לשאלון

עכשיו, אחרי שהשלבים ברורים, אתם יכולים לנסות את אותם השלבים כדי לסנכרן את העריכה של נתוני FHIR של המטופל עם הענן.