ניהול נתוני 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.

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

מה תפַתחו

בהטמעה הזאת,

  • אנחנו נשתמש בספריית איסוף הנתונים המובְנים כדי לעבד שאלון, ובספרייה של 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, לוחצים על Activate Cloud Shell בפינה הימנית העליונה:

51622c00acec2fa.png

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

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

3. הגדרה של Healthcare API

  1. מוודאים ש-Healthcare API מופעל: עוברים לספריית ה-API של מסוף Google Cloud, מחפשים את Healthcare API, לוחצים על ENABLE ואז ה-API ומוסיפים את חשבון Healthcare Service Account לפרויקט
  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 במערך נתונים של BigQuery, כדי שתוכלו להריץ עליהם שאילתות, לתכנת ולנתח אותם על בסיס העוצמה של BigQuery ו-BQML.

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

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

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

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

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

יצירת סטרימינג ב-BigQuery

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

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

caa2cc881d3406aa.png

  1. בוחרים את מערך הנתונים החדש של BigQuery מתוך הרשימה, סוג הסכימה בתור "Analytics V2" ו'סוג המשאב' 'מטופל' מהרשימה (אפשר לבחור כמה סוגי משאבים) וללחוץ על 'סיום'.

1e038c694fcca1ef.png

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

5. Cloud Functions (כתיבת נתוני R4 ל-FHIR Datastore באמצעות Healthcare API)

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

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

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

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

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

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

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

שם: FHIR_STORE_ID | ערך: מזהה חנות FHIR

  1. לוחצים על 'הבא' כדי לעבור לדף הבא, שבו נוסיף את הקוד שלנו
  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: https://github.com/google/fhir-app-examples
  2. פותחים את Android Studio, בוחרים באפשרות 'ייבוא פרויקט' (Gradle, Eclipse ADT וכו') ובוחרים את התיקייה/ cloudfunction מקוד המקור שהורדתם קודם.Open app/google-services.json. השדה ריק וצריך למלא אותו.

יוצרים מפתח SHA-1 באמצעות ./gradlewsignedReport ומעיינים בשדה SHA1 מתחת לווריאנט של ניפוי הבאגים

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

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

כבר הוספת את Firebase SDK לקובצי ה-build של Gradle

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

השלמנו את שלב ההגדרה וההכללה של התלות בהטמעה.

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

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

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

במקרה הזה נשתמש ב-json - " new-patient-registration-paginated.json&quot; כדי לעבד את הקטע. בודקים את הקבצים MainActivity.kt, AddPatientFragment.kt ו-AddPatientViewModel.kt

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

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

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

9e1bb440074f1a88.png

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

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

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

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

הצגת התוצאה של חנות FHIR

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

1064f03b4e1e45f5.png

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

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

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

7c483ec6d578b8cd.png

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

faafeae4a837a41c.png

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

9. יכולות חיפוש ועבודה במצב אופליין

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

יש שתי דרכים לחיפוש במקורות מידע של FHIR:

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

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

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

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

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

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

12. מזל טוב

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

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

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