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

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

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

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

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

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

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

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

Вы также узнаете больше о концепциях ввода в эксплуатацию, фабриках Matter и о том, как управлять устройствами 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/commissioning/AppCommissioningService : позволяет вводить устройства в эксплуатацию в среде разработки.
  • java/screens/home/HomeScreen и java/screens/home/HomeViewModel.kt : включает функцию ввода в эксплуатацию Home Mobile SDK.
  • java/screens/device/DeviceScreen и java/screens/device/DeviceViewModel : включают вызовы API общего доступа к устройству.

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

// CODELAB: add commissioningFunction()

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

3. Комиссия Google

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

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

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

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

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

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

Шаг 1. Средство запуска действий

Для обработки 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 и запуска действия комиссии устройства Google Play Services (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 for Matter .

4. Ввод в состав разработки

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

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

Административный менеджер домена (ADM) определяет учетные данные структуры. В предыдущем сценарии Сервисы Google Play — это экосистема, которая действует как доверенный корневой центр сертификации (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() для использования специального сервиса. Мы также добавим средство запуска действий во фрагмент Home и будем использовать объекты LiveData для управления потоком API.

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

Сначала давайте создадим средство запуска действий для обработки IntentSender из API CommissioningClient.

  1. Откройте HomeScreen в папке java/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/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() мы запросили получение CommissioningService из API CommissioningClient. В этом процессе 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.home_sample_app_for_matter.chip.ChipClient

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

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

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, что ввод в эксплуатацию завершен. В .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 . Этот помощник Singleton импортирует следующие библиотеки для доступа к информации об устройстве:

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

На следующих шагах вы будете использовать Matter SDK и 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/screens/device/ .
  2. Замените // CODELAB: shareDeviceLauncher definition следующим кодом для регистрации и обработки результата действия .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 = {
 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/screens/device/ .
  2. Найдите функцию shareDevice() . Замените комментарий // CODELAB: shareDevice на ShareDeviceRequest . DeviceDescriptor предоставляет конкретную информацию об устройстве, такую ​​как его идентификатор поставщика, идентификатор продукта и тип устройства. В этом примере мы жестко запрограммировали значения.
    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, который будет использоваться для запуска действия общего доступа к устройству в службах Google Play.

  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. Мы создали еще один экземпляр примера приложения, который вы можете использовать в качестве целевого комиссара.

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

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

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

8. Следующие шаги

Поздравления

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

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

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

Чтобы получить официальные рекомендации от Google по техническим вопросам, воспользуйтесь форумом разработчиков умного дома:

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