1. Witamy
Standard Matter został stworzony z myślą o ujednoliceniu standardów IoT. Umożliwia on łączenie inteligentnych urządzeń domowych w różnych ekosystemach, takich jak Google Home, Zigbee, Bluetooth Mesh, Z-Wave i inne.
Urządzenia mobilne są głównym punktem interakcji z inteligentnymi urządzeniami domowymi. Jeśli chcesz tworzyć własne aplikacje na Androida obsługujące urządzenia Matter, pomożemy Ci szybko zacząć.
Przykładowa aplikacja Google Home dla Matter (GHSA dla Matter) prezentuje interfejsy API pakietu Home Mobile SDK, które umożliwiają użytkownikom wdrażanie urządzeń i udostępnianie ich. Możesz też używać przykładowej aplikacji jako narzędzia do nauki, aby lepiej zrozumieć kluczowe koncepcje Matter, a także jako narzędzia do debugowania i rozwiązywania problemów z interakcjami z urządzeniami Matter.
Jakie zadania wykonasz
W tym module dowiesz się, jak pobrać kod źródłowy przykładowej aplikacji i używać pakietu Home Mobile SDK do wdrażania i udostępniania urządzeń. Dowiesz się też, jak korzystać z bibliotek uruchamiania i klastrów z repozytorium Matter (connectedhomeip).
Po pobraniu przykładowej aplikacji sprawdzimy kod źródłowy w Android Studio i wdrożymy te interfejsy API pakietu Home Mobile SDK:
Dowiesz się też więcej o koncepcjach związanych z uruchamianiem, platformach Matter i sterowaniu urządzeniami Matter.
Czego potrzebujesz
Zanim zaczniesz, wykonaj te czynności:
- Zapoznaj się z przewodnikiem po przykładowej aplikacji Google Home dla Matter.
- Pobierz Android Studio.
- mieć urządzenie z Androidem O (8.1, poziom interfejsu API 27) lub nowszym, które można wykorzystać do testowania; Aby upewnić się, że urządzenie obsługuje najnowszą wersję Matter, zapoznaj się z przewodnikiem Weryfikowanie modułów i usług Matter.
- Używaj urządzenia Matter z funkcją włączania i wyłączania. Aby zminimalizować problemy ze środowiskiem, na początek zalecamy użycie wirtualnego urządzenia Matter (MVD). Jeśli napotkasz problemy, łatwiej będzie je zbadać, jeśli aplikacja przykładowa będzie używana w stosunku do MVD. Oto kilka innych opcji:
- Utwórz wirtualne urządzenie Matter za pomocą aplikacji
rootnode_dimmablelight_bCwGYSDpoe. Gdy utworzysz integrację Matter w konsoli Home Developer Console, użyj0xFFF1jako identyfikatora dostawcy i0x8000jako identyfikatora produktu. - Zbuduj urządzenie Espressif za pomocą
all-clusters-app. Gdy utworzysz integrację Matter w Konsoli dewelopera Home, użyj0xFFF1jako identyfikatora dostawcy i0x8001jako identyfikatora produktu.
- Utwórz wirtualne urządzenie Matter za pomocą aplikacji
- Dowiedz się, jak skonfigurować Usługi Google Play.
Aby skonfigurować urządzenia i sterować nimi za pomocą przykładowej aplikacji, nie potrzebujesz centrali, np. Google Nest Hub (2 generacji).
2. Konfiguracja
Aplikacja startowa do tego laboratorium kodu znajduje się w gałęzi codelab. Aby rozpocząć pracę z kodem źródłowym ćwiczenia, możesz pobrać plik ZIP.
Użyjesz tego codelabpliku ZIP do utworzenia działającego przykładu.
Wersje ćwiczeń
Gałąź codelab jest oznaczona wersją 2.0.0 przykładowej aplikacji. Aby porównać swoje zmiany w trakcie wykonywania poszczególnych kroków, możesz pobrać gotowy kod źródłowy tej wersji.
Jeśli chcesz skopiować repozytorium GitHub, postępuj zgodnie z instrukcjami w pliku README przykładowej aplikacji.
Zależności
Przeprowadzimy Cię przez kod źródłowy wymagany do udostępniania urządzeń i ich uruchamiania, ale przed rozpoczęciem pracy warto zapoznać się z tymi zależnościami: Pamiętaj, że te zależności są zadeklarowane w pliku libs.versions.toml, a ich użycie jest określone w pliku build.gradle.kts.
- Pakiet SDK Home Mobile
- Biblioteki pakietu SDK Matter
- Jetpack Compose Interfejs jest w pełni zaimplementowany za pomocą Compose.
- Material Design. Więcej informacji znajdziesz w artykułach MDC-103 Android: Material Theming with Color, Elevation and Type (Kotlin) i Material Theme Builder.
- Proto DataStore, który służy do utrwalania danych aplikacji. Repozytoria i serializatory Datastore są przechowywane w
java/data, w tym schematy urządzeń i ustawień użytkownika. Więcej informacji o DataStore znajdziesz w artykule Praca z Proto DataStore. - Hilt do utrwalania danych i obsługi wstrzykiwania zależności.
Kod źródłowy
Interfejs użytkownika i większość funkcji zostały już utworzone.
W tym ćwiczeniu dodamy funkcje Matter do tych plików:
java/com/google/homesampleapp/commissioning/AppCommissioningService: umożliwia włączanie urządzeń do środowiska deweloperskiego;java/com/google/homesampleapp/screens/home/HomeScreenijava/com/google/homesampleapp/screens/home/HomeViewModel.kt: zawiera funkcję uruchamiania pakietu Home Mobile SDK.java/com/google/homesampleapp/screens/device/DeviceScreenijava/com/google/homesampleapp/screens/device/DeviceViewModel: obejmuje wywołania interfejsu Share Device API.
Każdy plik jest opatrzony komentarzem z blokiem kodu, który będziesz modyfikować, np.:
// CODELAB: add commissioningFunction()
Dzięki temu możesz szybko znaleźć odpowiednią sekcję w samouczku.
3. Prowizja dla Google
Zanim będzie można sterować urządzeniami i umożliwić im komunikację ze sobą w ramach tej samej struktury, muszą one zostać skonfigurowane przez konfiguratora, którym w tym przypadku jest ta przykładowa aplikacja – Google Home Sample App for Matter.
Ważne jest, aby znać te pojęcia związane z wdrażaniem Matter:
- Tkaniny umożliwiają urządzeniom komunikację między sobą.
- Tkaniny utrzymują wspólny zestaw unikalnych danych logowania.
- Ekosystemy odpowiadają za wydawanie zaufanych certyfikatów głównych, przypisywanie identyfikatorów tkaniny i przypisywanie unikalnych identyfikatorów węzłów. Ekosystem to usługa backendu komisarza, np. Home Graph w ekosystemie Google Home.
- Urządzenia mogą być przypisane do więcej niż jednej sieci (funkcja wielu administratorów).
Aby uruchomić urządzenie, musisz użyć interfejsu CommissioningClient API. Wywołanie funkcji .commissionDevice() zwraca obiekt IntentSender, który uruchamia odpowiednią aktywność w Usługach Google Play:
interface CommissioningClient {
Task<IntentSender> commissionDevice(CommissioningRequest request);
}
W kolejnych sekcjach omówimy minimalny kod wymagany do przekazania urządzeń do Google.
Krok 1. Uruchamianie aktywności
Aby obsłużyć IntentSender z CommissioningClient, możesz użyć elementu 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)
}
}
Krok 2. Funkcja uruchamiania
Oto podstawowy przykład, który używa interfejsu CommissioningClient API do przekazywania urządzenia do sieci Google.
- Proces uruchamiania rozpoczyna się od funkcji
commissionDevice(). Najpierw definiuje sięCommissioningRequest. W tej konfiguracji domyślnej urządzenia są wdrażane tylko w lokalnej sieci Androida. Matterto punkt wejścia do pakietu Home Mobile SDK. W kolejnym wywołaniu.getCommissioningClientuzyskuje CommissioningClient przezthis(Activity)..commissionDevice()akceptujeCommissioningRequest.- Na koniec wywoływana jest funkcja
.addOnSuccessListener, która przetwarzaCommissioningResulti uruchamia aktywność Commission Device w Usługach 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())
}
}
Lokalną strukturę Androida można wykorzystać w ustawieniach Androida, aby uprościć proces przekazywania urządzeń do innych struktur.
Następnie dowiesz się, jak włączyć urządzenie w środowisku deweloperskim.
Omówienie interfejsu użytkownika podczas procesu uruchamiania znajdziesz w przewodniku po przykładowej aplikacji Google Home na potrzeby Matter.
4. Zlecenie opracowania materiału
Urządzenia można przypisać do więcej niż jednej sieci. Aby zarządzać zaufanymi parami, urządzenia przechowują FabricTable zawierający różne FabricInfo, na przykład:
- Rozpoznawanie tkanin
- Identyfikator węzła przypisany do urządzenia przez sieć.
- Identyfikator dostawcy
- Identyfikator tkaniny
- Poświadczenia operacyjne urządzenia
Menedżer domeny administracyjnej (ADM) określa dane logowania sieci. W poprzednim scenariuszu Usługi Google Play są ekosystemem, który pełni rolę zaufanego głównego urzędu certyfikacji. Gdy włączasz urządzenia w lokalnej sieci Androida, każde z nich zawiera ten sam zestaw danych uwierzytelniających sieci i ten sam zestaw urzędów certyfikacji.
Usługi uruchamiania niestandardowego
Aby zlecić wdrożenie w lokalnej strukturze Androida, użyliśmy parametrów domyślnych do utworzenia CommissioningRequest w interfejsie CommissioningClient API:
val request: CommissioningRequest = CommissioningRequest.builder().build()
Jeśli chcesz sterować nowymi urządzeniami i nimi zarządzać z poziomu aplikacji, musisz utworzyć lokalną platformę deweloperską i uzyskać dane uwierzytelniające do obsługi urządzeń. W takim przypadku aplikacja staje się unikalnym, niezależnym ekosystemem, który przypisuje urządzeniom odpowiednie dane logowania węzła.
Możesz poinformować pakiet Home Mobile SDK, że chcesz włączyć urządzenia do własnej sieci, przekazując niestandardową usługę do CommissioningRequest:
class CommissioningRequest {
static CommissioningRequest.Builder builder();
class Builder {
Builder setCommissioningService(@Nullable ComponentName commissioningService);
CommissioningRequest build();
}
}
W kolejnych krokach zmodyfikujemy funkcję commissionDevice(), aby używała usługi niestandardowej. Dodamy też do fragmentu głównego narzędzie Activity Launcher i będziemy używać obiektów LiveData do zarządzania przepływem interfejsu API.
Krok 1. Utwórz narzędzie do uruchamiania aktywności GPS
Najpierw utwórzmy narzędzie do uruchamiania aktywności, które będzie obsługiwać IntentSender z interfejsu CommissioningClient API.
- Otwórz plik
HomeScreenw folderzejava/com/google/homesampleapp/screens/home/. - Zastąp komentarz
// CODELAB: commissionDeviceLauncher definitiontym kodem, aby zarejestrować i obsłużyć wynik działania związanego z uruchomieniem: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) } }
Krok 2. Wywołaj działanie związane z uruchomieniem urządzenia
W tym kroku użytkownik wywołuje działanie „Uruchom urządzenie”, klikając przycisk „+” w prawym dolnym rogu ekranu głównego. Następnie zostanie wykonane połączenie z numerem commissionDevice().
val onCommissionDevice = {
...
commissionDevice(activity!!.applicationContext, commissionDeviceLauncher)
}
Krok 3. Wywołaj interfejs API
- Nadal w
HomeScreen.ktw folderzejava/com/google/homesampleapp/screens/home. - Zastąp komentarz
// CODELAB: commissionDevicetym komentarzem:commissionDeviceRequest.setCommissioningServicewiążeAppCommissioningServicez instancjąCommissioningService, która jest zwracana w funkcji wywołania zwrotnego. Gdy przejdziesz do usługi niestandardowej, pakiet Home Mobile SDK najpierw włączy urządzenia do lokalnej struktury Androida, a następnie wyśle z powrotem doAppCommissioningServiceładunek wprowadzający.val commissionDeviceRequest = CommissioningRequest.builder() .setCommissioningService(ComponentName( context, AppCommissioningService::class.java)) .build() - Zadzwoń pod numer
.getCommissioningClient(), a potem pod numer.commissionDevice().
Matter.getCommissioningClient(context)
.commissionDevice(commissionDeviceRequest)
Aby dokończyć funkcję commissionDevice, dodaj addOnSuccessListener i addOnFailureListener:
.addOnSuccessListener { result ->
commissionDeviceLauncher.launch(IntentSenderRequest.Builder(result).build())
}
.addOnFailureListener { error ->
Timber.e(error)
}
5. Tworzenie usługi uruchamiania
W funkcji commissionDevice() wysłaliśmy prośbę o pobranie CommissioningService z interfejsu CommissioningClient API. W tym procesie interfejs CommissioningClient API najpierw wdraża urządzenia w lokalnej strukturze Androida, a potem zwraca wywołanie zwrotne, które zawiera obiekt CommissioningRequestMetadata:
public interface CommissioningService {
interface Callback {
void onCommissioningRequested(CommissioningRequestMetadata metadata);
}
}
Teraz musimy odziedziczyć CommissioningService.Callback i zapewnić funkcjonalność wymaganą do uruchamiania urządzeń w naszej przykładowej aplikacji. Oto przykład podstawowej implementacji 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())
}
}
Krok 1. Zapoznaj się z niestandardową usługą AppCommissioningService
Aby ułatwić Ci rozpoczęcie pracy, zdefiniowaliśmy już podstawową strukturę klasy dla naszej niestandardowej usługi CommissioningService. Oto krótkie omówienie funkcji usługi. Aby kontynuować, otwórz AppCommissioningService w java/commissioning.
Dodaliśmy te importy do interfejsów API pakietu 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 zawiera też biblioteki z repozytorium Matter (connectedhomeip):
import com.google.homesampleapp.chip.ChipClient
Usługa obejmuje też importy do obsługi Hilta i rutyn współbieżnych Kotlin.
Następnie tworzymy konstruktor i konfigurujemy kilka elementów, w tym commissioningServiceDelegate, którego użyjemy, aby poinformować usługi Google Play o zakończeniu procesu.
private lateinit var commissioningServiceDelegate: CommissioningService ... commissioningServiceDelegate = CommissioningService.Builder(this).setCallback(this).build()
Teraz nadszedł czas na dodanie funkcji uruchamiania.
Krok 2. Zastąp metodę onCommissioningRequested
Aby przekazać urządzenia do środowiska deweloperskiego aplikacji, wykonaj te czynności:
- Otwórz:
AppCommissioningServicew aplikacjijava/commissioning. - Znajdź funkcję
onCommissioningRequested(). Podaliśmy komunikat logu, który wyświetla wartośćCommissioningRequestMetadata. Zastąp komentarz// CODELAB: onCommissioningRequested(), aby uruchomić współprogramserviceScopei uzyskaćdeviceId.// Perform commissioning on custom fabric for the sample app. serviceScope.launch { val deviceId = devicesRepository.incrementAndReturnLastDeviceId() - Przeprowadź uruchomienie. W tym kroku możemy przekazać informacje o urządzeniu zwrócone w obiekcie CommissioningRequestMetadata.
ChipClientwykorzystuje te metadane do utworzenia bezpiecznego kanału między aplikacją GHSA for Matter a urządzeniem.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 } - Użyj
commissioningServiceDelegate, aby poinformować usługi Google Play, że proces uruchamiania został zakończony. W.sendCommissioningComplete()przekaż 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") } }
Uruchamianie aplikacji
Teraz, gdy mamy już cały wymagany kod do uruchomienia lokalnej sieci, czas go przetestować. Wybierz urządzenie z Androidem i uruchom aplikację. Na ekranie głównym kliknij Dodaj urządzenie i wykonaj czynności, aby skonfigurować urządzenie.
Po zakończeniu procesu uruchamiania urządzenie będzie uczestniczyć w 2 sieciach: lokalnej sieci Androida i lokalnej sieci deweloperskiej. Każda sieć ma własny zestaw danych logowania i unikalny 64-bitowy identyfikator sieci.
6. Sterowanie urządzeniami
Wprowadzanie do sieci deweloperskiej umożliwia korzystanie z bibliotek z repozytorium Matter (connectedhomeip) do sterowania urządzeniami z poziomu aplikacji przykładowej.
Utworzyliśmy kilka klas pomocniczych, aby ułatwić dostęp do klastrów urządzeń i wysyłanie poleceń. Więcej informacji znajdziesz w ClustersHelper w java/clusters. Ten pomocniczy element Singleton importuje te biblioteki, aby uzyskać dostęp do informacji o urządzeniu:
import chip.devicecontroller.ChipClusters import chip.devicecontroller.ChipStructs
Możemy użyć tej klasy, aby uzyskać klaster włączania/wyłączania urządzenia, a następnie wywołać .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)
}
})
}
}
Przełączanie urządzenia
Po uruchomieniu urządzenia ładunek zwrócony w CommissioningResult zostanie dodany do DataStore. Dzięki temu nasza aplikacja ma dostęp do informacji o urządzeniu, których możemy używać do wysyłania poleceń.
Aplikacje Matter są oparte na zdarzeniach. Po zainicjowaniu stosu Matter usługi klastra nasłuchują przychodzących wiadomości. Po uruchomieniu urządzenia klienty Matter wysyłają polecenia przez bezpieczny kanał operacyjny, który został utworzony podczas uruchamiania urządzenia.
Na urządzeniu pakiety są weryfikowane, odszyfrowywane, a następnie wysyłane z wywołaniem zwrotnym. Funkcje wywołania zwrotnego obejmują EndpointId, ClusterId i AttributeId, do których można uzyskać dostęp z poziomu attributePath. Ten kod można na przykład wdrożyć na urządzeniu 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;
}
W kolejnych krokach użyjesz pakietu SDK Matter i ClustersHelper, aby przełączać urządzenie.
- Przejdź do
DeviceViewModelwjava/screens/device. - Znajdź funkcję
updateDeviceStateOn. - Zastąp
// CODELAB: togglekomentarz kodem, aby wywołaćclustersHelper, a potem zaktualizuj repozytorium urządzenia: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") }
Ta funkcja jest wywoływana z DeviceScreen:
// On/Off Switch click.
val onOnOffClick: (value: Boolean) -> Unit = { value ->
deviceViewModel.updateDeviceStateOn(deviceUiModel!!, value)
}
Uruchamianie aplikacji
Uruchom aplikację, aby ponownie wczytać aktualizacje. Włączaj i wyłączaj urządzenie na ekranie głównym.
7. Udostępnianie urządzeń innym ekosystemom
Udostępnianie urządzenia jest w specyfikacji Matter określane jako proces z wieloma administratorami.
Z poprzednich kroków wiesz, że pakiet Home Mobile SDK umożliwia wdrażanie urządzeń w lokalnej strukturze Androida, a także w strukturze deweloperskiej na potrzeby aplikacji przykładowej. Jest to przykład przepływu z wieloma administratorami, w którym urządzenia można wdrażać w więcej niż 1 strukturze.
Możesz teraz udostępniać urządzenia jeszcze większej liczbie osób, zwłaszcza jeśli w domu każdy ma własne preferencje dotyczące aplikacji i platform.
Pakiet Home Mobile SDK udostępnia tę funkcję w interfejsie ShareDeviceRequest API, który umożliwia:
- Otwórz tymczasowe okno uruchamiania urządzeń.
- Zmień stan urządzeń, aby można było je przypisać do innej sieci.
- sterować urządzeniami z innych aplikacji i ekosystemów;
W kolejnych krokach użyjesz pakietu Home Mobile SDK do udostępniania urządzeń.
Krok 1. Utwórz narzędzie do uruchamiania aktywności GPS
Podobnie jak w przypadku narzędzia Commissioning Activity Launcher, które utworzyliśmy podczas wdrażania w środowisku deweloperskim, utworzyliśmy narzędzie Share Device Activity Launcher do obsługi IntentSender z interfejsu CommissioningClient API.
- Otwórz plik
DeviceScreenw folderzejava/com/google/homesampleapp/screens/device/. - Zastąp komentarz
// CODELAB: shareDeviceLauncher definitiontym kodem, aby zarejestrować i obsłużyć wynik działania.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) } }
Krok 2. Wywołaj działanie udostępniania urządzenia
W tym kroku użytkownik wywołuje działanie „Udostępnij urządzenie”, klikając przycisk „Udostępnij” na ekranie urządzenia. Następnie zostanie wykonane połączenie z deviceViewModel, aby otworzyć okno parowania na potrzeby udostępniania urządzenia.
// Share Device button click.
val onShareDevice: () -> Unit = remember {
{
deviceViewModel.openPairingWindow(deviceUiModel!!.device.deviceId)
}
}
Po otwarciu okna parowania deviceViewModel informuje o tym interfejs. Komunikacja między ViewModel a interfejsem użytkownika odbywa się za pomocą obiektów StateFlow.
// Communicate to the UI that the pairing window is open. // UI can then launch the GPS activity for device sharing. _pairingWindowOpenForDeviceSharing.value = true
Gdy DeviceScreen zauważy zmianę w obiekcie StateFlow, wykona to wywołanie:
shareDevice(activity!!.applicationContext, shareDeviceLauncher, deviceViewModel)
Krok 3. Wywołaj interfejs API
Teraz czas na rozpoczęcie zadania udostępniania urządzenia.
- Otwórz plik
DeviceScreen.ktw folderzejava/com/google/homesampleapp/screens/device/. - Znajdź funkcję
shareDevice(). Zastąp komentarz// CODELAB: shareDevicekodemShareDeviceRequest.DeviceDescriptorzawiera szczegółowe informacje o urządzeniu, takie jak identyfikator dostawcy, identyfikator produktu i typ urządzenia. W tym przykładzie wartości są zakodowane na stałe.val shareDeviceRequest = ShareDeviceRequest.builder() .setDeviceDescriptor(DeviceDescriptor.builder().build()) .setDeviceName("GHSAFM temp device name") - Ustaw CommissioningWindow i parametry.
.setCommissioningWindow( CommissioningWindow.builder() .setDiscriminator(Discriminator.forLongValue(DISCRIMINATOR)) .setPasscode(SETUP_PIN_CODE) .setWindowOpenMillis(SystemClock.elapsedRealtime()) .setDurationSeconds(OPEN_COMMISSIONING_WINDOW_DURATION_SECONDS.toLong()) .build()) .build() - Wywołaj
.getCommissioningClient(), ale tym razem użyj interfejsu API.shareDevice().Matter.getCommissioningClient(context) .shareDevice(shareDeviceRequest)
Wywołanie zwrotne w przypadku powodzenia interfejsu commissioningClient.shareDevice() API udostępnia obiekt IntentSender, który służy do uruchamiania funkcji Udostępnianie aktywności na urządzeniu w usługach Google Play.
- Aby dokończyć funkcję
shareDevice, dodajaddOnSuccessListeneriaddOnFailureListener. Jeśli operacja się powiedzie, na urządzeniushareDeviceLauncherwywoływana jest funkcjalaunch, aby uruchomić aktywność GPS na potrzeby udostępniania urządzenia..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()) }
Uruchamianie aplikacji
Aby udostępnić urządzenie Matter innym ekosystemom, musisz mieć na urządzeniu z Androidem zainstalowaną inną platformę. Utworzyliśmy kolejne wystąpienie aplikacji przykładowej, którego możesz użyć jako komisarza docelowego.
Po zainstalowaniu na urządzeniu z Androidem aplikacji docelowej sprawdź, czy możesz udostępnić urządzenie Matter. Aplikacja komisarza docelowego jest oznaczona etykietą GHSAFM-TC.
Urządzenia mogą teraz uczestniczyć w 3 rodzajach sieci:
- Lokalna struktura Androida.
- Twoje środowisko programistyczne (ta aplikacja).
- To trzecia usługa, której właśnie udostępniasz urządzenie.
8. Następne kroki
Gratulacje
Gratulacje! Udało Ci się ukończyć ten Codelab i dowiedzieć się, jak włączać urządzenia i udostępniać je za pomocą pakietu Home Mobile SDK.
Jeśli masz problemy z aplikacją przykładową, wykonaj te czynności, aby zweryfikować środowisko:
Jeśli masz pytania dotyczące korzystania z przykładowej aplikacji lub znajdziesz błąd w kodzie, możesz zgłosić problem w narzędziu Issue Tracker w repozytorium GitHub:
Aby uzyskać oficjalne wskazówki od Google dotyczące kwestii technicznych, skorzystaj z Forum dla deweloperów inteligentnego domu:
Aby uzyskać pomoc techniczną od społeczności, użyj tagu google-smart-home na Stack Overflow: