Konular için Android Uygulaması Derleme

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:

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

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

  1. Devreye alma işlemi commissionDevice() işleviyle başlar. Öncelikle CommissioningRequest 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.
  2. Matter, Home Mobile SDK'sının giriş noktasıdır. Bir sonraki görüşmede .getCommissioningClient, this tarafından (Etkinlik) CommissioningClient alır.
  3. .commissionDevice(), CommissioningRequest hükümlerini kabul eder.
  4. Son olarak .addOnSuccessListener adlı cihazın CommissioningResult 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.

  1. java/screens/home/ klasöründe HomeScreen uygulamasını 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 "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

  1. Hâlâ HomeScreen.kt konumunda, java/screens/home/ klasöründe.
  2. // CODELAB: commissionDevice yorumunu aşağıdaki commissionDeviceRequest ile değiştirin. setCommissioningService, AppCommissioningService öğesini bir geri çağırma işlevinde döndürülen CommissioningService ö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()
    
  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 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:

  1. AppCommissioningService uygulamasını java/commissioning uygulamasında aç.
  2. onCommissioningRequested() işlevini bulun. CommissioningRequestMetadata dokümanını yazdıran bir günlük mesajı sağladık. serviceScope eşlemesini başlatmak ve deviceId ö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()
    
  3. 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
    }
    
  4. 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.

  1. java/screens/device bölgesinde DeviceViewModel adresine gidin.
  2. updateDeviceStateOn işlevini bulun.
  3. // CODELAB: toggle yorumunu clustersHelper ç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:

  1. Cihazlar için geçici bir devreye alma dönemi açın.
  2. Cihazlarınızın durumunu değiştirerek başka bir kumaş için yaptırılmalarını sağlayın.
  3. 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.

  1. java/screens/device/ klasöründe DeviceScreen uygulamasını açın.
  2. .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ı.

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

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

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