1. Selamat datang
Matter, yang dibuat dengan tujuan menyatukan standar IoT, menghubungkan perangkat smart home di berbagai ekosistem seperti Google Home, Zigbee, Bluetooth Mesh, Z-Wave, dan banyak lagi.
Perangkat seluler adalah titik interaksi pusat dengan perangkat smart home. Jika ingin mem-build aplikasi Android sendiri untuk mendukung perangkat Matter, kami dapat membantu Anda memulai dengan cepat.
Google Home Sample App for Matter (GHSA for Matter) menampilkan Home Mobile SDK API, yang memungkinkan pengguna memesan dan membagikan perangkat. Anda juga dapat menggunakan aplikasi contoh sebagai alat pembelajaran untuk lebih memahami konsep Utama, serta alat untuk men-debug dan memecahkan masalah interaksi dengan perangkat Matter.
Yang akan Anda lakukan
Dalam Codelab ini, Anda akan mendownload kode sumber untuk aplikasi contoh dan mempelajari cara menggunakan Home Mobile SDK untuk membuat komisi dan membagikan perangkat. Anda juga akan mempelajari cara menggunakan Commissioning dan library Cluster dari repositori Matter (connectedhomeip
).
Setelah mendownload aplikasi contoh, kami akan meninjau kode sumber di Android Studio dan menerapkan Home Mobile SDK API berikut:
Anda juga akan mempelajari lebih lanjut konsep komisi, kain Matter, dan cara mengontrol perangkat Matter.
Yang Anda butuhkan
Sebelum memulai, pastikan Anda menyelesaikan langkah-langkah berikut:
- Tinjau Panduan Aplikasi Google Home untuk Panduan Materi.
- Mendownload Android Studio.
- Memiliki perangkat Android O (8.1, API level 27) atau yang lebih baru yang tersedia untuk pengujian. Untuk memastikan perangkat Anda memiliki dukungan Matter terbaru, tinjau panduan Memverifikasi Modul & Layanan Matter.
- Membuat perangkat Matter dengan kemampuan Aktif/Nonaktif. Aplikasi contoh ini berfungsi dengan perangkat virtual dan ESP32.
- Buat Perangkat Virtual Matter dengan aplikasi
rootnode_dimmablelight_bCwGYSDpoe
. Saat Anda Membuat integrasi Matter di Konsol Developer Home, gunakan0xFFF1
sebagai ID Vendor dan0x8000
sebagai ID Produk Anda. - Buat Perangkat Espressif dengan
all-clusters-app
. Saat Anda Membuat integrasi Matter di Home Developer Console, gunakan0xFFF1
sebagai ID Vendor Anda dan0x8001
sebagai ID Produk Anda.
- Buat Perangkat Virtual Matter dengan aplikasi
- Tinjau cara Menyiapkan layanan Google Play.
Anda tidak memerlukan hub, misalnya Google Nest Hub (Generasi ke-2), untuk memesan dan mengontrol perangkat dengan aplikasi contoh.
2. Memulai persiapan
Repositori GitHub aplikasi contoh mencakup library pihak ketiga dari repositori Matter (connectedhomeip
). Library native ini berukuran lebih dari 50 MB dan memerlukan penggunaan Git Large File Storage (LFS).
Aplikasi awal codelab terletak di cabang codelab
. Untuk mulai menggunakan kode sumber codelab, Anda dapat mendownload file ZIP. ZIP ini mencakup library native Matter SDK tanpa memerlukan Git LFS:
Anda akan menggunakan file ZIP codelab
ini untuk membuat sampel yang berfungsi.
Versi Codelab
Cabang codelab
diberi tag dengan rilis 1.2.2 aplikasi contoh. Untuk membandingkan update saat Anda menyelesaikan setiap langkah, Anda dapat mendownload kode sumber yang lengkap untuk rilis ini.
Jika Anda ingin meng-clone repositori GitHub, ikuti petunjuk di Contoh aplikasi README.
Dependensi
Kami akan memandu Anda memahami kode sumber yang diperlukan untuk berbagi dan menetapkan perangkat, tetapi sebaiknya Anda mengetahui dependensi berikut sebelum memulai:
- Home Mobile SDK.
implementation 'com.google.android.gms:play-services-home:16.0.0'
- Library SDK Matter.
// Native libs implementation fileTree(dir: "third_party/connectedhomeip/libs", include: ["*.jar", "*.so"])
- Desain Material. Untuk mempelajari lebih lanjut, baca MDC-103 Android: Tema Material dengan Warna, Ketinggian dan Jenis (Kotlin) dan Material Theme Builder.
implementation 'com.google.android.material:material:1.5.0'
- Proto DataStore, yang digunakan untuk mempertahankan data aplikasi. Repositori dan Serializer Datastore disimpan di
java/data
, termasuk skema untuk perangkat dan preferensi pengguna. Untuk mempelajari DataStore lebih lanjut, lihat Bekerja dengan Proto DataStore.implementation "androidx.datastore:datastore:$dataStoreVersion" implementation 'androidx.datastore:datastore-core:1.0.0' implementation 'com.google.protobuf:protobuf-javalite:3.18.0'
- Hilt untuk mempertahankan data dan mendukung injeksi dependensi.
kapt 'com.google.dagger:hilt-compiler:2.41' implementation 'com.google.dagger:hilt-android:2.41'
Kode sumber
Antarmuka pengguna dan sebagian besar fungsinya telah dibuat untuk Anda.
Untuk codelab ini, kita akan menambahkan fungsi Matter ke file berikut:
java/commissioning/AppCommissioningService
: memungkinkan Anda memesan perangkat untuk pengembanganjava/screens/HomeFragment
danjava/screens/HomeViewModel.kt
: mencakup fungsi komisi Home Mobile SDKjava/screens/DeviceViewModel
: mencakup panggilan Share Device API
Setiap file diberi komentar dengan blok kode yang akan Anda ubah, misalnya:
// CODELAB: add commissioningFunction()
Ini memungkinkan Anda menemukan bagian yang sesuai dengan cepat di codelab.
3. Komisi ke Google
Sebelum Anda dapat mengontrol perangkat dan mengizinkan perangkat tersebut berkomunikasi satu sama lain dalam kain yang sama, perangkat tersebut harus digunakan oleh Komisaris, yang dalam hal ini adalah aplikasi contoh, Aplikasi Contoh Google Home untuk Matter.
Penting untuk memahami konsep berikut tentang komisi Matter:
- Dengan Fabric, perangkat dapat berkomunikasi satu sama lain.
- Fabric menyimpan kumpulan kredensial unik yang dibagikan.
- Ekosistem bertanggung jawab untuk menerbitkan root certificate tepercaya, menetapkan ID kain, dan menetapkan ID node unik. Ekosistem adalah layanan back-end dari seorang komisaris, misalnya Home Graph untuk ekosistem Google Home.
- Perangkat dapat dipesan ke lebih dari satu Fabric (fitur multi-admin).
Untuk memesan perangkat, Anda perlu menggunakan CommissioningClient API. Panggilan ke .commissionDevice()
akan menampilkan IntentSender, yang akan meluncurkan aktivitas yang tepat pada Layanan Google Play:
interface CommissioningClient { Task<IntentSender> commissionDevice(CommissioningRequest request); }
Di bagian berikutnya, kita akan membahas kode minimal yang diperlukan untuk menetapkan perangkat ke kain Google.
Langkah 1: Peluncur Aktivitas
Untuk menangani IntentSender
dari CommissioningClient
, Anda dapat menggunakan ActivityResultLauncher:
private lateinit var commissioningLauncher: ActivityResultLauncher<IntentSenderRequest>
commissioningLauncher = registerForActivityResult( StartIntentSenderForResult() ) { result: ActivityResult -> if (result.resultCode == RESULT_OK) { Timber.d(TAG, "Commissioning succeeded.") } else { Timber.d(TAG, "Commissioning failed. " + result.resultCode) } }
Langkah 2: Memastikan fungsi
Berikut adalah contoh dasar yang menggunakan CommissioningClient API untuk menetapkan perangkat ke kain Google.
- Proses komisi dimulai dengan fungsi
commissionDevice()
. Pertama,CommissioningRequest
ditentukan. Dengan konfigurasi default ini, perangkat hanya dipesan untuk fabric Android Lokal. Matter
adalah titik entri untuk Home Mobile SDK. Pada panggilan berikutnya,.getCommissioningClient
mendapatkan CommissioningClient olehthis
(Activity)..commissionDevice()
menerimaCommissioningRequest
.- Terakhir,
.addOnSuccessListener
dipanggil untuk memprosesCommissioningResult
dan meluncurkan Aktivitas Perangkat Komisi Layanan Google Play (GPS).
private fun commissionDevice() { val request: CommissioningRequest = CommissioningRequest.builder().build() Matter.getCommissioningClient(this) .commissionDevice(request) .addOnSuccessListener { result -> commissioningLauncher.launch(IntentSenderRequest.Builder(result).build()) } }
Lokal Android Fabric dapat dimanfaatkan melalui setelan Android untuk menyederhanakan proses penugasan perangkat ke fabric lainnya.
Selanjutnya, Anda akan mempelajari cara menetapkan perangkat ke kain pengembangan.
Untuk ringkasan antarmuka pengguna selama proses Commissioning, lihat Google Home Sample App for Matter Guide.
4. Komisi untuk struktur pengembangan
Perangkat dapat ditugaskan ke lebih dari satu kain. Untuk mengelola penyambungan tepercaya, perangkat menyimpan FabricTable
yang berisi berbagai anggota FabricInfo
, misalnya:
- Identifikasi kain
- ID node yang ditetapkan oleh kain ke perangkat
- ID Vendor
- ID Kain
- Kredensial operasional perangkat
Manajer domain administratif (ADM) menentukan kredensial kain. Dalam skenario sebelumnya, Layanan Google Play adalah ekosistem yang bertindak sebagai root certificate authority (CA) tepercaya. Saat Anda menetapkan perangkat ke kain Android Lokal, setiap perangkat akan menyertakan kumpulan kredensial kain yang sama, dan kumpulan CA yang sama.
Layanan Komisi Khusus
Untuk komisi kain Android Lokal, kami menggunakan parameter default untuk mem-build CommissioningRequest
di CommissioningClient API:
val request: CommissioningRequest = CommissioningRequest.builder().build()
Jika ingin mengontrol dan mengelola perangkat baru dari aplikasi, Anda perlu membuat fabric pengembangan lokal dan mendapatkan kredensial operasional ke perangkat komisi. Dalam skenario ini, aplikasi Anda menjadi ekosistem unik dan independen yang menetapkan perangkat dengan kredensial node yang sesuai.
Anda dapat memberi tahu Home Mobile SDK bahwa Anda ingin menetapkan perangkat ke kain Anda sendiri dengan meneruskan layanan kustom ke CommissioningRequest:
class CommissioningRequest { static CommissioningRequest.Builder builder(); class Builder { Builder setCommissioningService(@Nullable ComponentName commissioningService); CommissioningRequest build(); } }
Pada langkah berikutnya, kita akan memodifikasi fungsi commissionDevice()
untuk menggunakan layanan kustom. Kita juga akan menambahkan Peluncur Aktivitas ke fragmen Beranda dan menggunakan objek LiveData untuk mengelola alur API.
Langkah 1: Buat Peluncur Aktivitas GPS
Pertama, mari kita buat Peluncur Aktivitas untuk menangani IntentSender
dari CommissioningClient API.
- Buka
HomeFragment
di folderjava/screens/home/
. - Ganti komentar
// CODELAB: commissionDeviceLauncher declaration
dengan deklarasi berikut:// The ActivityResult launcher that launches the "commissionDevice" activity in Google Play // Services. private lateinit var commissionDeviceLauncher: ActivityResultLauncher<IntentSenderRequest>
- Ganti komentar
// CODELAB: commissionDeviceLauncher definition
dengan kode berikut untuk mendaftarkan dan menangani hasil Aktivitas komisi:commissionDeviceLauncher = registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result -> // Commission Device Step 5. // The Commission Device activity in GPS has completed. val resultCode = result.resultCode if (resultCode == Activity.RESULT_OK) { Timber.d("CommissionDevice: Success") // We now need to capture the device information for the app's fabric. // Once this completes, a call is made to the viewModel to persist the information // about that device in the app. showNewDeviceAlertDialog(result) } else { viewModel.commissionDeviceFailed(resultCode) } } ```
Langkah 2: Buat objek LiveData
Callback berhasil dari .commissionDevice()
API menyediakan IntentSender
yang akan digunakan untuk meluncurkan Aktivitas Perangkat Komisi di Layanan Google Play. Di HomeViewModel
, kita akan membuat dua objek LiveData untuk dilaporkan berdasarkan hasil panggilan API ini:
commissionDeviceStatus
untuk melacakTaskStatus
.commissionDeviceIntentSender
untuk menangani hasil panggilan.commissionDevice()
. Objek LiveData ini akan meluncurkanActivityLauncher
yang baru saja kita buat dan menampilkan Aktivitas Perangkat Komisi GPS kepada pengguna.
- Di
private fun setupObservers()
, ganti komentar// CODELAB: commissionDeviceStatus
dengan observer berikut:// The current status of the share device action. viewModel.commissionDeviceStatus.observe(viewLifecycleOwner) { status -> Timber.d("commissionDeviceStatus.observe: status [${status}]") }
- Selanjutnya, ganti komentar
// CODELAB: commissionDeviceIntentSender
dengan observer berikut:viewModel.commissionDeviceIntentSender.observe(viewLifecycleOwner) { sender -> Timber.d( "commissionDeviceIntentSender.observe is called with [${intentSenderToString(sender)}]") if (sender != null) { // Commission Device Step 4: Launch the activity described in the IntentSender that // was returned in Step 3 (where the viewModel calls the GPS API to commission // the device). Timber.d("CommissionDevice: Launch GPS activity to commission device") commissionDeviceLauncher.launch(IntentSenderRequest.Builder(sender).build()) viewModel.consumeCommissionDeviceIntentSender() } }
Langkah 3: Panggil API
Setelah kita menulis kode untuk menangani alur API, sekarang saatnya untuk memanggil API, meneruskan layanan kustom (yang akan kita tentukan pada langkah berikutnya), dan memposting ke objek LiveData.
- Buka
HomeViewModel.kt
di folderjava/screens/home/
. - Ganti komentar
// CODELAB: commissionDevice
dengancommissionDeviceRequest
berikut.setCommissioningService
mengikatAppCommissioningService
ke instanceCommissioningService
yang ditampilkan dalam fungsi callback. Saat Anda meneruskan layanan kustom, Home Mobile SDK akan terlebih dahulu menetapkan perangkat ke Google Fabric, lalu mengirim kembali payload orientasi keAppCommissioningService
.fun commissionDevice(context: Context) { _commissionDeviceStatus.postValue(TaskStatus.InProgress) val commissionDeviceRequest = CommissioningRequest.builder() .setCommissioningService(ComponentName(context, AppCommissioningService::class.java)) .build()
- Panggil
.getCommissioningClient()
, lalu panggil.commissionDevice()
.Matter.getCommissioningClient(context) .commissionDevice(commissionDeviceRequest)
Untuk menyelesaikan fungsi commissionDevice
, tambahkan addOnSuccessListener
dan addOnFailureListener
lalu posting ke objek LiveData:
.addOnSuccessListener { result -> // Communication with fragment is via livedata _commissionDeviceIntentSender.postValue(result) } .addOnFailureListener { error -> Timber.e(error) _commissionDeviceStatus.postValue( TaskStatus.Failed("Failed to to get the IntentSender.", error) } }
Setelah menggunakan pengirim, consumeCommissionDeviceIntentSender()
harus dipanggil untuk mencegah pengirim menerima lagi setelah perubahan konfigurasi.
/** * Consumes the value in [_commissionDeviceIntentSender] and sets it back to null. Needs to be * called to avoid re-processing the IntentSender after a configuration change (where the LiveData * is re-posted). */ fun consumeCommissionDeviceIntentSender() { _commissionDeviceIntentSender.postValue(null) }
5. Membuat CommissioningService
Dalam fungsi commissionDevice()
, kita meminta untuk mendapatkan CommissioningService dari CommissioningClient API. Dalam alur ini, CommissioningClient API menugaskan perangkat ke fabric Android Lokal terlebih dahulu, lalu menampilkan callback yang menyertakan objek CommissioningRequestMetadata:
public interface CommissioningService { interface Callback { void onCommissioningRequested(CommissioningRequestMetadata metadata); } }
Sekarang, kita harus mewarisi CommissioningService.Callback dan menyediakan fungsi yang diperlukan untuk menetapkan perangkat ke aplikasi contoh. Berikut adalah contoh penerapan CommissioningService dasar:
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()) } }
Langkah 1: Pelajari AppCommissioningService kustom
Untuk membantu Anda memulai, kami telah menentukan struktur class dasar untuk CommissioningService kustom kami. Berikut adalah ringkasan singkat tentang fungsi layanan. Untuk mengikuti, buka AppCommissioningService
di java/commissioning
.
Kami telah menambahkan impor berikut untuk Home Mobile SDK API:
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
juga menyertakan library dari repo Matter (connectedhomeip
):
import com.google.home_sample_app_for_matter.chip.ChipClient
Terakhir, layanan ini menyertakan impor untuk mendukung Hilt dan coroutine Kotlin.
Selanjutnya, kita membuat konstruktor dan menyiapkan beberapa hal, termasuk commissioningServiceDelegate
, yang akan kita gunakan untuk memberi tahu Layanan Google Play saat komisi selesai.
private lateinit var commissioningServiceDelegate: CommissioningService ... commissioningServiceDelegate = CommissioningService.Builder(this).setCallback(this).build()
Sekarang saatnya menambahkan fungsi komisi.
Langkah 2: Ganti onCommissioningRequest
Untuk menetapkan perangkat ke struktur pengembangan aplikasi, selesaikan langkah-langkah berikut:
- Buka
AppCommissioningService
dijava/commissioning
. - Cari fungsi
onCommissioningRequested()
. Kami telah menyediakan pesan log yang mencetakCommissioningRequestMetadata
. Ganti komentar// CODELAB: onCommissioningRequested()
untuk memulai coroutineserviceScope
dan dapatkandeviceId
.// Perform commissioning on custom fabric for the sample app. serviceScope.launch { val deviceId = devicesRepository.incrementAndReturnLastDeviceId()
- Lakukan komisi. Untuk langkah ini, kita dapat meneruskan informasi perangkat yang ditampilkan di objek CommissioningRequestMetadata.
ChipClient
menggunakan informasi metadata ini untuk membuat saluran yang aman antara aplikasi GHSA untuk Matter dan perangkat Anda.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)
- Gunakan
commissioningServiceDelegate
untuk memberi tahu Layanan Google Play bahwa komisi telah selesai. Di.sendCommissioningComplete()
, teruskan CommissioningCompleteMetadata.Timber.d("Commissioning: Calling commissioningServiceDelegate.sendCommissioningComplete()") commissioningServiceDelegate .sendCommissioningComplete( CommissioningCompleteMetadata.builder().setToken(deviceId.toString()).build()) .addOnSuccessListener { Timber.d("Commissioning: OnSuccess for commissioningServiceDelegate.sendCommissioningComplete()") } .addOnFailureListener { ex -> Timber.e(ex, "Commissioning: Failed to send commissioning complete.", ex) } }
Menjalankan aplikasi
Setelah semua kode yang diperlukan siap untuk diterapkan ke kain lokal, kini saatnya untuk mengujinya. Pilih perangkat Android Anda, lalu jalankan aplikasi. Dari Layar utama, ketuk Tambahkan Perangkat dan selesaikan langkah-langkah untuk menetapkan perangkat Anda.
Saat komisi selesai, perangkat Anda kini berpartisipasi dalam dua kain: kain Android Lokal dan kain pengembangan lokal. Setiap kain memiliki kumpulan kredensialnya sendiri dan ID kain 64-bit yang unik.
6. Perangkat kontrol
Komisi untuk kain pengembangan memungkinkan Anda menggunakan library dari repositori Matter (connectedhomeip
) untuk mengontrol perangkat dari aplikasi contoh.
Kami telah membuat beberapa class helper untuk mempermudah akses ke Cluster perangkat dan mengirim perintah. Untuk mempelajari lebih lanjut, buka ClustersHelper
di java/clusters
. Helper Singleton ini mengimpor library berikut untuk mengakses informasi perangkat:
import chip.devicecontroller.ChipClusters import chip.devicecontroller.ChipStructs
Kita dapat menggunakan class ini untuk mendapatkan Cluster Aktif/Nonaktif untuk perangkat, lalu memanggil .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) } }) } }
Beralih perangkat
Setelah Anda membuat perangkat, payload yang ditampilkan dalam CommissioningResult akan ditambahkan ke DataStore. Tindakan ini memberi aplikasi kami akses ke informasi perangkat yang dapat kami gunakan untuk mengirim perintah.
Aplikasi Matter berbasis peristiwa. Saat stack Matter diinisialisasi, layanan Cluster akan memproses pesan masuk. Setelah perangkat digunakan, klien Matter akan mengirim perintah melalui saluran operasional aman yang dibuat selama pengoperasian perangkat.
Di perangkat, paket divalidasi, didekripsi, lalu dikirim dengan callback. Fungsi callback mencakup EndpointId, ClusterId, dan AttributeId, yang dapat diakses dari attributePath
. Misalnya, kode ini dapat diterapkan di perangkat 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; }
Pada langkah berikutnya, Anda akan menggunakan Matter SDK dan ClustersHelper
untuk mengalihkan perangkat.
- Buka
DeviceViewModel
dijava/screens/device
. - Cari fungsi
updateDeviceStateOn
. - Ganti komentar
// CODELAB: toggle
dengan kode untuk memanggilclustersHelper
, lalu perbarui repositori perangkat: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") }
Fungsi ini dipanggil dari DeviceFragment
:
// Change the on/off state of the device binding.onoffSwitch.setOnClickListener { val isOn = binding.onoffSwitch.isChecked viewModel.updateDeviceStateOn(selectedDeviceViewModel.selectedDeviceLiveData.value!!, isOn) }
Menjalankan aplikasi
Jalankan aplikasi untuk memuat ulang update Anda. Dari Layar utama, aktifkan dan nonaktifkan perangkat.
7. Berbagi perangkat dengan ekosistem lain
Berbagi perangkat disebut sebagai alur multi-admin dalam spesifikasi Matter.
Di langkah sebelumnya, kita telah mempelajari bahwa Home Mobile SDK memungkinkan perangkat dibuat ke Lokal Android dan juga ke kain pengembangan untuk aplikasi contoh. Ini adalah contoh alur multi-admin, di mana perangkat dapat ditugaskan ke lebih dari satu kain.
Anda kini mungkin ingin berbagi perangkat dengan lebih banyak kain, terutama jika ini adalah rumah tangga yang memiliki preferensi tersendiri untuk aplikasi dan platform.
Home Mobile SDK menyediakan fungsi ini di ShareDeviceRequest API, memungkinkan Anda untuk:
- Buka jendela komisi sementara untuk perangkat.
- Ubah status perangkat Anda, sehingga perangkat tersebut dapat dipesan ke kain lain.
- Mengontrol perangkat Anda dari aplikasi dan ekosistem lainnya.
Pada langkah berikutnya, Anda akan menggunakan Home Mobile SDK untuk berbagi perangkat.
Langkah 1: Buat Peluncur Aktivitas GPS
Serupa dengan Peluncur Aktivitas Komisi yang kami buat saat memesan untuk kain pengembangan, kami telah membuat Peluncur Aktivitas Perangkat Bersama untuk menangani IntentSender
dari CommissioningClient API.
- Buka
DeviceFragment
di folderjava/screens/device/
. - Ganti komentar
// CODELAB: shareDeviceLauncher definition
dengan kode berikut untuk mendaftarkan dan menangani hasil Aktivitas.shareDevice()
:shareDeviceLauncher = registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result -> // Share Device Step 5. // The Share Device activity in GPS (step 4) has completed. val resultCode = result.resultCode if (resultCode == RESULT_OK) { Timber.d("ShareDevice: Success") viewModel.shareDeviceSucceeded(selectedDeviceViewModel.selectedDeviceLiveData.value!!) } else { viewModel.shareDeviceFailed( selectedDeviceViewModel.selectedDeviceLiveData.value!!, resultCode) } }
Langkah 2: Tinjau objek LiveData
Callback berhasil dari .shareDevice()
API menyediakan IntentSender
yang akan digunakan untuk meluncurkan Aktivitas Perangkat Bersama di Layanan Google Play. Di DeviceViewModel
, kita telah membuat dua objek LiveData untuk dilaporkan berdasarkan panggilan API ini:
_shareDeviceStatus
untuk melacakTaskStatus
.// The current status of the share device action. viewModel.shareDeviceStatus.observe(viewLifecycleOwner) { status -> val isButtonEnabled = status !is InProgress updateShareDeviceButton(isButtonEnabled) if (status is TaskStatus.Failed) { showAlertDialog(errorAlertDialog, status.message, status.cause!!.toString()) } }
_shareDeviceIntentSender
untuk menangani hasil panggilan.sharedevice()
.viewModel.shareDeviceIntentSender.observe(viewLifecycleOwner) { sender -> Timber.d("shareDeviceIntentSender.observe is called with [${intentSenderToString(sender)}]") if (sender != null) { // Share Device Step 4: Launch the activity described in the IntentSender that // was returned in Step 3 (where the viewModel calls the GPS API to commission // the device). Timber.d("ShareDevice: Launch GPS activity to share device") shareDeviceLauncher.launch(IntentSenderRequest.Builder(sender).build()) viewModel.consumeShareDeviceIntentSender() } }
Pada langkah berikutnya, kita akan menggunakan objek LiveData ini dalam panggilan API .shareDevice()
.
Langkah 3: Panggil API
Sekarang saatnya memulai tugas berbagi perangkat.
- Buka
DeviceViewModel.kt
di folderjava/screens/device/
. - Cari fungsi
shareDevice()
. Ganti komentar// CODELAB: shareDevice
dengan ShareDeviceRequest.DeviceDescriptor
memberikan informasi khusus tentang perangkat seperti ID Vendor, ID Produk, dan deviceType. Dalam contoh ini, kita melakukan hard code pada nilai.Timber.d("ShareDevice: Setting up the IntentSender") val shareDeviceRequest = ShareDeviceRequest.builder() .setDeviceDescriptor(DeviceDescriptor.builder().build()) .setDeviceName("temp device name")
- Tetapkan CommissioningWindow dan parameter. Pada tahap ini, periode komisi sementara akan dibuka di perangkat.
.setCommissioningWindow( CommissioningWindow.builder() .setDiscriminator(Discriminator.forLongValue(DISCRIMINATOR)) .setPasscode(SETUP_PIN_CODE) .setWindowOpenMillis(SystemClock.elapsedRealtime()) .setDurationSeconds(OPEN_COMMISSIONING_WINDOW_DURATION_SECONDS.toLong()) .build()) .build()
- Panggil
.getCommissioningClient()
, hanya kali ini, gunakan.shareDevice()
API. Callback berhasil daricommissioningClient.shareDevice()
API menyediakan IntentSender yang akan digunakan untuk meluncurkan Activity Device Activity di Layanan Google Play.Matter.getCommissioningClient(activity) .shareDevice(shareDeviceRequest)
- Untuk menyelesaikan fungsi
shareDevice
, tambahkanaddOnSuccessListener
danaddOnFailureListener
lalu posting ke objek LiveData:.addOnSuccessListener { result -> Timber.d("ShareDevice: Success getting the IntentSender: result [${result}]") // Communication with fragment is via livedata _backgroundWorkAlertDialogAction.postValue(BackgroundWorkAlertDialogAction.Hide) _shareDeviceIntentSender.postValue(result) } .addOnFailureListener { error -> Timber.e(error) _backgroundWorkAlertDialogAction.postValue(BackgroundWorkAlertDialogAction.Hide) _shareDeviceStatus.postValue( TaskStatus.Failed("Setting up the IntentSender failed", error)) }
Setelah menggunakan pengirim, consumeShareDeviceIntentSender
harus dipanggil untuk mencegah pengirim menerima lagi setelah perubahan konfigurasi.
/** * Consumes the value in [_shareDeviceIntentSender] and sets it back to null. Needs to be called * to avoid re-processing an IntentSender after a configuration change where the LiveData is * re-posted. */ fun consumeShareDeviceIntentSender() { _shareDeviceIntentSender.postValue(null) }
Menjalankan aplikasi
Untuk berbagi perangkat Matter dengan ekosistem lain, Anda harus menginstal platform lain di perangkat Android. Kami telah membuat instance aplikasi contoh lain yang dapat Anda gunakan sebagai komisioner target.
Setelah Anda menginstal target Commissioner di perangkat Android, verifikasi bahwa Anda dapat membagikan perangkat Matter. Aplikasi target komisaris diberi label GHSAFM-TC.
Perangkat Anda kini dapat berpartisipasi dalam tiga struktur:
- Fabric Android lokal.
- Fabric pengembangan Anda (aplikasi ini).
- Fabric ketiga yang baru saja Anda gunakan untuk berbagi perangkat.
8. Langkah Berikutnya
Selamat
Selamat, Anda telah berhasil menyelesaikan Codelab ini dan mempelajari cara melakukan komisi serta berbagi perangkat menggunakan Home Mobile SDK.
Jika Anda mengalami masalah dengan aplikasi contoh, coba selesaikan langkah-langkah ini untuk memverifikasi lingkungan Anda:
Jika ada pertanyaan tentang penggunaan aplikasi contoh atau menemukan bug kode, Anda dapat mengirimkan masalah ke Issue Tracker di repositori GitHub:
Untuk mendapatkan panduan resmi dari Google terkait pertanyaan teknis, gunakan Forum Developer Smart Home:
Untuk mendapatkan dukungan teknis dari komunitas, gunakan tag google-smart-home
di Stack Overflow: