1. היי!
תקן Matter פותח במטרה לאחד את תקני IoT, והוא מחבר מכשירים לבית חכם במגוון סביבות עסקיות, כמו Google Home, Zigbee, Bluetooth Mesh, Z-Wave ועוד.
המכשירים הניידים הם נקודת אינטראקציה מרכזית עם מכשירים לבית חכם. רוצה ליצור אפליקציות משלך ל-Android שיתמכו במכשירים בתקן Matter? אנחנו יכולים לעזור לך להתחיל במהירות.
באפליקציה לדוגמה של Google Home לתקן Matter (GHSA for Matter) מוצגים ממשקי ה-API של Home Mobile SDK, שמאפשרים למשתמשים להזמין מכשירים ולשתף אותם. אתם יכולים גם להשתמש באפליקציה לדוגמה ככלי למידה שעוזר לכם להבין טוב יותר מושגים מרכזיים בתקן Matter, וגם ככלי לניפוי באגים ולפתרון בעיות באינטראקציות עם מכשירים בתקן Matter.
הפעולות שתבצעו:
בשיעור ה-Codelab הזה תוכלו להוריד את קוד המקור של האפליקציה לדוגמה וללמוד איך להשתמש ב-Home Mobile SDK כדי להזמין מכשירים ולשתף אותם. בנוסף, נלמד איך להשתמש בספריות הזמנה ואשכולות ממאגר התוכן (connectedhomeip
).
אחרי שתורידו את האפליקציה לדוגמה, נבדוק את קוד המקור ב-Android Studio ונטמיע את ממשקי ה-API של Home Mobile SDK:
בנוסף, נסביר על הזמנת מושגים, על בדים בתקן Matter, ואיך לשלוט במכשירים בתקן Matter.
מה הדרישות כדי להצטרף לתוכנית?
לפני שמתחילים, חשוב לבצע את השלבים הבאים:
- כדאי לעיין במדריך בנושא אפליקציית Google Home לדוגמה ל-Matter.
- להורדת Android Studio.
- מכשיר Android O (8.1, רמת API 27) או מכשיר חדש יותר, שזמין לבדיקה. כדי לוודא שבמכשיר שלכם יש תמיכה בתקן Matter, כדאי לעיין במדריך אימות מודולים ושירותים של תקן Matter.
- יש להשתמש במכשיר בתקן Matter עם יכולות הפעלה/כיבוי. כדי למנוע בעיות בסביבה, מומלץ מאוד להשתמש ב-Matter Virtual Device (MVD) בתור התחלה. אם תיתקלו בבעיות, יהיה הרבה יותר קל לבדוק אם תשתמשו באפליקציה לדוגמה עם MVD. הנה עוד כמה אפשרויות:
- יוצרים מכשיר וירטואלי בתקן Matter באמצעות אפליקציית
rootnode_dimmablelight_bCwGYSDpoe
. כשיוצרים שילוב של תקן Matter במסוף למפתחים של Home, משתמשים ב-0xFFF1
כמזהה הספק וב-0x8000
כמזהה המוצר. - יוצרים מכשיר Epressif עם
all-clusters-app
. כשיוצרים שילוב של תקן Matter במסוף למפתחים בדף הבית, צריך להשתמש ב-0xFFF1
כמזהה הספק וב-0x8001
כמזהה המוצר.
- יוצרים מכשיר וירטואלי בתקן Matter באמצעות אפליקציית
- איך מגדירים את Google Play Services
אין צורך ב-Hub, למשל Google Nest Hub (דור שני), כדי להזמין מכשירים ולשלוט בהם באמצעות האפליקציה לדוגמה.
2. להגדרה
האפליקציה לתחילת העבודה ב-Codelab ממוקמת בהסתעפות codelab
. כדי להתחיל לעבוד עם קוד המקור של Codelab, אפשר להוריד את קובץ ה-ZIP.
אפשר להשתמש בקובץ ה-ZIP הזה בגודל codelab
כדי ליצור דוגמה תקינה.
גרסאות Codelab
ההסתעפות codelab
מתויגת בגרסה 2.0.0 של האפליקציה לדוגמה. כדי להשוות בין העדכונים בזמן העבודה על כל שלב, אפשר להוריד את קוד המקור שמוכן לגרסה הזו.
אם רוצים לשכפל את מאגר GitHub, פועלים לפי ההוראות בקובץ README לדוגמה.
יחסי תלות
נדריך אותך לגבי קוד המקור הנדרש לשיתוף מכשירים ולביצוע רכישות שלהם, אבל כדאי להיות מודעים ליחסי התלות הבאים לפני שמתחילים. שימו לב שיחסי התלות האלה מוצהרים בקובץ libs.versions.toml ומשתמשים בהם שצוינו בקובץ build.gradle.kts
- Home Mobile SDK
- ספריות Matter SDK.
- Jetpack Compose. ממשק המשתמש הוטמע באופן מלא באמצעות 'כתיבה'.
- עיצוב חדשני תלת-ממדי. מידע נוסף זמין במאמרים MDC-103 Android: Material Design with Color, Elevation and Type (Kotlin) וב-Material Theme Builder.
- Proto DataStore, משמש לשמירת נתוני אפליקציות. מאגרים וסדרות טוריות של מאגרי נתונים מאוחסנים ב-
java/data
, כולל סכימות למכשירים והעדפות המשתמש. כדי לקבל מידע נוסף על DataStore, עיינו במאמר על עבודה עם Proto DataStore. - היט כדי לשמור נתונים ולתמוך בהחדרת תלות.
קוד מקור
ממשק המשתמש ורוב הפונקציונליות כבר נוצרו עבורכם.
במסגרת ה-Codelab הזה, נוסיף את הפונקציונליות של Matter לקבצים הבאים:
java/commissioning/AppCommissioningService
: מאפשרת להזמין מכשירים למארג הפיתוחjava/screens/home/HomeScreen
ו-java/screens/home/HomeViewModel.kt
: כולל את פונקציונליות ההזמנה של Home Mobile SDKjava/screens/device/DeviceScreen
ו-java/screens/device/DeviceViewModel
: כולל קריאות ל-Share Device API
כל קובץ מקבל תגובה עם בלוק הקוד שתשנה. לדוגמה:
// CODELAB: add commissioningFunction()
כך תוכלו לאתר במהירות את הקטע התואם ב-Codelab.
3. עמלה ל-Google
כדי לשלוט במכשירים ולאפשר להם לתקשר זה עם זה באותו המרקם, צריך להזמין את הנציב. במקרה הזה, האפליקציה לדוגמה הזו – אפליקציית Google Home לדוגמה ל-Matter.
חשוב להבין את המושגים הבאים לגבי הזמנת עניינים:
- בדים מאפשרים למכשירים לתקשר זה עם זה.
- למוצרי בדים יש קבוצה משותפת של פרטי כניסה ייחודיים.
- מערכות אקולוגיות אחראיות להנפקת אישורי בסיס מהימנים, הקצאת מזהי בד והקצאת מזהי צמתים ייחודיים. מערכת אקולוגית היא השירות העורפי של עמלה. לדוגמה, תרשים הבית של הסביבה העסקית של Google Home.
- ניתן להזמין מכשירים ליותר מיחידה אחת (תכונה של אדמינים מרובים).
כדי להזמין מכשיר, צריך להשתמש ב-CommissioningClient API. קריאה אל .commissionDevice()
מחזירה IntentSender, שמפעיל את הפעילות הנכונה ב-Google Play Services:
interface CommissioningClient { Task<IntentSender> commissionDevice(CommissioningRequest request); }
בקטעים הבאים נפרט את הקוד המינימלי שנדרש כדי להזמין מכשירים לפורמט של Google.
שלב 1: מרכז האפליקציות
כדי לטפל ב-IntentSender
מ-CommissioningClient
, אפשר להשתמש ב-ActivityActivityLauncher
val commissioningLauncher = registerForActivityResult( StartIntentSenderForResult() ) { result: ActivityResult -> if (result.resultCode == RESULT_OK) { Timber.d(TAG, "Commissioning succeeded.") } else { Timber.d(TAG, "Commissioning failed. " + result.resultCode) } }
שלב 2: התאמת הפונקציה
הנה דוגמה בסיסית שמשתמשת ב- CommissioningClient API כדי להזמין מכשיר למרקם של Google.
- תהליך הביצוע מתחיל בפונקציה
commissionDevice()
. קודם כול, מוגדרCommissioningRequest
. עם תצורת ברירת המחדל הזו, המכשירים מחויבים רק למרקם המקומי של Android. Matter
היא נקודת הכניסה ל-Home Mobile SDK. בשיחה הבאה,.getCommissioningClient
יקבל 'עמלה' מאתthis
(פעילות)..commissionDevice()
מקבל אתCommissioningRequest
.- ולסיום,
.addOnSuccessListener
נקרא כדי לעבד אתCommissioningResult
ולהשיק את פעילות מכשיר העמלה של Google Play Services (GPS).
private fun commissionDevice() { val request: CommissioningRequest = CommissioningRequest.builder().build() Matter.getCommissioningClient(this) .commissionDevice(request) .addOnSuccessListener { result -> commissioningLauncher.launch(IntentSenderRequest.Builder(result).build()) } }
ניתן להשתמש ב-Local Android Fabric דרך ההגדרות של Android כדי לפשט את תהליך הזמנת המכשירים לבדים אחרים.
בשלב הבא תלמדו איך להזמין מכשיר למארג פיתוח.
לסקירה כללית של ממשק המשתמש בתהליך ההזמנה, מומלץ לעיין במדריך לדוגמאות של אפליקציית Google Home בתקן Matter.
4. עמלה למארג פיתוח
ניתן להזמין מכשירים ליותר מבד אחד. כדי לנהל התאמות מהימנות, במכשירים נשמרים FabricTable
עם חברים שונים ב-FabricInfo
, לדוגמה:
- זיהוי בד
- מזהה הצומת הוקצה למכשיר על ידי הבד
- מזהה הספק
- מזהה בד
- פרטי כניסה תפעוליים של המכשיר
מנהל הדומיין המנהלי (ADM) מגדיר פרטי כניסה מבד. בתרחיש הקודם, Google Play Services היא הסביבה העסקית שפועלת כרשות אישורים מהימנה ברמה הבסיסית (CA). כאשר מקצים מכשירים למרקם של Android המקומי, כל מכשיר כולל את אותה קבוצה של פרטי כניסה מבד, ואותם קבוצות של רשויות אישורים.
שירותי עמלות בהתאמה אישית
כדי לבצע הזמנה עבור המארג של Android המקומי, השתמשנו בפרמטרים שמוגדרים כברירת מחדל כדי ליצור את CommissioningRequest
ב- CommissioningClient API:
val request: CommissioningRequest = CommissioningRequest.builder().build()
אם ברצונך לשלוט במכשירים חדשים ולנהל אותם מתוך האפליקציה, עליך ליצור מארג פיתוח מקומי ולקבל את פרטי הכניסה התפעוליים כדי להזמין מכשירים. בתרחיש הזה, האפליקציה שלך הופכת לסביבה עסקית ייחודית ועצמאית שמקצה למכשירים את פרטי הכניסה המתאימים לצומת.
כדי להודיע ל-Home Mobile SDK שרוצים להזמין מכשירים לשימוש בבד שלך, אפשר להעביר שירות מותאם אישית אל CommissioningRequest:
class CommissioningRequest { static CommissioningRequest.Builder builder(); class Builder { Builder setCommissioningService(@Nullable ComponentName commissioningService); CommissioningRequest build(); } }
בשלבים הבאים נשנה את הפונקציה commissionDevice()
כך שתשתמש בשירות מותאם אישית. נוסיף גם מרכז אפליקציות לפעילות בקטע 'דף הבית' ונשתמש באובייקטים של LiveData כדי לנהל את זרימת ה-API.
שלב 1: יצירת מרכז אפליקציות לפעילות GPS
קודם כול ניצור מרכז אפליקציות שיטפל ב-IntentSender
מ- CommissioningClient API.
- פותחים את
HomeScreen
בתיקייהjava/screens/home/
. - צריך להחליף את התגובה
// CODELAB: commissionDeviceLauncher definition
בקוד הבא כדי לרשום את תוצאת פעילות ההזמנה ולטפל בה:val commissionDeviceLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.StartIntentSenderForResult() ) { result -> // Commission Device Step 5. // The Commission Device activity in GPS (step 4) has completed. val resultCode = result.resultCode if (resultCode == Activity.RESULT_OK) { Timber.d("CommissionDevice: Success") // We let the ViewModel know that GPS commissioning has completed successfully. // The ViewModel knows that we still need to capture the device name and will\ // update UI state to trigger the NewDeviceAlertDialog. homeViewModel.gpsCommissioningDeviceSucceeded(result) } else { homeViewModel.commissionDeviceFailed(resultCode) } }
שלב 2: הפעלת פעולת העמלה על המכשיר
בשלב הזה, המשתמש מפעיל את הפעולה 'מכשיר העמלה' על ידי לחיצה על הלחצן '+' בפינה השמאלית התחתונה של מסך הבית. לאחר מכן תבוצע שיחה אל commissionDevice()
.
val onCommissionDevice = { ... commissionDevice(activity!!.applicationContext, commissionDeviceLauncher) }
שלב 3: קוראים ל-API
- עדיין נמצאים ב-
HomeScreen.kt
בתיקייהjava/screens/home/
. - החליפו את התגובה
// CODELAB: commissionDevice
בcommissionDeviceRequest
הבאה. הפונקציהsetCommissioningService
מחייבת אתAppCommissioningService
למופע שלCommissioningService
, שמוחזר בפונקציית קריאה חוזרת. אחרי שמעבירים שירות מותאם אישית, Home Mobile SDK יקצה קודם מכשירים למרקם המקומי של Android, ולאחר מכן ישלח את המטען הייעודי (payload) שנשלח בחזרה אלAppCommissioningService
.val commissionDeviceRequest = CommissioningRequest.builder() .setCommissioningService(ComponentName( context, AppCommissioningService::class.java)) .build()
- צריך להתקשר אל
.getCommissioningClient()
, ולאחר מכן להתקשר אל.commissionDevice()
.
Matter.getCommissioningClient(context) .commissionDevice(commissionDeviceRequest)
כדי להשלים את הפונקציה commissionDevice
, צריך להוסיף addOnSuccessListener
ו-addOnFailureListener
:
.addOnSuccessListener { result -> commissionDeviceLauncher.launch(IntentSenderRequest.Builder(result).build()) } .addOnFailureListener { error -> Timber.e(error) }
5. יצירת CommissioningService
בפונקציה commissionDevice()
ביקשנו לקבל CommissioningService מ-CommissioningClient API. בתהליך הזה, ה-API של CommissioningClient מזמין תחילה מכשירים למרקם המקומי של Android, ולאחר מכן מחזיר קריאה חוזרת שכוללת את האובייקטCommissioningRequestMetadata:
public interface CommissioningService { interface Callback { void onCommissioningRequested(CommissioningRequestMetadata metadata); } }
עכשיו אנחנו צריכים לרשת את CommissioningService.Callback ולספק את הפונקציונליות הנדרשת להזמנת מכשירים לאפליקציה לדוגמה שלנו. הנה דוגמה להטמעה בסיסית של CommissioningService:
class MatterCommissioningService : Service(), CommissioningService.Callback { private val commissioningServiceDelegate = CommissioningService.Builder(this) .setCallback(this) .build() override fun onBind(intent: Intent) = commissioningServiceDelegate.asBinder() override fun onCommissioningRequested(metadata: CommissioningRequestMetadata) { // perform commissioning commissioningServiceDelegate .sendCommissioningComplete(CommissioningCompleteMetadata.builder().build()) } }
שלב 1: בודקים את AppCommissioningService בהתאמה אישית
כדי לעזור לכם להתחיל, כבר הגדרנו את מבנה הכיתות הבסיסי של CommissioningService בהתאמה אישית. הנה סקירה כללית מהירה של הפונקציונליות של השירות. כדי לעקוב אחר התהליך, אפשר לפתוח את AppCommissioningService
ב-java/commissioning
.
הוספנו את תהליכי הייבוא הבאים לממשקי ה-API של Home Mobile SDK:
import com.google.android.gms.home.matter.commissioning.CommissioningCompleteMetadata import com.google.android.gms.home.matter.commissioning.CommissioningRequestMetadata import com.google.android.gms.home.matter.commissioning.CommissioningService
AppCommissioningService
כולל גם ספריות ממאגר Mater (connectedhomeip
):
import com.google.home_sample_app_for_matter.chip.ChipClient
לבסוף, השירות כולל ייבוא תמיכה ב-Hilt ובקורוטינים של Kotlin.
בשלב הבא ניצור את ה-builder ונגדיר כמה דברים, כולל commissioningServiceDelegate
, שבו נשתמש כדי להודיע ל-Google Play Services כשההזמנה תושלם.
private lateinit var commissioningServiceDelegate: CommissioningService ... commissioningServiceDelegate = CommissioningService.Builder(this).setCallback(this).build()
זה הזמן להוסיף את פונקציות הביצוע.
שלב 2: ביטול onCommissioningRequested
כדי להזמין מכשירים למארג הפיתוח של האפליקציה, יש להשלים את השלבים הבאים:
- פתיחת
AppCommissioningService
ב-java/commissioning
. - מחפשים את הפונקציה
onCommissioningRequested()
. שלחנו הודעת יומן שבה אפשר להדפיס אתCommissioningRequestMetadata
. צריך להחליף את התגובה// CODELAB: onCommissioningRequested()
כדי להתחיל את שגרת הserviceScope
ולקבל אתdeviceId
.// Perform commissioning on custom fabric for the sample app. serviceScope.launch { val deviceId = devicesRepository.incrementAndReturnLastDeviceId()
- ביצוע הזמנה. בשלב הזה, אנחנו יכולים להעביר את פרטי המכשיר שמוחזרים באובייקט CommissioningRequestMetadata.
ChipClient
משתמש בפרטי המטא-נתונים האלה כדי ליצור ערוץ מאובטח בין אפליקציית GHSA for Matter למכשיר שלך.try { Timber.d( "Commissioning: App fabric -> ChipClient.establishPaseConnection(): deviceId [${deviceId}]") chipClient.awaitEstablishPaseConnection( deviceId, metadata.networkLocation.ipAddress.hostAddress!!, metadata.networkLocation.port, metadata.passcode) Timber.d( "Commissioning: App fabric -> ChipClient.commissionDevice(): deviceId [${deviceId}]") chipClient.awaitCommissionDevice(deviceId, null) } catch (e: Exception) { Timber.e(e, "onCommissioningRequested() failed") // No way to determine whether this was ATTESTATION_FAILED or DEVICE_UNREACHABLE. commissioningServiceDelegate .sendCommissioningError(CommissioningError.OTHER) .addOnSuccessListener { Timber.d( "Commissioning: commissioningServiceDelegate.sendCommissioningError() succeeded") } .addOnFailureListener { e2 -> Timber.e(e2, "Commissioning: commissioningServiceDelegate.sendCommissioningError() failed") } return@launch }
- יש להשתמש ב
commissioningServiceDelegate
כדי להודיע ל-Google Play Services שההזמנה הושלמה. בעוד.sendCommissioningComplete()
, מעבירים את הפרמטר CommissioningCompleteMetadata.commissioningServiceDelegate .sendCommissioningComplete( CommissioningCompleteMetadata.builder().setToken(deviceId.toString()).build()) .addOnSuccessListener { Timber.d("Commissioning: commissioningServiceDelegate.sendCommissioningComplete() succeeded") } .addOnFailureListener { e -> Timber.e(e, "Commissioning: commissioningServiceDelegate.sendCommissioningComplete() failed") }
הפעלת האפליקציה
עכשיו, לאחר שכל הקוד הנדרש הונפק כדי להתאים אותו למרקם המקומי שלנו, הגיע הזמן לבדוק אותו. בוחרים את מכשיר ה-Android שלכם ומריצים את האפליקציה. במסך הבית, מקישים על הוספת מכשיר ומבצעים את השלבים להפעלת המכשיר.
בסיום ההזמנה, המכשיר משתתף כעת בשני בדים: בד Android המקומי ומארג הפיתוח המקומי שלך. לכל בד יש קבוצה של פרטי כניסה ומזהה בד ייחודי של 64 ביט.
6. שליטה במכשירים
הזמנה למארג פיתוח מאפשרת לכם להשתמש בספריות ממאגר החומר (connectedhomeip
) כדי לשלוט במכשירים מהאפליקציה לדוגמה.
יצרנו כמה כיתות מסייעות כדי להקל על הגישה לאשכולות במכשירים ולשלוח פקודות. לקבלת מידע נוסף, אפשר לפתוח את ClustersHelper
בjava/clusters
. כלי העזר של Singleton מייבא את הספריות הבאות כדי לגשת למידע על המכשיר:
import chip.devicecontroller.ChipClusters import chip.devicecontroller.ChipStructs
נוכל להשתמש במחלקה הזו על מנת לקבל את האשכול פועל/כבוי עבור מכשיר, ולאחר מכן להתקשר אל .toggle
:
suspend fun toggleDeviceStateOnOffCluster(deviceId: Long, endpoint: Int) { Timber.d("toggleDeviceStateOnOffCluster())") val connectedDevicePtr = try { chipClient.getConnectedDevicePointer(deviceId) } catch (e: IllegalStateException) { Timber.e("Can't get connectedDevicePointer.") return } return suspendCoroutine { continuation -> getOnOffClusterForDevice(connectedDevicePtr, endpoint) .toggle( object : ChipClusters.DefaultClusterCallback { override fun onSuccess() { continuation.resume(Unit) } override fun onError(ex: Exception) { Timber.e("readOnOffAttribute command failure: $ex") continuation.resumeWithException(ex) } }) } }
החלפת מצב במכשיר
אחרי שמזמינים מכשיר, המטען הייעודי (payload) שהוחזר ב-CommissioningResult מתווסף ל-DataStore. כך האפליקציה שלנו יכולה לגשת למידע מהמכשיר שיכול לשמש לשליחת פקודות.
אפליקציות בתקן Matter מבוססות על אירועים. כשהמקבץ של תקן Matter מופעל, שירותי האשכול מאזינים להודעות נכנסות. לאחר הזמנת המכשיר, לקוחות בתקן Matter שולחים פקודות בערוץ התפעול המאובטח שנוצר במהלך הזמנת המכשיר.
החבילות במכשיר מאומתות, מפוענחות ונשלחות באמצעות קריאה חוזרת (callback). פונקציות הקריאה החוזרות (callback) כוללות את ערכי EndpointId, ClusterId ו-AttributeId, שניתן לגשת אליהם דרך attributePath
. לדוגמה, אפשר להטמיע את הקוד הזה במכשיר בתקן Matter:
void MatterPostAttributeChangeCallback(const chip::app::ConcreteAttributePath & attributePath, uint8_t mask, uint8_t type, uint16_t size, uint8_t * value) { // handle callback ClusterId clusterId = attributePath.mClusterId; AttributeId attributeId = attributePath.mAttributeId; }
בשלבים הבאים צריך להשתמש ב-Matter SDK וב-ClustersHelper
כדי להחליף מצב במכשיר.
- היכנסו אל
DeviceViewModel
בjava/screens/device
. - מחפשים את הפונקציה
updateDeviceStateOn
. - מחליפים את התגובה
// CODELAB: toggle
בקוד כדי להתקשר אלclustersHelper
, ואז מעדכנים את מאגר המכשירים:Timber.d("Handling real device") try { clustersHelper.setOnOffDeviceStateOnOffCluster(deviceUiModel.device.deviceId, isOn, 1) devicesStateRepository.updateDeviceState(deviceUiModel.device.deviceId, true, isOn) } catch (e: Throwable) { Timber.e("Failed setting on/off state") }
הקריאה לפונקציה הזו בוצעה מ-DeviceScreen
:
// On/Off Switch click. val onOnOffClick: (value: Boolean) -> Unit = { value -> deviceViewModel.updateDeviceStateOn(deviceUiModel!!, value) }
הפעלת האפליקציה
צריך להריץ את האפליקציה כדי לטעון מחדש את העדכונים. במסך הבית, מפעילים או מכבים את המכשיר.
7. שיתוף מכשירים עם סביבות עסקיות אחרות
במפרט של תקן Matter, שיתוף מכשיר נקרא תהליך של אדמינים מרובים.
בשלבים הקודמים למדנו ש-Home Mobile SDK מאפשר לבצע הזמנה של מכשירים לבד של Android המקומי וגם למארג פיתוח של האפליקציה לדוגמה. זו דוגמה לתהליך של אדמינים מרובים, שבו ניתן להזמין מכשירים ליותר מבד אחד.
עכשיו יכול להיות שתרצו לשתף מכשירים עם מספר גדול יותר של בדים, במיוחד אם מדובר בבית שבו יש לאנשים העדפות משלהם בכל מה שקשור לאפליקציות ולפלטפורמות.
ה-Home Mobile SDK מספק את הפונקציונליות הזו ב-ShareDeviceRequest API ומאפשר לך:
- פתיחת חלון זמני להזמנה עבור מכשירים.
- אפשר לשנות את המצב של המכשירים כדי שאפשר יהיה להזמין אותם למרקם אחר.
- שליטה במכשירים מאפליקציות אחרות ומסביבות עסקיות אחרות.
בשלבים הבאים צריך להשתמש ב-Home Mobile SDK כדי לשתף מכשירים.
שלב 1: יצירת מרכז אפליקציות לפעילות GPS
בדומה ל-Commiting Activity Launcher שיצרנו כשהזמננו למארג פיתוח, יצרנו מרכז אפליקציות לשיתוף מכשירים כדי לטפל ב-IntentSender
מ- CommissioningClient API.
- פותחים את
DeviceScreen
בתיקייהjava/screens/device/
. - צריך להחליף את התגובה
// CODELAB: shareDeviceLauncher definition
בקוד הבא כדי להירשם ולטפל בתוצאת הפעילות.shareDevice()
:val shareDeviceLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.StartIntentSenderForResult() ) { result -> // Commission Device Step 5. // The Share Device activity in GPS (step 4) has completed. val resultCode = result.resultCode if (resultCode == Activity.RESULT_OK) { deviceViewModel.shareDeviceSucceeded() } else { deviceViewModel.shareDeviceFailed(resultCode) } }
שלב 2: מפעילים את פעולת שיתוף המכשיר
בשלב הזה, המשתמש מפעיל את הפעולה 'שיתוף מכשיר' על ידי לחיצה על הלחצן 'שיתוף' במסך המכשיר. לאחר מכן תתבצע שיחה אל deviceViewModel
כדי לפתוח חלון התאמה לצורך שיתוף המכשיר.
// Share Device button click. val onShareDevice: () -> Unit = { deviceViewModel.openPairingWindow(deviceUiModel!!.device.deviceId) }
אחרי שפותחים את חלון ההתאמה, המידע מועבר לממשק המשתמש על ידי deviceViewModel
. התקשורת בין ViewModel
לממשק המשתמש מתבצעת באמצעות StateFlow
אובייקטים.
// Communicate to the UI that the pairing window is open. // UI can then launch the GPS activity for device sharing. _pairingWindowOpenForDeviceSharing.value = true
לאחר שתראו את השינוי באובייקט StateFlow, DeviceScreen יבצע את הקריאה הבאה:
shareDevice(activity!!.applicationContext, shareDeviceLauncher, deviceViewModel)
שלב 3: קוראים ל-API
עכשיו אפשר להתחיל במשימה של שיתוף מכשיר.
- פותחים את
DeviceScreen.kt
בתיקייהjava/screens/device/
. - מחפשים את הפונקציה
shareDevice()
. החליפו את התגובה// CODELAB: shareDevice
ב-ShareDeviceRequest
.DeviceDescriptor
מספק מידע ספציפי לגבי המכשיר, כמו מזהה הספק, מזהה המוצר וסוג המכשיר. בדוגמה הזו אנחנו מקודדים את הערכים בתוך הקוד.val shareDeviceRequest = ShareDeviceRequest.builder() .setDeviceDescriptor(DeviceDescriptor.builder().build()) .setDeviceName("GHSAFM temp device name")
- מגדירים את CommissioningWindow ואת הפרמטרים.
.setCommissioningWindow( CommissioningWindow.builder() .setDiscriminator(Discriminator.forLongValue(DISCRIMINATOR)) .setPasscode(SETUP_PIN_CODE) .setWindowOpenMillis(SystemClock.elapsedRealtime()) .setDurationSeconds(OPEN_COMMISSIONING_WINDOW_DURATION_SECONDS.toLong()) .build()) .build()
- התקשרות ל-
.getCommissioningClient()
, רק הפעם, שימוש ב-API של.shareDevice()
.Matter.getCommissioningClient(context) .shareDevice(shareDeviceRequest)
הקריאה החוזרת (callback) שמסתיימת בהצלחה ב-API commissioningClient.shareDevice()
מספקת את IntentSender לשימוש כדי להפעיל את שיתוף פעילות המכשיר ב-Google Play Services.
- כדי להשלים את הפונקציה
shareDevice
צריך להוסיףaddOnSuccessListener
ו-addOnFailureListener
. לאחר הצלחה,launch
נקרא ב-shareDeviceLauncher
כדי להפעיל את פעילות ה-GPS לשיתוף המכשיר..addOnSuccessListener { result -> Timber.d("ShareDevice: Success getting the IntentSender: result [${result}]") shareDeviceLauncher.launch(IntentSenderRequest.Builder(result).build()) } .addOnFailureListener { error -> Timber.e(error) deviceViewModel.showMsgDialog("Share device failed", error.toString()) }
הפעלת האפליקציה
כדי לשתף את המכשיר בתקן Matter עם סביבות עסקיות אחרות, צריך להתקין פלטפורמה אחרת במכשיר Android. יצרנו מופע נוסף של האפליקציה לדוגמה, שבה אפשר להשתמש בתור נציב היעד.
אחרי שמתקינים את ה-Target Commissioner במכשיר Android, צריך לוודא שיש לכם אפשרות לשתף את מכשיר Matter. אפליקציית היעד של העמלה מסומנת בתווית GHSAFM-TC.
המכשירים שלך יכולים עכשיו להשתתף בשלושה בדים:
- בד של Android המקומי.
- בד הפיתוח שלך (האפליקציה הזו).
- הבד השלישי הזה ששיתפת איתו את המכשיר.
8. השלבים הבאים
מזל טוב
כל הכבוד! השלמת את ה-Codelab הזה ולמדת איך להזמין מכשירים ולשתף אותם באמצעות Home Mobile SDK.
אם אתם נתקלים בבעיות באפליקציה לדוגמה, נסו להשלים את השלבים לאימות הסביבה:
אם יש לכם שאלות לגבי השימוש באפליקציה לדוגמה או אם גיליתם באג בקוד, תוכלו לדווח על בעיות ב'מעקב אחר בעיות' במאגר של GitHub:
כדי לקבל הדרכה רשמית מ-Google לגבי שאלות טכניות, תוכלו להשתמש בפורום למפתחים של בית חכם:
כדי לקבל תמיכה טכנית מהקהילה, אפשר להשתמש בתג google-smart-home
ב-Stack Overflow: