1. Hoş Geldiniz
IoT standartlarını birleştirmek amacıyla geliştirilen Matter, akıllı ev cihazlarını Google Home, Zigbee, Bluetooth Mesh ve Z-Wave gibi çeşitli ekosistemlerde birbirine bağlar.
Mobil cihazlar, akıllı ev cihazlarıyla merkezi bir etkileşim noktasıdır. Matter cihazlarını desteklemek için kendi Android uygulamalarınızı geliştirmek istiyorsanız hızlı bir başlangıç yapmanıza yardımcı olabiliriz.
Google Home Sample App for Matter (Konu için GHSA), kullanıcıların cihazları devreye alıp paylaşmasına olanak tanıyan Home Mobile SDK API'lerini gösterir. Örnek uygulamayı, önemli Matter kavramlarını daha iyi anlamak için öğrenme aracı olarak kullanabilirsiniz. Matter cihazlarıyla etkileşimlerde hata ayıklama ve sorun giderme aracı olarak da bu uygulamayı kullanabilirsiniz.
Yapacaklarınız
Bu Codelab'de, örnek uygulamanın kaynak kodunu indirecek ve cihazları devreye alıp paylaşmak için Home Mobile SDK'sının nasıl kullanılacağını öğreneceksiniz. Ayrıca Matter deposundan (connectedhomeip
) devreye alma ve Küme kitaplıklarını nasıl kullanacağınızı öğreneceksiniz.
Örnek uygulamayı indirdikten sonra, Android Studio'da kaynak kodu inceleyip aşağıdaki Home Mobile SDK API'lerini uygularız:
Ayrıca kullanıma sunma kavramları, Matter yapıları ve Matter cihazlarını kontrol etme hakkında daha fazla bilgi edineceksiniz.
İhtiyacınız olanlar
Başlamadan önce aşağıdaki adımları tamamladığınızdan emin olun:
- Konu İçin Google Home Örnek Uygulaması Rehberi'ni inceleyin.
- Android Studio'yu indirin.
- Test için Android O (8.1, API düzeyi 27) veya daha yeni bir cihaza sahip olmak. Cihazınızın en son Matter desteğine sahip olduğundan emin olmak için Konu Modlarını Doğrulama ve Hizmetler rehberini inceleyin.
- Açma/kapatma özellikli bir Matter cihazı kullanın. Ortam sorunlarını en aza indirmek için, başlangıçta Matter Sanal Cihazı (MVD) kullanmanızı önemle tavsiye ederiz. Sorunla karşılaşırsanız örnek uygulamanın MVD'de kullanılıp kullanılmadığını araştırmak çok daha kolay olur. Aşağıda birkaç seçenek daha verilmiştir:
rootnode_dimmablelight_bCwGYSDpoe
uygulamasıyla Matter Sanal Cihazı oluşturun. Home Developer Console'da Konu entegrasyonu oluştururken Tedarikçi Kimliğiniz olarak0xFFF1
ve Ürün Kimliğiniz olarak0x8000
kullanın.all-clusters-app
ile bir Espressif cihazı oluşturun. Home Developer Console'da Matter entegrasyonu oluşturduğunuzda Tedarikçi Kimliği olarak0xFFF1
, Ürün Kimliğiniz olarak da0x8001
kullanın.
- Google Play Hizmetleri'ni kurma konusunu inceleyin.
Cihazları örnek uygulamayla devreye almak ve kontrol etmek için bir hub'a (ör. Google Nest Hub (2. Nesil)) ihtiyacınız yoktur.
2. Hazırlanın
Codelab başlangıç uygulaması codelab
dalında bulunur. 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 bir adımı tamamladıkça güncellemelerinizi karşılaştırmak için bu sürümün tamamlanmış kaynak kodunu indirebilirsiniz.
GitHub deposunu klonlamak istiyorsanız Sample uygulama README'deki talimatları uygulayın.
Bağımlılıklar
Cihazları paylaşmak ve yaptırmak için gereken kaynak kodu konusunda size rehberlik edeceğiz, ancak başlamadan önce aşağıdaki bağımlılıkları bilmeniz yararlı olabilir. Bu bağımlılıkların libs.versions.toml dosyasında tanımlandığını ve kullanımlarının build.gradle.kts dosyasında belirtildiğini unutmayın.
- Home Mobil SDK'sı
- Matter SDK kitaplıkları.
- Jetpack Compose. Kullanıcı arayüzü, Compose kullanılarak tamamen uygulanmıştır.
- Materyal Tasarım. Daha fazla bilgi edinmek için MDC-103 Android: Renk, Yükseklik ve Tür ile Malzeme Teması (Kotlin) ve Materyal Tema Oluşturucu başlıklı makalelere bakın.
- Proto DataStore, uygulama verilerini korumak için kullanılır. Datastore Depoları ve Serileştiriciler, cihazlar ve kullanıcı tercihleri ile ilgili şemalar dahil olmak üzere
java/data
içinde depolanır. DataStore hakkında daha fazla bilgi edinmek için Proto DataStore ile çalışma başlıklı makaleyi inceleyin. - Verileri kalıcı hale getirmek ve bağımlılık yerleştirmeyi desteklemek için Hilt.
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şlevi ekleyeceğiz:
java/com/google/homesampleapp/commissioning/AppCommissioningService
: Cihazları geliştirme yapısına yaptırmanızı sağlarjava/com/google/homesampleapp/screens/home/HomeScreen
vejava/com/google/homesampleapp/screens/home/HomeViewModel.kt
: Home Mobile SDK devreye alma işlevini içerirjava/com/google/homesampleapp/screens/device/DeviceScreen
vejava/com/google/homesampleapp/screens/device/DeviceViewModel
: Share Device API çağrılarını içerir
Her bir dosyaya, değiştireceğiniz kod bloğuyla yorum yapılır. Örneğin:
// CODELAB: add commissioningFunction()
Böylece codelab'de ilgili bölümü hızlıca bulabilirsiniz.
3. Google'a komisyon
Cihazları kontrol edebilmeniz ve aynı kumaş üzerinde birbirleriyle iletişim kurmalarına izin verebilmeniz için cihazların bir Yetkili Temsilci tarafından yaptırılması gerekir. Bu örnekte bu örnek uygulama olan Google Home Sample Uygulamasıdır.
Matter'ı devreye alma hakkında aşağıdaki kavramların anlaşılması önemlidir:
- Kumaşlar cihazların birbiriyle iletişim kurmasını sağlar.
- Yapılar, ortak bir benzersiz kimlik bilgileri kümesi sağlar.
- Ekosistemler güvenilir kök sertifikalar yayınlamaktan, yapı kimlikler atamaktan ve benzersiz düğüm kimlikleri atamaktan sorumludur. Ekosistem, komisyon verenin arka uç hizmetidir (ör. Google Home ekosistemi için Home Graph).
- Cihazlar birden fazla kumaşa çalıştırılabilir (çok yöneticili özellik).
Bir cihazı yaptırmak için CommissioningClient API'yi kullanmanız gerekir. .commissionDevice()
için yapılan bir çağrı, Google Play Hizmetleri'nde uygun etkinliği başlatan bir IntentSender döndürür:
interface CommissioningClient { Task<IntentSender> commissionDevice(CommissioningRequest request); }
Sonraki bölümlerde, cihazları Google kumaşına almak için gereken minimum koda değineceğiz.
1. Adım: Etkinlik Başlatıcı
CommissioningClient
öğesinden IntentSender
öğesini işlemek için bir 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: Devreye alma işlevi
Bir cihazı Google kumaşına almak için CommissioningClient API'nin kullanıldığı temel bir örneği burada bulabilirsiniz.
- Devreye alma süreci,
commissionDevice()
işleviyle başlar. İlk olarak birCommissioningRequest
tanımlanmıştır. Bu varsayılan yapılandırmayla cihazlar yalnızca Yerel Android yapısına göre yetkilendirilir. Matter
, Home Mobile SDK'sının giriş noktasıdır. Bir sonraki görüşmede.getCommissioningClient
,this
tarihine kadar bir CommissioningClient alıyor (Etkinlik)..commissionDevice()
,CommissioningRequest
şartlarını kabul eder.- Son olarak
.addOnSuccessListener
,CommissioningResult
işlemini işlemek ve Google Play Hizmetleri (GPS) Komisyon Cihazı Etkinliği'ni başlatmak 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()) } }
Yerel Android Fabric, cihazlarını diğer kumaşlara yaptırma sürecini basitleştirmek için Android ayarları aracılığıyla kullanılabilir.
Daha sonra, bir cihazı geliştirme kumaşı için nasıl yaptıracağınızı öğreneceksiniz.
Çalıştırma işlemi sırasında kullanıcı arayüzüne genel bakış için Google Home Örnek Uygulaması for Matter Kılavuzu'na bakın.
4. Geliştirme kumaşına komisyon
Cihazlar birden fazla kumaş için kullanı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
- Cihazın çalışma kimlik bilgileri
İdari alan yöneticisi (ADM), yapı kimlik bilgilerini tanımlar. Önceki senaryoda Google Play Hizmetleri, güvenilir bir kök sertifika yetkilisi (CA) olarak çalışan ekosistemdir. Cihazları yerel Android yapısına yaptırdığınızda her cihaz aynı yapı kimlik bilgilerini ve aynı CA'ları içerir.
Özel Devreye Alma Hizmetleri
Yerel Android kumaşı için komisyon almak amacıyla CommissioningClient API'de CommissioningRequest
öğesini oluşturmak için varsayılan parametreleri kullandık:
val request: CommissioningRequest = CommissioningRequest.builder().build()
Yeni cihazları uygulamanızdan kontrol etmek ve yönetmek isterseniz bir yerel geliştirme yapısı oluşturup cihazları yaptırmak için operasyonel kimlik bilgilerini edinmeniz gerekir. Bu senaryoda uygulamanız, cihazlara uygun düğüm kimlik bilgilerini atayan benzersiz ve bağımsız bir ekosisteme dönüşür.
CommissioningRequest'e özel bir hizmet ileterek cihazları kendi kumaşınıza komisyon vermek istediğinizi Home Mobile SDK'sına 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 Ana sayfa parçasına bir Etkinlik Başlatıcı ekleyecek ve API akışını yönetmek için LiveData nesnelerini kullanacağız.
1. Adım: GPS Etkinlik Başlatıcı oluşturun
İlk olarak, IntentSender
öğesini CommissioningClient API'den işlemek için bir Etkinlik Başlatıcı oluşturalım.
java/com/google/homesampleapp/screens/home/
klasöründeHomeScreen
dosyasını açın.- Komisyon 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ı "Komisyon Cihazı"nı tetikler. "+" işaretini tıklayarak düğmesini tıklayın. Ardından commissionDevice()
numaralı telefona arama yapılır.
val onCommissionDevice = { ... commissionDevice(activity!!.applicationContext, commissionDeviceLauncher) }
3. Adım: API'yi çağırın
HomeScreen.kt
klasöründe,java/com/google/homesampleapp/screens/home
klasöründe yer alıyor.// CODELAB: commissionDevice
yorumunu, aşağıdakicommissionDeviceRequest
ile değiştirin.setCommissioningService
,AppCommissioningService
öğesini birCommissioningService
örneğine bağlar ve geri çağırma işlevinde döndürülür. Bir özel hizmeti ilettiğinizde Home Mobile SDK'sı önce cihazları Android yerel yapısına sipariş eder, ardından ilk katılım yükünü tekrarAppCommissioningService
cihazına 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 bir 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 alma isteğinde bulunduk. Bu akışta, CommissioningClient API öncelikle cihazları 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.Callback bölümünü devralmamız ve örnek uygulamamıza cihaz yaptırmak 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 için özel komisyon hizmetimizin temel sınıf yapısını zaten tanımladık. Hizmetin işlevine ilişkin kısa bir genel bakışı burada bulabilirsiniz. Takip etmek için java/commissioning
uygulamasında AppCommissioningService
uygulaması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.homesampleapp.chip.ChipClient
Son olarak, hizmet Hilt ve Kotlin eş yordamlarını desteklemek için içe aktarma işlemleri içerir.
Daha sonra, oluşturucuyu oluşturup commissioningServiceDelegate
de dahil olmak üzere birkaç şeyi ayarlıyoruz. Bu kurulumu, devreye alma tamamlandığında Google Play Hizmetleri'ne bildirmek için kullanacağız.
private lateinit var commissioningServiceDelegate: CommissioningService ... commissioningServiceDelegate = CommissioningService.Builder(this).setCallback(this).build()
Şimdi sıra, devreye alma fonksiyonlarını eklemeye geldi.
2. Adım: onCommissioningREQUEST'i geçersiz kıl
Cihazları, uygulamanın geliştirme yapısına komisyon vermek için aşağıdaki adımları tamamlayın:
AppCommissioningService
dosyasınıjava/commissioning
uygulamasında açın.onCommissioningRequested()
işlevini bulun.CommissioningRequestMetadata
öğesini yazdıran bir günlük mesajı sağladık.serviceScope
eş yordamını başlatmak vedeviceId
değerini 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 işlemi gerçekleştirin. Bu adımda, CommissioningRequestMetadata nesnesinde döndürülen cihaz bilgilerini iletebiliriz.
ChipClient
, bu meta veri bilgilerini kullanarak GHSA for Matter uygulaması ile cihazınız arasında güvenli bir kanal oluşturur.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 bildirmek için
commissioningServiceDelegate
bilgisini kullanın..sendCommissioningComplete()
içinde, CommissioningCompleteMetadata'yı 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ırın
Artık gerekli kodun tamamı yerel kumaşımız için sipariş vermek üzere oluşturulduğundan şimdi sıra kodu test etmeye geldi. Android cihazınızı seçin ve uygulamayı çalıştırın. Ana ekrandan Cihaz Ekle'ye dokunun ve cihazınızı komisyona alma adımlarını tamamlayın.
Devreye alma işlemi tamamlandığında cihazınız artık iki kumaşta yer almaktadır: Yerel Android kumaşı ve yerel geliştirme kumaşınız. Her bir kumaşın kendi kimlik bilgileri ve 64 bit benzersiz yapı kimliği vardır.
6. Cihazları kontrol etme
Geliştirme yapısına devreye alma işlemi, Matter deposundaki (connectedhomeip
) kitaplıkları kullanarak örnek uygulamadaki cihazları kontrol etmenize olanak tanır.
Cihaz kümelerine erişmeyi 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 cihazın Açık/Kapalı Kümesini almak için kullanabilir ve ardından .toggle
adlı cihazı çağırabiliriz:
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 değiştir
Bir cihazı devreye aldıktan sonra CommissioningResult bölümünde döndürülen yük DataStore'a eklenir. Bu şekilde uygulamamız, komut göndermek için kullanabileceğimiz cihaz bilgilerine erişebilir.
Matter uygulamaları etkinliğe dayalıdır. Matter yığını başlatıldığında Küme hizmetleri gelen mesajları dinler. Bir cihaz kullanıma alındıktan sonra Matter istemcileri, cihazı devreye alma sırasında oluşturulan güvenli operasyon kanalı üzerinden komutlar gönderir.
Cihazda paketler doğrulanır, şifreleri çözülür ve ardından bir geri çağırma özelliğiyle gönderilir. Geri çağırma işlevleri arasında, attributePath
üzerinden erişilebilen EndpointId, ClusterId ve AttributeId bulunur. Örneğin, bu 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, cihazları açmak/kapatmak için Matter SDK'sını ve ClustersHelper
uygulamasını kullanacaksınız.
java/screens/device
uygulamasındaDeviceViewModel
adresine gidin.updateDeviceStateOn
işlevini bulun.// CODELAB: toggle
yorumunu,clustersHelper
çağrısı yapan kodla değiştirin ve 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
öğesinden çağrılır:
// On/Off Switch click. val onOnOffClick: (value: Boolean) -> Unit = { value -> deviceViewModel.updateDeviceStateOn(deviceUiModel!!, value) }
Uygulamayı çalıştırın
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 çok yöneticili akışı olarak adlandırılır.
Önceki adımlarda Home Mobile SDK'sının, cihazları Yerel Android yapısına ve ayrıca örnek uygulamanın bir geliştirme yapısına yaptırmayı mümkün kıldığını öğrendik. Bu, cihazların birden fazla yapıya devredilebileceği çoklu yönetici akışına bir örnektir.
Şimdi ise cihazları daha fazla kumaşla paylaşmak isteyebilirsiniz. Özellikle burası, uygulama ve platformlar söz konusu olduğunda insanların kendi tercihlerinin olduğu bir evse.
Home Mobile SDK'sı, ShareDeviceRequest API'de bu işlevi sunarak şunları yapmanıza olanak tanır:
- Cihazlar için geçici bir devreye alma penceresi açın.
- Cihazlarınızın durumunu değiştirerek başka bir kumaş için kullanıma hazır olmalarını sağlayabilirsiniz.
- Cihazlarınızı başka uygulama 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ı devreye aldığımızda oluşturduğumuz Devreye Alma Etkinliği Başlatıcısı'na benzer şekilde, IntentSender
öğesini CommissioningClient API'den işlemek için bir Cihaz Etkinliği Başlatıcısı oluşturduk.
java/com/google/homesampleapp/screens/device/
klasöründeDeviceScreen
dosyası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ı Paylaş" ayarını tetikler. “Paylaş” öğesini tıklayarak düğmesini tıklayın. Ardından, cihaz paylaşımı için bir Eşleme Penceresi açmak üzere deviceViewModel
numarasına arama yapılır.
// Share Device button click. val onShareDevice: () -> Unit = remember { { deviceViewModel.openPairingWindow(deviceUiModel!!.device.deviceId) } }
Ayrıştırma penceresi başarıyla açıldıktan sonra, deviceViewModel
bu bilgiyi kullanıcı arayüzüne bildirir. ViewModel
ile kullanıcı arayüzü arasındaki iletişim StateFlow
nesneleri aracılığıyla gerçekleşir.
// 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ördükten sonra DeviceScreen aşağıdaki çağrıyı yapar:
shareDevice(activity!!.applicationContext, shareDeviceLauncher, deviceViewModel)
3. Adım: API'yi çağırın
Artık cihaz paylaşma görevini başlatma zamanı geldi.
java/com/google/homesampleapp/screens/device/
klasöründeDeviceScreen.kt
dosyasını açın.shareDevice()
işlevini bulun.// CODELAB: shareDevice
yorumunuShareDeviceRequest
ile değiştirin.DeviceDescriptor
; Tedarikçi Kimliği, Ürün Kimliği ve deviceType gibi cihazla ilgili belirli bilgiler sağlar. Bu örnekte, değerleri sabit olarak 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()
çağrısına yalnızca bu sefer için.shareDevice()
API'yi kullanın.Matter.getCommissioningClient(context) .shareDevice(shareDeviceRequest)
commissioningClient.shareDevice()
API'nin başarılı geri çağırması, IntentSender'ın Google Play Hizmetleri'nde Cihaz Etkinliğini Paylaş özelliğini başlatmak için kullanılmasını sağlar.
shareDevice
işlevimizi tamamlamak için biraddOnSuccessListener
veaddOnFailureListener
ekleyin. Başarılı olursa,shareDeviceLauncher
tarihindelaunch
çağrıldı ve cihaz paylaşımı için GPS etkinliğini başlatmak istiyor..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ırın
Matter cihazınızı diğer ekosistemlerle paylaşmak için Android cihazınızda başka bir platformun yüklü olması gerekir. Hedef komisyon temsilcisi olarak kullanabileceğiniz başka bir örnek uygulama örneği oluşturduk.
Hedef komisyoncuyu Android cihazınıza yükledikten sonra Matter cihazınızı paylaşabileceğinizi doğrulayın. Hedef komisyoncu uygulaması GHSAFM-TC olarak etiketlenmiş.
Cihazlarınız artık üç farklı kumaş kullanabilir:
- Yerel Android kumaşı.
- Geliştirme kumaşınız (bu uygulama).
- Cihazı 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ı nasıl yaptıracağınızı ve paylaşacağınızı öğrendiniz.
Örnek uygulamayla ilgili sorun yaşıyorsanız ortamınızı doğrulamak için aşağıdaki adımları tamamlamayı deneyin:
Örnek uygulamayı kullanmayla ilgili sorularınız varsa veya bir kod hatasıyla karşılaşırsanız, sorunları GitHub deposundaki Sorun İzleyici'ye gönderebilirsiniz:
Teknik sorularla ilgili olarak Google'dan resmi yardım almak için Smart Home Geliştirici Forumu'nu kullanın:
Topluluktan teknik destek almak için Stack Overflow'da google-smart-home
etiketini kullanın: