Konular için Android Uygulaması Derleme

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:

Ö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.

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/HomeScreen ve java/com/google/homesampleapp/screens/home/HomeViewModel.kt: Home Mobile SDK'nın devreye alma işlevini içerir.
  • java/com/google/homesampleapp/screens/device/DeviceScreen ve java/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.

  1. Devreye alma süreci commissionDevice() işleviyle başlar. İlk olarak CommissioningRequest tanımlanır. Bu varsayılan yapılandırmada, cihazlar yalnızca yerel Android ağına dahil edilir.
  2. 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.
  3. .commissionDevice(), CommissioningRequest hükümlerini kabul eder.
  4. Son olarak, CommissioningResult iş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.

  1. HomeScreen dosyasını java/com/google/homesampleapp/screens/home/ klasöründe açın.
  2. 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 "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

  1. java/com/google/homesampleapp/screens/home klasöründeki HomeScreen.kt içinde kalır.
  2. // CODELAB: commissionDevice yorumunu aşağıdaki commissionDeviceRequest ile değiştirin. setCommissioningService, AppCommissioningService öğesini geri arama işlevinde döndürülen bir CommissioningService ö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()
    
  3. .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:

  1. AppCommissioningService dosyasını java/commissioning uygulamasında açın.
  2. onCommissioningRequested() işlevini bulun. CommissioningRequestMetadata değerini yazdıran bir günlük mesajı sağladık. // CODELAB: onCommissioningRequested() eş yordamını başlatmak ve deviceId değ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()
    
  3. 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
    }
    
  4. Google Play Hizmetleri'ne hazırlık sürecinin tamamlandığını bildirmek için commissioningServiceDelegate seç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.

  1. java/screens/device bölümündeki DeviceViewModel sayfasına gidin.
  2. updateDeviceStateOn işlevini bulun.
  3. // CODELAB: toggle yorumunu clustersHelper'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:

  1. Cihazlar için geçici bir devreye alma penceresi açın.
  2. Cihazlarınızın durumunu değiştirerek başka bir kumaşla devreye alınmalarını sağlayın.
  3. 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.

  1. DeviceScreen dosyasını java/com/google/homesampleapp/screens/device/ klasöründe açın.
  2. // CODELAB: shareDeviceLauncher definition yorumunu, .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.

  1. DeviceScreen.kt dosyasını java/com/google/homesampleapp/screens/device/ klasöründe açın.
  2. shareDevice() işlevini bulun. // CODELAB: shareDevice yorumunu ShareDeviceRequest ile 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")
    
  3. 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()
    
  4. .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.

  1. shareDevice işlevimizi tamamlamak için addOnSuccessListener ve addOnFailureListener ekleyin. Başarılı olursa cihaz paylaşımı için GPS etkinliğini başlatmak üzere shareDeviceLauncher üzerinde launch ç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:

  1. Local Android kumaşı.
  2. Geliştirme kumaşınız (bu uygulama).
  3. 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: