1. Hoş geldiniz
IoT standartlarını birleştirmek amacıyla geliştirilen Matter, Google Home, Zigbee, Bluetooth Mesh ve Z-Wave gibi çeşitli ekosistemlerdeki akıllı ev cihazlarını birbirine bağlar.
Mobil cihazlar, akıllı ev cihazlarıyla etkileşim kurmak için kullanılan merkezi bir noktadır. Matter cihazlarını desteklemek için kendi Android uygulamalarınızı oluşturmak istiyorsanız hızlı bir şekilde başlamanıza yardımcı olabiliriz.
Matter için Google Home Örnek Uygulaması (GHSA for Matter), Home Mobile SDK API'lerini sergileyerek kullanıcıların cihazları devreye almasına ve paylaşmasına olanak tanır. Ayrıca, örnek uygulamayı temel Matter kavramlarını daha iyi anlamak için bir öğrenme aracı olarak ve 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ı devreye almak ve paylaşmak için Home Mobile SDK'yı nasıl kullanacağınızı öğreneceksiniz. Ayrıca Matter deposundaki (connectedhomeip) devreye alma ve küme kitaplıklarını nasıl kullanacağınızı da öğreneceksiniz.
Örnek uygulamayı indirdikten sonra Android Studio'daki kaynak kodunu inceleyip aşağıdaki Home Mobile SDK API'lerini uygulayacağız:
Ayrıca, devreye alma kavramları, Matter kumaş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:
- Matter için Google Home Örnek Uygulama Kılavuzu'nu inceleyin.
- Android Studio'yu indirin.
- Test için Android O (8.1, API düzeyi 27) veya daha yeni bir cihazınızın olması gerekir. Cihazınızın en yeni Matter desteğine sahip olduğundan emin olmak için Matter Modüllerini ve Hizmetlerini Doğrulama kılavuzunu inceleyin.
- Açma/kapatma özelliklerine sahip 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. Herhangi bir sorunla karşılaşırsanız örnek uygulama MVD'ye karşı kullanılıyorsa sorunu incelemek çok daha kolay olacaktır. Diğer seçeneklerden bazıları:
rootnode_dimmablelight_bCwGYSDpoeuygulamasıyla Matter sanal cihazı oluşturun. Play Console'da Matter entegrasyonu oluştururken tedarikçi kimliğiniz olarak0xFFF1, ürün kimliğiniz olarak0x8000değerini kullanın.all-clusters-appile Espressif Cihazı Oluşturma Home Developer Console'da Matter entegrasyonu oluştururken tedarikçi kimliğiniz olarak0xFFF1, ürün kimliğiniz olarak0x8001değerini kullanın.
- Google Play Hizmetleri'ni ayarlama konusunu inceleyin.
Örnek uygulamayla cihazları devreye almak ve kontrol etmek için Google Nest Hub (2. nesil) gibi bir hub'a 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ü ile etiketlenmiştir. Her adımı uygularken 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 dosyasındaki talimatları uygulayın.
Bağımlılıklar
Cihazları paylaşmak ve devreye almak için gereken kaynak kod konusunda size yol göstereceğiz. Ancak başlamadan önce aşağıdaki bağımlılıkları bilmeniz faydalı 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 Mobile SDK'sı
- Matter SDK kitaplıkları.
- Jetpack Compose. Kullanıcı arayüzü tamamen Compose kullanılarak uygulanır.
- Materyal Tasarım. Daha fazla bilgi edinmek için MDC-103 Android: Material Theming with Color, Elevation and Type (Kotlin) (MDC-103 Android: Renk, Yükseklik ve Tür ile Material Temalandırma (Kotlin)) ve Material Theme Builder (Material Tema Oluşturucu) başlıklı makaleleri inceleyin.
- Uygulama verilerini kalıcı hale getirmek için kullanılan Proto DataStore. Datastore depoları ve serileştiriciler, cihazlar ve kullanıcı tercihleriyle ilgili şemalar da dahil olmak üzere
java/dataiç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 eklemeyi desteklemek için Hilt.
Kaynak kodu
Kullanıcı arayüzü ve işlevlerin çoğu sizin için zaten oluşturulmuştur.
Bu codelab'de aşağıdaki dosyalara Matter işlevselliği ekleyeceğiz:
java/com/google/homesampleapp/commissioning/AppCommissioningService: Cihazları geliştirme ortamına dahil etmenize olanak tanır.java/com/google/homesampleapp/screens/home/HomeScreenvejava/com/google/homesampleapp/screens/home/HomeViewModel.kt: Home Mobile SDK'nın devreye alma işlevini içerir.java/com/google/homesampleapp/screens/device/DeviceScreenvejava/com/google/homesampleapp/screens/device/DeviceViewModel: Cihaz Paylaşımı API çağrılarını içerir.
Her dosya, değiştireceğiniz kod bloğuyla ilgili yorumlar içerir. Örneğin:
// CODELAB: add commissioningFunction()
Bu sayede ilgili bölümü codelab'de hızlıca bulabilirsiniz.
3. Google'a komisyon
Cihazları kontrol edebilmeniz ve aynı Matter ağı içinde birbirleriyle iletişim kurmalarına izin verebilmeniz için bu cihazların bir Komisyon Üyesi tarafından devreye alınması gerekir. Bu örnekte Komisyon Üyesi, Google Home Sample App for Matter adlı örnek uygulamadır.
Matter'ın kullanıma hazırlanmasıyla ilgili aşağıdaki kavramları anlamanız önemlidir:
- Kumaşlar, cihazların birbiriyle iletişim kurmasını sağlar.
- Fabric'ler, benzersiz kimlik bilgilerinin paylaşıldığı bir grubu korur.
- Güvenilir kök sertifikaları verme, kumaş kimlikleri atama ve benzersiz düğüm kimlikleri atama sorumluluğu ekosistemlere aittir. Ekosistem, bir komisyoncunun arka uç hizmetidir. Örneğin, Google Home ekosistemi için Home Graph.
- Cihazlar birden fazla kumaş için devreye alınabilir (çoklu yönetici özelliği).
Bir cihazı devreye almak için CommissioningClient API'yi kullanmanız gerekir. .commissionDevice() çağrısı, 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 yapısına dahil etmek için gereken minimum kodu inceleyeceğiz.
1. adım: Activity Launcher
IntentSender öğesinden CommissioningClient öğ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: Kullanıma alma işlevi
Burada, bir cihazı Google Fabric'e hazırlamak için CommissioningClient API'yi kullanan temel bir örnek verilmiştir.
- Devreye alma süreci
commissionDevice()işleviyle başlar. İlk olarakCommissioningRequesttanımlanır. Bu varsayılan yapılandırmada, cihazlar yalnızca yerel Android ağına dahil edilir. Matter, Home Mobile SDK'sının giriş noktasıdır. Bir sonraki çağrıda,.getCommissioningClient,this(Etkinlik) tarafından bir CommissioningClient alır..commissionDevice(),CommissioningRequesthükümlerini kabul eder.- Son olarak,
CommissioningResultişlenir ve Google Play Hizmetleri (GPS) Commission Device Etkinliği başlatılır..addOnSuccessListener
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 Fabric'lere devreye alınma sürecini basitleştirmek için Android ayarları üzerinden kullanılabilir.
Ardından, bir cihazı geliştirme kumaşına nasıl devreye alacağınızı öğreneceksiniz.
Devreye alma işlemi sırasında kullanıcı arayüzüne genel bakış için Matter için Google Home Örnek Uygulaması Rehberi'ne bakın.
4. Geliştirme kumaşına gönderme
Cihazlar birden fazla kumaş için devreye alınabilir. Güvenilen eşlemeleri yönetmek için cihazlar, çeşitli FabricInfo üyelerini içeren bir FabricTable depolar. Örneğin:
- Kumaş tanımlama
- Kumaş tarafından cihaza atanan düğüm kimliği
- Tedarikçi kimliği
- Kumaş kimliği
- Cihazın operasyonel kimlik bilgileri
Yönetim alanı yöneticisi (ADM), kumaş kimlik bilgilerini tanımlar. Önceki senaryoda, Google Play Hizmetleri güvenilir bir kök sertifika yetkilisi (CA) olarak hareket eden ekosistemdir. Cihazları yerel Android yapısına sağladığınızda her cihaz aynı yapı kimlik bilgilerini ve aynı sertifika yetkililerini (CA) içerir.
Özel devreye alma hizmetleri
Yerel Android yapısına hazırlamak için CommissioningClient API'de CommissioningRequest oluşturmak üzere varsayılan parametreleri kullandık:
val request: CommissioningRequest = CommissioningRequest.builder().build()
Uygulamanızdan yeni cihazları kontrol edip yönetmek istiyorsanız yerel bir geliştirme yapısı oluşturmanız ve cihazları devreye almak için operasyonel kimlik bilgilerini edinmeniz gerekir. Bu senaryoda uygulamanız, cihazlara uygun düğüm kimlik bilgilerini atayan benzersiz ve bağımsız bir ekosistem haline gelir.
CommissioningRequest'e özel bir hizmet ileterek Home Mobile SDK'ya cihazları kendi kumaşınıza eklemek 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, 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 Activity Launcher oluşturun
Öncelikle, CommissioningClient API'den gelen IntentSender değerini işlemek için bir Activity Launcher oluşturalım.
HomeScreendosyasınıjava/com/google/homesampleapp/screens/home/klasöründe açın.- Devreye alma etkinliği sonucunu kaydetmek ve işlemek için
// CODELAB: commissionDeviceLauncher definitionyorumunu 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 "Cihazı devreye al" işlemini tetikler. Ardından commissionDevice() numaralı telefona arama yapılır.
val onCommissionDevice = {
...
commissionDevice(activity!!.applicationContext, commissionDeviceLauncher)
}
3. adım: API'yi çağırın
java/com/google/homesampleapp/screens/homeklasöründekiHomeScreen.ktiçinde kalır.// CODELAB: commissionDeviceyorumunu aşağıdakicommissionDeviceRequestile değiştirin.setCommissioningService,AppCommissioningServiceöğesini geri arama işlevinde döndürülen birCommissioningServiceörneğine bağlar. Özel bir hizmet ilettiğinizde Home Mobile SDK, önce cihazları Android yerel yapısına devreye alır, ardından ilk katılım yükünüAppCommissioningService'ya 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 CommissioningService alınması istendi. Bu akışta CommissioningClient API, cihazları önce Local Android fabric'e devreye alı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'i devralmamız ve cihazları örnek uygulamamıza hazırlamak için gereken işlevselliği sağlamamız gerekiyor. Temel bir CommissioningService uygulamasına örnek:
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 CommissioningService'imiz için temel sınıf yapısını önceden tanımladık. Hizmet işlevine dair kısa bir genel bakışı aşağıda bulabilirsiniz. Devam etmek için java/commissioning'de AppCommissioningService'ı 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 coroutines'i desteklemek için içe aktarmaları içerir.
Ardından, oluşturucuyu oluştururuz ve komisyon alma işlemi tamamlandığında Google Play Hizmetleri'ne bildirmek için kullanacağımız commissioningServiceDelegate dahil olmak üzere birkaç şeyi ayarlarız.
private lateinit var commissioningServiceDelegate: CommissioningService ... commissioningServiceDelegate = CommissioningService.Builder(this).setCallback(this).build()
Şimdi devreye alma işlevlerini ekleme zamanı.
2. adım: onCommissioningRequested işlevini geçersiz kılın
Cihazları uygulamanın geliştirme kumaşına devreye almak için aşağıdaki adımları tamamlayın:
AppCommissioningServicedosyasınıjava/commissioninguygulamasında açın.onCommissioningRequested()işlevini bulun.CommissioningRequestMetadatadeğerini yazdıran bir günlük mesajı sağladık.// CODELAB: onCommissioningRequested()eş yordamını başlatmak vedeviceIddeğerini almak için// CODELAB: onCommissioningRequested()yorumunu değiştirin.serviceScope// Perform commissioning on custom fabric for the sample app. serviceScope.launch { val deviceId = devicesRepository.incrementAndReturnLastDeviceId()- Devreye alma işlemini gerçekleştirin. Bu adım için CommissioningRequestMetadata nesnesinde döndürülen cihaz bilgilerini iletebiliriz.
ChipClient, Matter için GHSA uygulaması ile cihazınız arasında güvenli bir kanal oluşturmak için bu meta veri bilgilerini 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 } - Google Play Hizmetleri'ne hazırlık sürecinin tamamlandığını bildirmek için
commissioningServiceDelegateseçeneğini 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ırma
Yerel kumaşımıza sipariş vermek için gereken tüm kodlar yerleştirildiğine göre şimdi test etme zamanı. Android cihazınızı seçin ve uygulamayı çalıştırın. Ana ekranda Cihaz Ekle'ye dokunun ve cihazınızı devreye alma adımlarını tamamlayın.
Komisyon verme işlemi tamamlandığında cihazınız artık iki kumaşa katılır: Yerel Android kumaşı ve yerel geliştirme kumaşınız. Her kumaşın kendi kimlik bilgileri ve benzersiz bir 64 bit kumaş kimliği vardır.
6. Cihazları kontrol etme
Geliştirme kumaşına devreye alma, örnek uygulamadaki cihazları kontrol etmek için Matter deposundaki (connectedhomeip) kitaplıkları kullanmanıza 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 ClustersHelper adresini java/clusters'de açın. Bu Singleton yardımcı programı, 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ı kullanarak bir cihazın On/Off Cluster'ını alabilir, ardından .toggle'ı ç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ı açma veya kapatma
Bir cihazı devreye aldıktan sonra CommissioningResult içinde döndürülen yük, veri deposuna eklenir. Bu izin, 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ı başlatıldığında, küme hizmetleri gelen mesajları dinler. Bir cihaz devreye alındıktan sonra Matter istemcileri, cihaz devreye alma sırasında oluşturulan güvenli operasyonel kanal üzerinden komut gönderir.
Paketler cihazda doğrulanır, şifresi çözülür ve geri arama ile gönderilir. Geri çağırma işlevleri, attributePath'dan erişilebilen EndpointId, ClusterId ve AttributeId'yi içerir. Örneğin, bu kod bir Matter cihazında 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ı açıp kapatmak için Matter SDK'sını ve ClustersHelper kullanacaksınız.
java/screens/devicebölümündekiDeviceViewModelsayfasına gidin.updateDeviceStateOnişlevini bulun.// CODELAB: toggleyorumunuclustersHelper'i çağıran kodla değiştirin ve 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
Bir cihazı paylaşma, Matter spesifikasyonunda çoklu yönetici akışı olarak adlandırılır.
Önceki adımlarda, Home Mobile SDK'nın cihazları yerel Android yapısına ve örnek uygulama için bir geliştirme yapısına devreye almayı mümkün kıldığını öğrenmiştik. Bu, cihazların birden fazla yapıya devreye alınabildiği çoklu yönetici akışına bir örnektir.
Artık cihazları daha fazla kumaşla paylaşmak isteyebilirsiniz. Özellikle de uygulamalar ve platformlar konusunda kendi tercihleri olan kişilerin yaşadığı bir evdeyseniz.
Home Mobile SDK, bu işlevi ShareDeviceRequest API'de sağlar. Bu API sayesinde:
- Cihazlar için geçici bir devreye alma penceresi açın.
- Cihazlarınızın durumunu değiştirerek başka bir kumaşla devreye alınmalarını sağlayın.
- Cihazlarınızı diğer 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 Activity Launcher oluşturun
Bir geliştirme yapısı için devreye alma işlemi yaptığımızda oluşturduğumuz Commissioning Activity Launcher'a benzer şekilde, CommissioningClient API'den gelen IntentSender değerini işlemek için Share Device Activity Launcher oluşturduk.
DeviceScreendosyasınıjava/com/google/homesampleapp/screens/device/klasöründe açın.// CODELAB: shareDeviceLauncher definitionyorumunu,.shareDevice()etkinliği sonucunu kaydetmek ve işlemek için 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 eşleme penceresi açmak üzere deviceViewModel'ya çağrı yapılır.
// Share Device button click.
val onShareDevice: () -> Unit = remember {
{
deviceViewModel.openPairingWindow(deviceUiModel!!.device.deviceId)
}
}
Eşleme penceresi başarıyla açıldıktan sonra deviceViewModel, bu durumu kullanıcı arayüzüne bildirir. ViewModel ile kullanıcı arayüzü arasındaki iletişim StateFlow nesneleri aracılığıyla 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
DeviceScreen, StateFlow nesnesindeki değişikliği gördüğünde aşağıdaki çağrıyı yapar:
shareDevice(activity!!.applicationContext, shareDeviceLauncher, deviceViewModel)
3. adım: API'yi çağırın
Artık paylaşılan cihaz görevini başlatabilirsiniz.
DeviceScreen.ktdosyasınıjava/com/google/homesampleapp/screens/device/klasöründe açın.shareDevice()işlevini bulun.// CODELAB: shareDeviceyorumunuShareDeviceRequestile değiştirin.DeviceDescriptor, cihazla ilgili tedarikçi kimliği, ürün kimliği ve cihaz türü gibi belirli bilgileri sağlar. Bu örnekte değerleri sabit kodluyoruz.val shareDeviceRequest = ShareDeviceRequest.builder() .setDeviceDescriptor(DeviceDescriptor.builder().build()) .setDeviceName("GHSAFM temp device name")- CommissioningWindow ve parametrelerini 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()işlevini çağırın. Ancak bu kez.shareDevice()API'sini kullanın.Matter.getCommissioningClient(context) .shareDevice(shareDeviceRequest)
commissioningClient.shareDevice() API'nin başarı geri çağırması, Google Play Hizmetleri'nde Cihaz Etkinliğini Paylaş'ı başlatmak için kullanılacak IntentSender'ı sağlar.
shareDeviceişlevimizi tamamlamak içinaddOnSuccessListenerveaddOnFailureListenerekleyin. Başarılı olursa cihaz paylaşımı için GPS etkinliğini başlatmak üzereshareDeviceLauncherüzerindelaunchç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 platformun yüklü olması gerekir. Hedef komisyoncu olarak kullanabileceğiniz örnek uygulamanın başka bir örneğini 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 etiketlenir.
Cihazlarınız artık üç kumaşa katılabilir:
- Local Android kumaşı.
- Geliştirme kumaşınız (bu uygulama).
- Cihazı paylaştığınız üçüncü taraf.
8. Sonraki Adımlar
Tebrikler
Tebrikler! Bu Codelab'i başarıyla tamamladınız ve Home Mobile SDK'yı kullanarak cihazları nasıl devreye alacağınızı ve paylaşacağınızı öğrendiniz.
Örnek uygulamayla ilgili sorun yaşıyorsanız ortamınızı doğrulama adımlarını tamamlamayı deneyin:
Örnek uygulamayı kullanmayla ilgili sorularınız varsa veya bir kod hatası keşfederseniz GitHub deposundaki Sorun İzleyici'ye sorun gönderebilirsiniz:
Teknik sorularla ilgili Google'dan resmi rehberlik 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: