Создайте Android-приложение для Matter

1. Добро пожаловать

Созданная с целью унификации стандартов Интернета вещей, платформа Matter объединяет устройства умного дома в различных экосистемах, таких как Google Home, Zigbee, Bluetooth Mesh, Z-Wave и других.

Мобильные устройства являются центральной точкой взаимодействия с устройствами умного дома. Если вы хотите разработать собственные приложения для Android, поддерживающие устройства Matter, мы поможем вам быстро начать работу.

Демонстрационное приложение Google Home для Matter (GHSA for Matter) показывает API Home Mobile SDK , позволяя пользователям настраивать и совместно использовать устройства. Вы также можете использовать демонстрационное приложение в качестве учебного инструмента для лучшего понимания ключевых концепций Matter, а также в качестве инструмента для отладки и устранения неполадок при взаимодействии с устройствами Matter.

Что вы будете делать

В этом практическом занятии вы скачаете исходный код примера приложения и узнаете, как использовать Home Mobile SDK для ввода устройств в эксплуатацию и их совместного использования. Вы также узнаете, как использовать библиотеки ввода в эксплуатацию и кластеризации из репозитория Matter ( connectedhomeip ) .

После загрузки демонстрационного приложения мы рассмотрим исходный код в Android Studio и реализуем следующие API Home Mobile SDK :

Вы также узнаете больше о концепциях ввода в эксплуатацию, о технологиях Matter Fabrics и о том, как управлять устройствами Matter.

Что вам понадобится

Прежде чем начать, обязательно выполните следующие шаги:

Для ввода устройств в эксплуатацию и управления с помощью демонстрационного приложения вам не понадобится концентратор, например, Google Nest Hub (2-го поколения).

2. Настройка

Стартовое приложение codelab находится в ветке codelab . Чтобы начать работу с исходным кодом codelab, вы можете скачать ZIP-файл.

Для создания рабочего примера вы будете использовать этот ZIP-файл с codelab .

версии Codelab

Ветка codelab помечена тегом релиза 2.0.0 демонстрационного приложения. Чтобы сравнивать свои обновления по мере выполнения каждого шага, вы можете загрузить полный исходный код этого релиза.

Если вы хотите клонировать репозиторий GitHub, следуйте инструкциям в файле README примера приложения .

Зависимости

Мы расскажем вам об исходном коде, необходимом для совместного использования и ввода в эксплуатацию устройств, но перед началом работы вам может быть полезно ознакомиться со следующими зависимостями. Обратите внимание, что эти зависимости объявлены в файле libs.versions.toml , а их использование указано в файле build.gradle.kts.

Исходный код

Пользовательский интерфейс и большая часть функциональности уже созданы для вас.

В рамках этого практического занятия мы добавим функциональность Matter в следующие файлы:

  • java/com/google/homesampleapp/commissioning/AppCommissioningService : позволяет подключать устройства к среде разработки.
  • java/com/google/homesampleapp/screens/home/HomeScreen и java/com/google/homesampleapp/screens/home/HomeViewModel.kt : включают функциональность ввода в эксплуатацию Home Mobile SDK.
  • java/com/google/homesampleapp/screens/device/DeviceScreen и java/com/google/homesampleapp/screens/device/DeviceViewModel : включают вызовы API для обмена данными об устройстве.

Каждый файл снабжен комментарием, в котором указан блок кода, который вы будете изменять, например:

// CODELAB: add commissioningFunction()

Это позволяет быстро найти соответствующий раздел в практическом задании.

3. Комиссия Google

Прежде чем вы сможете управлять устройствами и обеспечивать их взаимодействие в рамках одной сети, их необходимо ввести в эксплуатацию уполномоченным лицом, которым в данном случае является это демонстрационное приложение — Google Home Sample App для Matter.

Важно понимать следующие концепции ввода оборудования в эксплуатацию компании Matter:

  • Ткани позволяют устройствам взаимодействовать друг с другом.
  • Ткани обладают общим набором уникальных характеристик.
  • Экосистемы отвечают за выдачу доверенных корневых сертификатов, присвоение идентификаторов сети и уникальных идентификаторов узлов. Экосистема — это серверная часть сервиса заказчика, например, Home Graph для экосистемы Google Home.
  • Устройства можно подключить к нескольким сетям (функция многопользовательского администрирования).

Для ввода устройства в эксплуатацию вам потребуется использовать API CommissioningClient . Вызов метода .commissionDevice() возвращает объект IntentSender , который запускает соответствующее действие в Google Play Services:

interface CommissioningClient {
  Task<IntentSender> commissionDevice(CommissioningRequest request);
}

В следующих разделах мы рассмотрим минимальный код, необходимый для подключения устройств к сети Google.

Шаг 1: Запуск Activity

Для обработки IntentSender из CommissioningClient можно использовать ActivityResultLauncher:

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: Ввод в эксплуатацию.

Вот простой пример использования API CommissioningClient для подключения устройства к сети Google.

  1. Процесс ввода в эксплуатацию начинается с функции commissionDevice() . Сначала определяется объект CommissioningRequest . При такой конфигурации по умолчанию устройства вводятся в эксплуатацию только в локальной среде Android.
  2. Matter является точкой входа для Home Mobile SDK. При следующем вызове метод .getCommissioningClient получает объект CommissioningClient через this (Activity).
  3. .commissionDevice() принимает запрос CommissioningRequest ).
  4. И наконец, вызывается метод .addOnSuccessListener для обработки CommissioningResult и запуска действия Commission Device Activity в сервисах Google Play (GPS).
private fun commissionDevice() {
    val request: CommissioningRequest = CommissioningRequest.builder().build()
    Matter.getCommissioningClient(this)
        .commissionDevice(request)
        .addOnSuccessListener { result ->
            commissioningLauncher.launch(IntentSenderRequest.Builder(result).build())
        }
}

Использование локальной инфраструктуры Android через настройки Android упрощает процесс подключения устройств к другим сетям.

Далее вы узнаете, как ввести устройство в эксплуатацию в среде разработки.

Для ознакомления с пользовательским интерфейсом в процессе ввода в эксплуатацию обратитесь к руководству по использованию демонстрационного приложения Google Home для Matter .

4. Заказ на строительство объекта.

Устройства могут быть подключены к нескольким сетям. Для управления надежными парами устройства хранят FabricTable , содержащую различные элементы FabricInfo , например:

  • Идентификация ткани
  • Идентификатор узла, присвоенный устройству коммутационной сетью.
  • Идентификатор поставщика
  • Идентификатор ткани
  • учетные данные для работы устройства

Административный менеджер домена (ADM) определяет учетные данные инфраструктуры. В предыдущем сценарии Google Play Services выступал в качестве доверенного корневого центра сертификации (CA) в рамках экосистемы. При подключении устройств к локальной инфраструктуре Android каждое устройство включает один и тот же набор учетных данных инфраструктуры и один и тот же набор центров сертификации.

Услуги по индивидуальному вводу в эксплуатацию

Для ввода в эксплуатацию локальной Android-инфраструктуры мы использовали параметры по умолчанию для формирования CommissioningRequest в API CommissioningClient:

val request: CommissioningRequest = CommissioningRequest.builder().build()

Если вы хотите управлять новыми устройствами из своего приложения, вам необходимо создать локальную среду разработки и получить учетные данные для ввода устройств в эксплуатацию. В этом случае ваше приложение становится уникальной, независимой экосистемой, которая назначает устройствам соответствующие учетные данные узла.

Вы можете сообщить Home Mobile SDK о желании подключить устройства к вашей собственной сети, передав пользовательский сервис в CommissioningRequest :

class CommissioningRequest {
  static CommissioningRequest.Builder builder();

  class Builder {
    Builder setCommissioningService(@Nullable ComponentName commissioningService);

    CommissioningRequest build();
  }
}

На следующих шагах мы изменим функцию commissionDevice() , чтобы она использовала пользовательский сервис. Мы также добавим Activity Launcher в фрагмент Home и будем использовать объекты LiveData для управления потоком API.

Шаг 1: Создайте средство запуска GPS-активности

Для начала создадим Activity Launcher для обработки IntentSender из API CommissioningClient.

  1. Откройте HomeScreen в папке java/com/google/homesampleapp/screens/home/ .
  2. Замените комментарий // CODELAB: commissionDeviceLauncher definition следующим кодом для регистрации и обработки результата действия ввода в эксплуатацию:
    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: Запустите действие устройства для ввода в эксплуатацию.

На этом этапе пользователь запускает действие «Заказать устройство», нажав кнопку «+» в правом нижнем углу главного экрана. Затем выполняется вызов функции commissionDevice() .

val onCommissionDevice = {
  ...
  commissionDevice(activity!!.applicationContext, commissionDeviceLauncher)
}

Шаг 3: Вызов API

  1. Файл HomeScreen.kt по-прежнему находится в папке java/com/google/homesampleapp/screens/home .
  2. Замените комментарий // CODELAB: commissionDevice следующим кодом commissionDeviceRequest . setCommissioningService связывает AppCommissioningService с экземпляром CommissioningService , возвращаемым в функции обратного вызова. При передаче пользовательской службы Home Mobile SDK сначала подключит устройства к локальной среде Android, а затем отправит данные для подключения обратно в AppCommissioningService .
    val commissionDeviceRequest =
        CommissioningRequest.builder()
            .setCommissioningService(ComponentName(
                context, AppCommissioningService::class.java))
            .build()
    
  3. Вызовите метод ` .getCommissioningClient() , затем вызовите метод .commissionDevice() .
Matter.getCommissioningClient(context)
    .commissionDevice(commissionDeviceRequest)

Для завершения работы над функцией commissionDevice добавьте обработчики событий addOnSuccessListener и addOnFailureListener :

    .addOnSuccessListener { result ->
      commissionDeviceLauncher.launch(IntentSenderRequest.Builder(result).build())
    }
    .addOnFailureListener { error ->
      Timber.e(error)
    }

5. Создайте услугу ввода в эксплуатацию.

В функции commissionDevice() мы запросили у API CommissioningClient объект CommissioningService . В этом процессе API CommissioningClient сначала подключает устройства к локальной среде Android, а затем возвращает обратный вызов, содержащий объект CommissioningRequestMetadata :

public interface CommissioningService {
interface Callback {
    void onCommissioningRequested(CommissioningRequestMetadata metadata);
  }
}

Теперь нам нужно унаследовать класс CommissioningService.Callback и предоставить нашему тестовому приложению функциональность, необходимую для ввода устройств в эксплуатацию. Вот пример базовой реализации CommissioningService:

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: Изучите пользовательский класс AppCommissioningService.

Чтобы вам было проще начать, мы уже определили базовую структуру классов для нашего пользовательского сервиса CommissioningService. Вот краткий обзор функциональности сервиса. Чтобы следовать инструкциям, откройте AppCommissioningService в java/commissioning .

Мы добавили следующие импорты для API Home Mobile SDK:

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 ( connectedhomeip ) :

import com.google.homesampleapp.chip.ChipClient

Наконец, сервис включает в себя импорт для поддержки сопрограмм Hilt и Kotlin.

Далее мы создаём конструктор и настраиваем несколько параметров, включая commissioningServiceDelegate , который мы будем использовать, чтобы сообщить Google Play Services о завершении процесса ввода в эксплуатацию.

private lateinit var commissioningServiceDelegate: CommissioningService
...
commissioningServiceDelegate = CommissioningService.Builder(this).setCallback(this).build()

Теперь пришло время добавить функции ввода в эксплуатацию.

Шаг 2: Переопределить значение onCommissioningRequested

Для подключения устройств к среде разработки приложения выполните следующие шаги:

  1. Откройте AppCommissioningService в папке java/commissioning .
  2. Найдите функцию onCommissioningRequested() . Мы предоставили сообщение в лог, которое выводит метаданные CommissioningRequestMetadata . Замените комментарий // CODELAB: onCommissioningRequested() , чтобы запустить сопрограмму serviceScope и получить deviceId .
    // Perform commissioning on custom fabric for the sample app.
    serviceScope.launch {
      val deviceId = devicesRepository.incrementAndReturnLastDeviceId()
    
  3. Выполните ввод в эксплуатацию. На этом этапе мы можем передать информацию об устройстве, возвращаемую в объекте CommissioningRequestMetadata . ChipClient использует эту метаинформацию для создания защищенного канала между приложением GHSA for Matter и вашим устройством.
    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. Используйте commissioningServiceDelegate , чтобы сообщить Google Play Services о завершении процесса ввода в эксплуатацию. В .sendCommissioningComplete() передайте объект CommissioningCompleteMetadata .
    commissioningServiceDelegate
        .sendCommissioningComplete(
            CommissioningCompleteMetadata.builder().setToken(deviceId.toString()).build())
        .addOnSuccessListener {
          Timber.d("Commissioning: commissioningServiceDelegate.sendCommissioningComplete() succeeded")
        }
        .addOnFailureListener { e ->
          Timber.e(e, "Commissioning: commissioningServiceDelegate.sendCommissioningComplete() failed")
        }
    }
    

Запустите приложение

Теперь, когда весь необходимый код готов для ввода устройства в эксплуатацию в нашей локальной сети, пришло время его протестировать. Выберите свое устройство Android и запустите приложение. На главном экране нажмите «Добавить устройство» и выполните шаги для ввода устройства в эксплуатацию.

После завершения процесса ввода в эксплуатацию ваше устройство будет участвовать в работе двух сетей: локальной сети Android и вашей локальной сети разработки. Каждая сеть имеет свой собственный набор учетных данных и уникальный 64-битный идентификатор сети.

6. Устройства управления

Подключение к среде разработки позволяет использовать библиотеки из репозитория Matter ( connectedhomeip ) для управления устройствами из демонстрационного приложения.

Мы создали несколько вспомогательных классов, чтобы упростить доступ к кластерам устройств и отправку команд. Чтобы узнать больше, откройте ClustersHelper в java/clusters . Этот вспомогательный класс-синглтон импортирует следующие библиотеки для доступа к информации об устройствах:

import chip.devicecontroller.ChipClusters
import chip.devicecontroller.ChipStructs

Мы можем использовать этот класс, чтобы получить кластер включения/выключения для устройства, а затем вызвать метод ` .toggle :

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)
              }
            })
  }
}

Переключить устройство

После ввода устройства в эксплуатацию полезная нагрузка, возвращаемая в объекте CommissioningResult , добавляется в DataStore. Это предоставляет нашему приложению доступ к информации об устройстве, которую мы можем использовать для отправки команд.

Приложения Matter работают на основе событий. При инициализации стека Matter службы кластера прослушивают входящие сообщения. После ввода устройства в эксплуатацию клиенты Matter отправляют команды по защищенному операционному каналу, установленному во время ввода устройства в эксплуатацию.

На устройстве пакеты проверяются, расшифровываются, а затем отправляются с помощью функции обратного вызова. Функции обратного вызова включают в себя EndpointId, ClusterId и AttributeId, доступные через attributePath . Например, этот код можно реализовать на устройстве Matter:

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;
}

На следующих шагах вы будете использовать SDK Matter и ClustersHelper для переключения между устройствами.

  1. Перейдите в DeviceViewModel в java/screens/device .
  2. Найдите функцию updateDeviceStateOn .
  3. Замените комментарий // CODELAB: toggle кодом для вызова clustersHelper , затем обновите репозиторий устройств:
    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")
        }
    

Эта функция вызывается из DeviceScreen :

// On/Off Switch click.
val onOnOffClick: (value: Boolean) -> Unit = { value ->
  deviceViewModel.updateDeviceStateOn(deviceUiModel!!, value)
}

Запустите приложение

Запустите приложение, чтобы обновить его. На главном экране включите и выключите устройство.

7. Делитесь устройствами с другими экосистемами.

В спецификации Matter совместное использование устройства называется многопользовательским административным потоком .

На предыдущих этапах мы узнали, что Home Mobile SDK позволяет подключать устройства к локальной среде Android, а также к среде разработки для демонстрационного приложения. Это пример многопользовательского процесса администрирования, когда устройства могут быть подключены к нескольким средам.

Теперь вам может понадобиться поделиться устройствами с ещё большим количеством пользователей, особенно если в вашей семье у каждого свои предпочтения в отношении приложений и платформ.

Home Mobile SDK предоставляет эту функциональность в API ShareDeviceRequest , позволяя вам:

  1. Откройте временное окно ввода устройств в эксплуатацию.
  2. Измените состояние ваших устройств, что позволит подключить их к другой сети.
  3. Управляйте своими устройствами из других приложений и экосистем.

На следующих этапах вы будете использовать Home Mobile SDK для обмена данными между устройствами.

Шаг 1: Создайте средство запуска GPS-активности

Аналогично средству запуска действий при вводе в эксплуатацию, которое мы создали при подключении к среде разработки, мы разработали средство запуска действий для совместного использования устройства, чтобы обрабатывать IntentSender из API CommissioningClient.

  1. Откройте DeviceScreen в папке java/com/google/homesampleapp/screens/device/ .
  2. Замените комментарий // CODELAB: shareDeviceLauncher definition следующим кодом для регистрации и обработки результата вызова Activity .shareDevice() :
    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: Запустите действие «Предоставить доступ к устройству».

На этом этапе пользователь запускает действие «Поделиться устройством», нажав кнопку «Поделиться» на экране устройства. Затем выполняется вызов deviceViewModel для открытия окна сопряжения для совместного использования устройства.

// Share Device button click.
val onShareDevice: () -> Unit = remember {
 {
   deviceViewModel.openPairingWindow(deviceUiModel!!.device.deviceId)
 }
}

После успешного открытия окна сопряжения deviceViewModel передает этот факт пользовательскому интерфейсу. Взаимодействие между ViewModel и пользовательским интерфейсом осуществляется через объекты StateFlow .

// Communicate to the UI that the pairing window is open.
// UI can then launch the GPS activity for device sharing.
_pairingWindowOpenForDeviceSharing.value = true

Увидев изменения в объекте StateFlow, DeviceScreen выполняет следующий вызов:

shareDevice(activity!!.applicationContext, shareDeviceLauncher, deviceViewModel)

Шаг 3: Вызов API

Теперь пришло время запустить задачу совместного использования устройства.

  1. Откройте DeviceScreen.kt в папке java/com/google/homesampleapp/screens/device/ .
  2. Найдите функцию shareDevice() . Замените комментарий // CODELAB: shareDevice на ShareDeviceRequest . DeviceDescriptor предоставляет конкретную информацию об устройстве, такую ​​как идентификатор поставщика (Vendor Id), идентификатор продукта (Product Id) и тип устройства (deviceType). В этом примере мы задаем значения жестко.
    val shareDeviceRequest =
      ShareDeviceRequest.builder()
        .setDeviceDescriptor(DeviceDescriptor.builder().build())
        .setDeviceName("GHSAFM temp device name")
    
  3. Установите окно ввода в эксплуатацию и параметры .
        .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() , но на этот раз используйте API-функцию ` .shareDevice() .
    Matter.getCommissioningClient(context)
        .shareDevice(shareDeviceRequest)
    

Функция обратного вызова при успешном выполнении API commissioningClient.shareDevice() предоставляет IntentSender, который используется для запуска активности Share Device в Google Play Services.

  1. Для завершения работы над функцией shareDevice добавьте обработчики событий addOnSuccessListener и addOnFailureListener . В случае успеха вызывается launch в shareDeviceLauncher для запуска активности GPS для совместного использования устройства.
        .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())
        }
    

Запустите приложение

Чтобы поделиться своим устройством Matter с другими экосистемами, вам потребуется установить на своё устройство Android другую платформу. Мы создали ещё один экземпляр демонстрационного приложения, который вы можете использовать в качестве целевого заказчика.

После установки приложения Target Commissioner на ваше устройство Android убедитесь, что вы можете предоставить доступ к своему устройству Matter. Приложение Target Commissioner называется GHSAFM-TC .

Теперь ваши устройства могут участвовать в работе трех сетей:

  1. Локальная среда Android.
  2. Ваша среда разработки (это приложение).
  3. Это третья ткань, с которой вы только что поделились устройством.

8. Дальнейшие шаги

Поздравляем!

Поздравляем, вы успешно завершили этот практический урок и научились вводить в эксплуатацию и предоставлять доступ к устройствам с помощью Home Mobile SDK.

Если у вас возникли проблемы с демонстрационным приложением, попробуйте выполнить следующие шаги для проверки вашей среды:

Если у вас возникли вопросы по использованию демонстрационного приложения или вы обнаружили ошибку в коде, вы можете отправить сообщение об ошибке в систему отслеживания ошибок в репозитории GitHub:

Для получения официальных рекомендаций от Google по техническим вопросам используйте форум разработчиков Smart Home:

Чтобы получить техническую поддержку от сообщества, используйте тег google-smart-home на Stack Overflow: