1. Hoş Geldiniz
IoT standartlarını birleştirme hedefiyle geliştirilen Matter, Google Home, Zigbee, Bluetooth Mesh, Z-Wave gibi çeşitli ekosistemlerdeki akıllı ev cihazlarını birbirine bağlar.
Mobil cihazlar, akıllı ev cihazlarıyla merkezi etkileşim noktasıdır. Matter cihazlarını desteklemek için kendi Android uygulamalarınızı oluşturmak isterseniz hızlı bir başlangıç yapmanıza yardımcı olabiliriz.
Google Home for Matter (Matter için GHSA) örnek uygulamasında, kullanıcıların cihazları komisyonlandırmasına ve paylaşmasına olanak tanıyan Home Mobile SDK API'lerini gösterir. Örnek uygulamayı, Matter ile ilgili temel kavramları daha iyi anlamak için bir öğrenme aracı, Matter cihazlarıyla etkileşimlerde hata ayıklama ve sorun giderme aracı olarak da kullanabilirsiniz.
Yapacaklarınız
Bu Codelab'de, örnek uygulamanın kaynak kodunu indirecek ve cihazları komisyon ve paylaşmak için Home Mobile SDK'sını nasıl kullanacağınızı öğreneceksiniz. Ayrıca Matter deposundaki (connectedhomeip
) devreye alma ve küme kitaplıklarının nasıl kullanılacağını da öğreneceksiniz.
Örnek uygulamayı indirmenizden sonra, kaynak kodu Android Studio'da incelenir ve aşağıdaki Home Mobile SDK API'leri uygulanır:
Ayrıca devreye alma kavramları, Matter kumaşları ve Matter cihazlarını kontrol etme hakkında daha fazla bilgi edineceksiniz.
Gerekenler
Başlamadan önce, aşağıdaki adımları tamamladığınızdan emin olun:
- Matter için Google Home Örnek Uygulaması Kılavuzu'nu inceleyin.
- Android Studio'yu indirin.
- Test için Android O (8.1, API düzeyi 27) veya daha yeni bir cihaz bulundurun. Cihazınızda en güncel Matter desteğine sahip olduğunuzdan emin olmak için Konu Modüllerini ve Hizmetlerini Doğrulama kılavuzunu inceleyin.
- Açma/kapatma özelliklerine sahip bir Matter cihazı kullanın. Ortamla ilgili sorunları en aza indirmek için öncelikle Matter Virtual Device (MVD) kullanmanızı önemle tavsiye ederiz. Sorunla karşılaşırsanız örnek uygulamanın MVD'ye karşı kullanılıp kullanılmadığını araştırmak çok daha kolay olacaktır. Diğer birkaç seçenek:
rootnode_dimmablelight_bCwGYSDpoe
uygulamasıyla bir Matter sanal cihazı oluşturun. Home Developer Console'da bir Matter entegrasyonu oluştururken tedarikçi kimliğiniz olarak0xFFF1
ve ürün kimliğiniz olarak0x8000
kullanın.all-clusters-app
ile Espressif Cihazı oluşturun. Home Developer Console'da Matter entegrasyonu oluştururken tedarikçi kimliğiniz olarak0xFFF1
ve ürün kimliğiniz olarak0x8001
kullanın.
- Google Play Hizmetleri'ni nasıl kuracağınızı inceleyin.
Örnek uygulamayı kullanarak cihazları komisyon ve kontrol etmek için merkeze (ör. Google Nest Hub (2. Nesil)) ihtiyacınız yoktur.
2. Hazırlanın
Codelab başlangıç uygulaması codelab
dalında yer alır. Codelab kaynak koduyla çalışmaya başlamak için ZIP dosyasını indirebilirsiniz.
Çalışan bir örnek oluşturmak için bu codelab
ZIP dosyasını kullanacaksınız.
Codelab sürümleri
codelab
dalı, örnek uygulamanın 2.0.0 sürümüyle etiketlenmiştir. Her adımda çalışırken güncellemelerinizi karşılaştırmak için bu sürümün tamamlanmış kaynak kodunu indirebilirsiniz.
GitHub deposunu klonlamak istiyorsanız Örnek uygulama README'deki talimatları uygulayın.
Bağımlılıklar
Cihazları paylaşmak ve komisyonlu hale getirmek için gereken kaynak kodu konusunda size yol göstereceğiz. Ancak, başlamadan önce aşağıdaki bağımlılıkların farkında olmak yardımcı olabilir. Bu bağımlılıkların libs.versions.toml dosyasında ve kullanımlarının build.gradle.kts dosyasında belirtildiğini unutmayın.
- Home Mobile SDK'sı
- Matter SDK kitaplıkları.
- Jetpack Compose. Kullanıcı arayüzü, Compose kullanılarak eksiksiz olarak uygulanmıştır.
- Materyal Tasarım. Daha fazla bilgi edinmek için MDC-103 Android: Renk, Yükseklik ve Tür ile Materyal Tema Oluşturma (Kotlin) ve Malzeme Teması Oluşturucu bölümlerine göz atın.
- Uygulama verilerini saklamak için kullanılan Proto DataStore. Cihazlara yönelik şemalar ve kullanıcı tercihleri dahil olmak üzere Datastore Depoları ve Serileştiriciler
java/data
içinde depolanır. DataStore hakkında daha fazla bilgi edinmek için Proto DataStore ile çalışma bölümüne bakın. - Verileri korumak ve bağımlılık yerleştirmeyi desteklemek için hilt kullanın.
Kaynak kodu
Kullanıcı arayüzü ve işlevlerin çoğu sizin için önceden oluşturuldu.
Bu codelab için aşağıdaki dosyalara Matter işlevini ekleyeceğiz:
java/commissioning/AppCommissioningService
: Cihazların, geliştirme dokusu için komisyon almasını sağlar.java/screens/home/HomeScreen
vejava/screens/home/HomeViewModel.kt
: Home Mobile SDK devreye alma işlevini içerirjava/screens/device/DeviceScreen
vejava/screens/device/DeviceViewModel
: Cihaz Paylaşma API çağrılarını içerir
Her dosya, değiştireceğiniz kod bloğuyla birlikte yorumlanır. Örneğin:
// CODELAB: add commissioningFunction()
Bu sayede, codelab'deki ilgili bölümü hızla bulabilirsiniz.
3. Google'a komisyon
Cihazları kontrol edip aynı yapı içinde birbirleriyle iletişim kurmalarına izin vermeden önce, cihazların bir Yetkili tarafından görevlendirilmesi gerekir. Bu örnek uygulama, Matter için Google Home Örnek Uygulaması'dır.
Matter komisyonu hakkında aşağıdaki kavramları anlamanız önemlidir:
- Kumaşlar, cihazların birbiriyle iletişim kurmasına olanak tanır.
- Fabrics, ortak bir benzersiz kimlik bilgileri grubuna sahip.
- Ekosistemler; güvenilir kök sertifikaların yayınlanmasından, yapı kimliklerinin ve benzersiz düğüm kimliklerinin atanmasından sorumludur. Ekosistem, bir komisyon kullanıcısının arka uç hizmetidir (ör. Google Home ekosistemi için Home Graph).
- Cihazlar birden fazla yapıya devredilebilir (çok yöneticili özellik).
Bir cihaz komisyonu için CommissioningClient API'yi kullanmanız gerekir. .commissionDevice()
çağrısı bir IntentSender döndürür ve Google Play Hizmetleri'nde uygun etkinliği başlatır:
interface CommissioningClient { Task<IntentSender> commissionDevice(CommissioningRequest request); }
Sonraki bölümlerde, cihazları Google altyapısına komisyonlu olarak sunmak için gereken minimum kodu açıklayacağız.
1. Adım: Etkinlik Başlatıcı
CommissioningClient
öğesinden IntentSender
öğesini işlemek için ActivityResultLauncher kullanabilirsiniz:
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. Adım: İşlevi devreye alma
Bir cihazı Google yapısına yaptırmak için CommissioningClient API'nin kullanıldığı temel bir örneği burada bulabilirsiniz.
- Devreye alma işlemi
commissionDevice()
işleviyle başlar. ÖncelikleCommissioningRequest
tanımlanır. Bu varsayılan yapılandırmaya göre, cihazlar yalnızca Yerel Android yapısına göre yaptırılır. Matter
, Home Mobile SDK'sının giriş noktasıdır. Bir sonraki görüşmede.getCommissioningClient
,this
tarafından (Etkinlik) CommissioningClient alır..commissionDevice()
,CommissioningRequest
hükümlerini kabul eder.- Son olarak
.addOnSuccessListener
adlı cihazınCommissioningResult
işlemini işlemesi ve Google Play Hizmetleri (GPS) Komisyon Cihazı Etkinliğini başlatması için çağrılır.
private fun commissionDevice() { val request: CommissioningRequest = CommissioningRequest.builder().build() Matter.getCommissioningClient(this) .commissionDevice(request) .addOnSuccessListener { result -> commissioningLauncher.launch(IntentSenderRequest.Builder(result).build()) } }
Cihazlarını diğer kumaşlar için devreye alma sürecini basitleştirmek amacıyla Yerel Android Fabric, Android ayarları aracılığıyla kullanılabilir.
Ardından, geliştirme dokusu için bir cihazın nasıl görevlendirileceğini öğreneceksiniz.
Devreye alma işlemi sırasında kullanıcı arayüzüne genel bir bakış için Google Home Sample App for Matter Kılavuzu'nu inceleyin.
4. Geliştirme dokusu için komisyon
Cihazlar birden fazla kumaş için yaptırılabilir. Güvenilir eşlemeleri yönetmek için cihazlar çeşitli FabricInfo
üyeleri içeren bir FabricTable
depolar. Örneğin:
- Kumaş tanımlama
- Yapı tarafından cihaza atanan düğüm kimliği
- Tedarikçi kimliği
- Kumaş Kimliği
- Operasyonel cihaz kimlik bilgileri
Yönetim alan yöneticisi (ADM), yapı kimlik bilgilerini tanımlar. Önceki senaryoda Google Play Hizmetleri, güvenilir bir kök sertifika yetkilisi (CA) görevi gören ekosistemdir. Cihazları Yerel Android kumaşı için yaptırdığınızda her cihaz aynı kumaş kimlik bilgileri grubunu ve aynı CA grubunu içerir.
Özel Devreye Alma Hizmetleri
Yerel Android yapısını devreye sokmak amacıyla, CommissioningClient API'de CommissioningRequest
öğesini oluşturmak için varsayılan parametreleri kullandık:
val request: CommissioningRequest = CommissioningRequest.builder().build()
Uygulamanızdan yeni cihazları kontrol etmek ve yönetmek istiyorsanız yerel geliştirme yapısı oluşturmanız ve cihazları devreye sokmak için operasyonel kimlik bilgilerini almanız gerekir. Bu senaryoda uygulamanız, cihazlara uygun düğüm kimlik bilgilerini atayan benzersiz, bağımsız bir ekosisteme dönüşür.
CommissioningRequest'e özel bir hizmet ileterek, Home Mobile SDK'sına cihazları kendi yapınıza göre komisyonlamak istediğinizi bildirebilirsiniz:
class CommissioningRequest { static CommissioningRequest.Builder builder(); class Builder { Builder setCommissioningService(@Nullable ComponentName commissioningService); CommissioningRequest build(); } }
Sonraki adımlarda commissionDevice()
işlevini, özel bir hizmet kullanacak şekilde değiştireceğiz. Ayrıca, Home parçasına bir Etkinlik Başlatıcı ekleyeceğiz ve API akışını yönetmek için LiveData nesnelerini kullanacağız.
1. Adım: GPS Etkinlik Başlatıcı oluşturun
Öncelikle, CommissioningClient API'den IntentSender
işlemini işlemek için bir Etkinlik Başlatıcı oluşturalım.
java/screens/home/
klasöründeHomeScreen
uygulamasını açın.- Devreye alma Etkinliği sonucunu kaydetmek ve işlemek için
// CODELAB: commissionDeviceLauncher definition
yorumunu aşağıdaki kodla değiştirin: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. adım: Komisyon cihaz işlemini tetikleyin
Bu adımda kullanıcı, Ana ekranın sağ alt kısmındaki "+" düğmesini tıklayarak "Komisyon Cihaz" işlemini tetikler. Ardından commissionDevice()
numarasına bir arama yapılır.
val onCommissionDevice = { ... commissionDevice(activity!!.applicationContext, commissionDeviceLauncher) }
3. Adım: API'yi çağırın
- Hâlâ
HomeScreen.kt
konumunda,java/screens/home/
klasöründe. // CODELAB: commissionDevice
yorumunu aşağıdakicommissionDeviceRequest
ile değiştirin.setCommissioningService
,AppCommissioningService
öğesini bir geri çağırma işlevinde döndürülenCommissioningService
örneğine bağlar. Özel bir hizmeti ilettiğinizde Home Mobile SDK'sı önce cihazları Android yerel yapısına göre ayarlar, ardından ilk katılım yükünüAppCommissioningService
cihazına geri gönderir.val commissionDeviceRequest = CommissioningRequest.builder() .setCommissioningService(ComponentName( context, AppCommissioningService::class.java)) .build()
.getCommissioningClient()
numaralı telefonu arayın, ardından.commissionDevice()
numaralı telefonu arayın.
Matter.getCommissioningClient(context) .commissionDevice(commissionDeviceRequest)
commissionDevice
işlevimizi tamamlamak için addOnSuccessListener
ve addOnFailureListener
ekleyin:
.addOnSuccessListener { result -> commissionDeviceLauncher.launch(IntentSenderRequest.Builder(result).build()) } .addOnFailureListener { error -> Timber.e(error) }
5. Devreye Alma Hizmeti oluşturma
commissionDevice()
işlevinde, CommissioningClient API'den bir CommissioningService almayı talep ettik. Bu akışta, CommissioningClient API, cihazları önce Yerel Android yapısına yaptırır, ardından CommissioningRequestMetadata nesnesini içeren bir geri çağırma döndürür:
public interface CommissioningService { interface Callback { void onCommissioningRequested(CommissioningRequestMetadata metadata); } }
Şimdi, CommissioningService'i devralmamız ve örnek uygulamamıza cihaz komisyonu sağlamak için gereken işlevi sağlamamız gerekiyor. Aşağıda, temel bir CommissioningService uygulaması örneği verilmiştir:
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. Adım: Özel AppCommissioningService'i keşfedin
Başlamanıza yardımcı olmak amacıyla, özel Komisyon Hizmetimizin temel sınıf yapısını zaten tanımladık. Aşağıda, hizmet işlevine hızlı bir genel bakış yer almaktadır. Takip etmek için java/commissioning
uygulamasında AppCommissioningService
sayfasını açın.
Home Mobile SDK API'leri için aşağıdaki içe aktarmaları ekledik:
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
, Matter deposundaki (connectedhomeip
) kitaplıkları da içerir:
import com.google.home_sample_app_for_matter.chip.ChipClient
Son olarak, hizmet Hilt ve Kotlin eş yordamlarını desteklemek için içe aktarmaları içerir.
Ardından, oluşturucuyu oluşturur ve devreye alma işleminin tamamlandığını Google Play Hizmetleri'ne bildirmek için kullanacağımız commissioningServiceDelegate
dahil olmak üzere birkaç ayar yaparız.
private lateinit var commissioningServiceDelegate: CommissioningService ... commissioningServiceDelegate = CommissioningService.Builder(this).setCallback(this).build()
Şimdi devreye alma işlevlerini ekleyebilirsiniz.
2. Adım: onCommissioningRequested geçersiz kılma
Cihazları, uygulamanın geliştirme yapısına komisyon vermek için aşağıdaki adımları tamamlayın:
AppCommissioningService
uygulamasınıjava/commissioning
uygulamasında aç.onCommissioningRequested()
işlevini bulun.CommissioningRequestMetadata
dokümanını yazdıran bir günlük mesajı sağladık.serviceScope
eşlemesini başlatmak vedeviceId
özelliğini almak için// CODELAB: onCommissioningRequested()
yorumunu değiştirin.// Perform commissioning on custom fabric for the sample app. serviceScope.launch { val deviceId = devicesRepository.incrementAndReturnLastDeviceId()
- Devreye alma. Bu adım için, CommissioningRequestMetadata nesnesinde döndürülen cihaz bilgilerini aktarabiliriz.
ChipClient
, bu meta veri bilgilerini Matter için GHSA uygulaması ile cihazınız arasında güvenli bir kanal oluşturmak için kullanır.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 }
- Devreye alma işleminin tamamlandığını Google Play Hizmetleri'ne
commissioningServiceDelegate
aracılığıyla bildirin..sendCommissioningComplete()
içinde CommissioningCompleteMetadata öğesini iletin.commissioningServiceDelegate .sendCommissioningComplete( CommissioningCompleteMetadata.builder().setToken(deviceId.toString()).build()) .addOnSuccessListener { Timber.d("Commissioning: commissioningServiceDelegate.sendCommissioningComplete() succeeded") } .addOnFailureListener { e -> Timber.e(e, "Commissioning: commissioningServiceDelegate.sendCommissioningComplete() failed") }
Uygulamayı çalıştırma
Yerel kumaşımız için komisyon almak için gerekli kodun tamamı yerleştirildiğine göre artık kodu test etme zamanı geldi. Android cihazınızı seçin ve uygulamayı çalıştırın. Ana ekrandan Cihaz Ekle'ye dokunun ve cihazınız için komisyon alma adımlarını tamamlayın.
Devreye alma işlemi tamamlandığında cihazınız artık iki kumaş kullanır: Yerel Android kumaşı ve yerel geliştirme kumaşınız. Her kumaşın kendi kimlik bilgileri ve benzersiz, 64 bitlik bir kumaş kimliği vardır.
6. Cihazları kontrol etme
Bir geliştirme dokusunu devreye almak, örnek uygulamadan cihazları kontrol etmek için Matter deposundaki (connectedhomeip
) kitaplıkları kullanmanıza olanak tanır.
Cihaz kümelerine erişimi ve komut göndermeyi kolaylaştırmak için bazı yardımcı sınıflar oluşturduk. Daha fazla bilgi edinmek için java/clusters
uygulamasında ClustersHelper
uygulamasını açın. Bu Singleton yardımcısı, cihaz bilgilerine erişmek için aşağıdaki kitaplıkları içe aktarır:
import chip.devicecontroller.ChipClusters import chip.devicecontroller.ChipStructs
Bu sınıfı bir cihazda Açık/Kapalı Küme'yi almak için kullanabilir, ardından .toggle
numaralı telefonu arayabiliriz:
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) } }) } }
Cihaz açma/kapatma
Bir cihazı devreye aldıktan sonra, CommissioningResult öğesinde döndürülen yük DataStore'a eklenir. Bu, uygulamamızın komut göndermek için kullanabileceğimiz cihaz bilgilerine erişmesini sağlar.
Matter uygulamaları etkinliğe dayalıdır. Matter yığını ilk kullanıma hazırlandığında küme hizmetleri gelen iletileri dinler. Bir cihaz hizmete alındıktan sonra Matter istemcileri, cihazın devreye alınması sırasında oluşturulan güvenli operasyonel kanal üzerinden komutlar gönderir.
Cihazda paketler doğrulanır, şifresi çözülür ve geri çağırma ile gönderilir. Geri çağırma işlevleri, attributePath
aracılığıyla erişilebilen EndpointId, ClusterId ve AttributeId öğelerini içerir. Örneğin, şu kod bir Matter cihazına uygulanabilir:
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; }
Sonraki adımlarda, bir cihazı değiştirmek için Matter SDK'sını ve ClustersHelper
öğesini kullanacaksınız.
java/screens/device
bölgesindeDeviceViewModel
adresine gidin.updateDeviceStateOn
işlevini bulun.// CODELAB: toggle
yorumunuclustersHelper
çağrısı yapacak kodla değiştirin, ardından cihaz deposunu güncelleyin: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") }
Bu işlev DeviceScreen
konumundan çağrılır:
// On/Off Switch click. val onOnOffClick: (value: Boolean) -> Unit = { value -> deviceViewModel.updateDeviceStateOn(deviceUiModel!!, value) }
Uygulamayı çalıştırma
Güncellemelerinizi yeniden yüklemek için uygulamayı çalıştırın. Ana ekrandan cihazınızı açıp kapatın.
7. Cihazları diğer ekosistemlerle paylaşma
Cihaz paylaşımı, Matter spesifikasyonunda çoklu yönetici akışı olarak adlandırılır.
Önceki adımlarda, Home Mobile SDK'sının cihazları hem Yerel Android yapısına hem de örnek uygulama için bir geliştirme yapısına görelendirmeyi mümkün kıldığını öğrendik. Bu, cihazların birden fazla yapıya devredilebileceği çoklu yönetici akışı örneğidir.
Şimdi, özellikle de uygulama ve platformlar söz konusu olduğunda kullanıcıların kendi tercihleri olduğu bir hanede daha fazla kumaşa sahip cihazları paylaşmak isteyebilirsiniz.
Home Mobile SDK'sı, ShareDeviceRequest API'sinde bu işlevi sağlayarak şunları yapmanıza olanak tanır:
- Cihazlar için geçici bir devreye alma dönemi açın.
- Cihazlarınızın durumunu değiştirerek başka bir kumaş için yaptırılmalarını sağlayın.
- Cihazlarınızı başka uygulamalardan ve ekosistemlerden kontrol edin.
Sonraki adımlarda, cihazları paylaşmak için Home Mobile SDK'sını kullanacaksınız.
1. Adım: GPS Etkinlik Başlatıcı oluşturun
Bir geliştirme yapısını görevlendirdiğimiz zaman oluşturduğumuz Devreye Alma Etkinliği Başlatıcı'ya benzer şekilde, CommissioningClient API'deki IntentSender
işlemini işlemek için bir Cihaz Etkinliği Başlatıcısı Paylaş oluşturduk.
java/screens/device/
klasöründeDeviceScreen
uygulamasını açın..shareDevice()
Etkinliği sonucunu kaydetmek ve işlemek için// CODELAB: shareDeviceLauncher definition
yorumunu aşağıdaki kodla değiştirin: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. Adım: Cihazı paylaşma işlemini tetikleyin
Bu adımda kullanıcı, cihaz ekranındaki "Paylaş" düğmesini tıklayarak "Cihazı Paylaş" işlemini tetikler. Ardından, cihaz paylaşımı için bir Eşleme Penceresi açmak üzere deviceViewModel
adresine bir arama yapılır.
// Share Device button click. val onShareDevice: () -> Unit = { deviceViewModel.openPairingWindow(deviceUiModel!!.device.deviceId) }
Eşleştirme penceresini başarıyla açtıktan sonra deviceViewModel
, bu bilgiyi kullanıcı arayüzüne iletir. ViewModel
ve kullanıcı arayüzü arasındaki iletişim StateFlow
nesneleri üzerinden yapılır.
// Communicate to the UI that the pairing window is open. // UI can then launch the GPS activity for device sharing. _pairingWindowOpenForDeviceSharing.value = true
StateFlow nesnesindeki değişikliği gören DeviceScreen aşağıdaki çağrıyı yapar:
shareDevice(activity!!.applicationContext, shareDeviceLauncher, deviceViewModel)
3. Adım: API'yi çağırın
Artık bir cihaz paylaşma görevi başlatma zamanı.
java/screens/device/
klasöründeDeviceScreen.kt
uygulamasını açın.shareDevice()
işlevini bulun.// CODELAB: shareDevice
yorumunuShareDeviceRequest
ile değiştirin.DeviceDescriptor
; tedarikçi kimliği, ürün kimliği ve cihaz türü gibi cihazla ilgili belirli bilgiler sağlar. Bu örnekte, değerleri sabit bir şekilde kodluyoruz.val shareDeviceRequest = ShareDeviceRequest.builder() .setDeviceDescriptor(DeviceDescriptor.builder().build()) .setDeviceName("GHSAFM temp device name")
- CommissioningWindow ve parametreleri ayarlayın.
.setCommissioningWindow( CommissioningWindow.builder() .setDiscriminator(Discriminator.forLongValue(DISCRIMINATOR)) .setPasscode(SETUP_PIN_CODE) .setWindowOpenMillis(SystemClock.elapsedRealtime()) .setDurationSeconds(OPEN_COMMISSIONING_WINDOW_DURATION_SECONDS.toLong()) .build()) .build()
.getCommissioningClient()
numaralı telefonu arayın. Yalnızca bu sefer.shareDevice()
API'yi kullanın.Matter.getCommissioningClient(context) .shareDevice(shareDeviceRequest)
commissioningClient.shareDevice()
API'sinin başarılı geri çağırması, Google Play Hizmetleri'nde Cihaz Paylaşma Etkinliğini başlatmak için IntentSender'in kullanılmasını sağlar.
shareDevice
işlevimizi tamamlamak içinaddOnSuccessListener
veaddOnFailureListener
ekleyin. Başarılı olduğunda, cihaz paylaşımı için GPS etkinliğini başlatmak üzereshareDeviceLauncher
tarihindelaunch
çağrılır..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()) }
Uygulamayı çalıştırma
Matter cihazınızı diğer ekosistemlerle paylaşmak için Android cihazınızda başka bir platform yüklü olmalıdır. Hedef komisyon üyesi olarak kullanabileceğiniz başka bir örnek uygulama örneği oluşturduk.
Hedef komisyon üyesini Android cihazınıza yükledikten sonra Matter cihazınızı paylaşabildiğinizi doğrulayın. Hedef komisyon üyesi uygulaması GHSAFM-TC olarak etiketlenmiştir.
Cihazlarınız artık üç kumaşı kullanabilir:
- Yerel Android kumaşı.
- Geliştirme yapınız (bu uygulama).
- Cihazı yakın zamanda paylaştığınız üçüncü kumaş.
8. Sonraki adımlar
Tebrikler
Tebrikler, bu Codelab'i başarıyla tamamladınız ve Home Mobile SDK'sını kullanarak cihazların nasıl komisyonlandırılacağını ve paylaşılacağını öğrendiniz.
Örnek uygulamayla ilgili sorun yaşıyorsanız ortamınızı doğrulama adımlarını tamamlamayı deneyin:
Örnek uygulamayı kullanma hakkında sorularınız varsa veya bir kod hatasıyla karşılaşırsanız sorunları GitHub deposundaki Sorun İzleyici'ye gönderebilirsiniz:
Teknik sorular hakkında Google'dan resmi yardım almak için Akıllı Ev Geliştirici Forumu'nu kullanın:
Topluluktan teknik destek almak için Stack Overflow'da google-smart-home
etiketini kullanın: