1. Bienvenido
Matter se diseñó con el objetivo de unificar los estándares de la IoT y conecta los dispositivos de casa inteligente de diversos ecosistemas, como Google Home, Zigbee, Bluetooth Mesh, Z-Wave y muchos más.
Los dispositivos móviles son un punto central de interacción con los dispositivos de casa inteligente. Si quieres compilar tus propias apps para Android compatibles con dispositivos Matter, podemos ayudarte a comenzar rápidamente.
La app de ejemplo de Google Home para Matter (GHSA para Matter) muestra las APIs del SDK de Home Mobile, lo que les permite a los usuarios asignar y compartir dispositivos. También puedes usar la app de ejemplo como herramienta de aprendizaje para comprender mejor los conceptos clave de Matter, así como para depurar interacciones con dispositivos Matter y solucionar problemas relacionados con ellas.
Actividades
En este codelab, descargarás el código fuente de la app de ejemplo y aprenderás a usar el SDK de Home Mobile para asignar y compartir dispositivos. También aprenderás a usar bibliotecas de comisiones y clústeres del repositorio de Matter (connectedhomeip
).
Después de que descargues la app de ejemplo, revisaremos el código fuente en Android Studio y, luego, implementaremos las siguientes APIs del SDK de Home Mobile:
También obtendrás más información sobre los conceptos de comisión, las telas de Matter y cómo controlar los dispositivos de Matter.
Requisitos
Antes de comenzar, asegúrate de completar los siguientes pasos:
- Consulta la guía de la app de ejemplo de Google Home para Matter.
- Descarga Android Studio.
- Debes tener un dispositivo con Android O (8.1, nivel de API 27) o versiones posteriores disponible para pruebas. Para asegurarte de que tu dispositivo cuente con la compatibilidad más reciente de Matter, consulta el artículo Cómo verificar los módulos de Matter y de Google Cloud.
- Usar un dispositivo Matter con funciones de encendido y apagado Para minimizar los problemas del entorno, te recomendamos que uses el dispositivo virtual de Matter (MVD) para comenzar. Si tienes problemas, será mucho más fácil investigar si la app de ejemplo se usa con el MVD. Estas son otras opciones:
- Compila un dispositivo virtual de Matter con la app de
rootnode_dimmablelight_bCwGYSDpoe
. Cuando creas una integración de Matter en Home Developer Console, usa0xFFF1
como tu ID de proveedor y0x8000
como tu ID del producto. - Compila un dispositivo Espressif con
all-clusters-app
. Cuando creas una integración de Matter en Home Developer Console, usa0xFFF1
como tu ID de proveedor y0x8001
como tu ID del producto.
- Compila un dispositivo virtual de Matter con la app de
- Consulta cómo configurar los Servicios de Google Play.
No necesitas un concentrador, por ejemplo, un Google Nest Hub (2a generación), para asignar y controlar dispositivos con la app de ejemplo.
2. Prepárate
La app de partida del codelab se encuentra en la rama codelab
. Para comenzar a trabajar con el código fuente del codelab, puedes descargar el archivo ZIP.
Usarás este archivo ZIP codelab
para compilar una muestra que funcione.
Versiones del codelab
La rama codelab
está etiquetada con la versión 2.0.0 de la app de ejemplo. Para comparar las actualizaciones a medida que avanzas en cada paso, puedes descargar el código fuente completo de esta versión.
Si quieres clonar el repositorio de GitHub, sigue las instrucciones del archivo README de la app de ejemplo.
Dependencias
Te guiaremos a través del código fuente necesario para compartir y asignar dispositivos, pero puede ser útil tener en cuenta las siguientes dependencias antes de comenzar. Ten en cuenta que estas dependencias se declaran en el archivo libs.versions.toml y su uso se especifica en el archivo build.gradle.kts.
- SDK de Home para dispositivos móviles
- Bibliotecas del SDK de Matter.
- Jetpack Compose La IU se implementa por completo con Compose.
- Material Design. Para obtener más información, consulta MDC-103 Android: Temas de Material con color, elevación y tipo (Kotlin) y Material Theme Builder.
- Proto DataStore, que se usa para conservar los datos de app Los repositorios de Datastore y los serializadores se almacenan en
java/data
, incluidos los esquemas para los dispositivos y las preferencias del usuario. Para obtener más información sobre DataStore, consulta Cómo trabajar con Proto DataStore. - Hilt para conservar los datos y admitir la inserción de dependencias.
Código fuente
La interfaz de usuario y la mayoría de las funciones ya están creadas para ti.
En este codelab, agregaremos la funcionalidad de Matter a los siguientes archivos:
java/com/google/homesampleapp/commissioning/AppCommissioningService
: Te permite asignar dispositivos a la estructura de desarrollo.java/com/google/homesampleapp/screens/home/HomeScreen
yjava/com/google/homesampleapp/screens/home/HomeViewModel.kt
: Incluye la función de asignación del SDK de Home para dispositivos móviles.java/com/google/homesampleapp/screens/device/DeviceScreen
yjava/com/google/homesampleapp/screens/device/DeviceViewModel
: Incluye las llamadas a la API de Share Device.
Cada archivo tiene comentarios con el bloque de código que modificarás, por ejemplo:
// CODELAB: add commissioningFunction()
De esta manera, podrás encontrar rápidamente la sección correspondiente en el codelab.
3. Comisión a Google
Para que puedas controlar los dispositivos y permitir que se comuniquen entre sí dentro de la misma estructura, deben ser encargados por un comisionado, que en este caso es esta aplicación de ejemplo, la app de ejemplo de Google Home para Matter.
Es importante comprender los siguientes conceptos sobre la comisión de Matter:
- Los tejidos permiten que los dispositivos se comuniquen entre sí.
- Las Fabrics mantienen un conjunto compartido de credenciales únicas.
- Los ecosistemas son responsables de emitir certificados raíz confiables, asignar IDs de tejido y asignar IDs de nodos únicos. Un ecosistema es el servicio de backend de un comisionado, como Home Graph para el ecosistema de Google Home.
- Los dispositivos se pueden encargar a más de un tejido (función de administrador múltiple).
Para encargar un dispositivo, deberás usar la API de CommissioningClient. Una llamada a .commissionDevice()
devuelve un IntentSender, que inicia la actividad adecuada en los Servicios de Google Play:
interface CommissioningClient { Task<IntentSender> commissionDevice(CommissioningRequest request); }
En las siguientes secciones, revisaremos el código mínimo necesario para asignar dispositivos a la estructura de Google.
Paso 1: Selector de actividades
Para controlar el IntentSender
de CommissioningClient
, puedes usar un 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) } }
Paso 2: Función de comisión
Este es un ejemplo básico en el que se usa la API de CommissioningClient para asignar un dispositivo a la estructura de Google.
- El proceso de comisión comienza con la función
commissionDevice()
. Primero, se define unCommissioningRequest
. Con esta configuración predeterminada, los dispositivos se realizan únicamente a la estructura local de Android. Matter
es el punto de entrada del SDK de Home Mobile. En la próxima llamada,.getCommissioningClient
obtiene un CommissioningClient dethis
(Activity)..commissionDevice()
aceptaCommissioningRequest
.- Por último, se llama a
.addOnSuccessListener
para procesar elCommissioningResult
e iniciar la actividad de dispositivos de comisión de los Servicios de 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 Fabric local se puede aprovechar a través de la configuración de Android para simplificar el proceso de asignación de dispositivos a otras infraestructuras.
A continuación, aprenderás a asignar un dispositivo a un tejido de desarrollo.
Para obtener una descripción general de la interfaz de usuario durante el proceso de comisión, consulta la guía de Matter de la app de ejemplo de Google Home.
4. Comisión a un tejido de desarrollo
Los dispositivos se pueden realizar para más de un tejido. Para administrar las vinculaciones de confianza, los dispositivos almacenan una FabricTable
que contiene varios miembros de FabricInfo
, por ejemplo:
- Identificación textil
- Es el ID de nodo que la estructura asignó al dispositivo.
- ID del proveedor
- ID de Fabric
- Credenciales operativas del dispositivo
El administrador de dominio administrativo (ADM) define las credenciales de tejido. En la situación anterior, los Servicios de Google Play son el ecosistema que actúa como una autoridad de certificación raíz (AC) confiable. Cuando asignas dispositivos a la estructura local de Android, cada dispositivo incluye el mismo conjunto de credenciales de estructura y el mismo conjunto de AC.
Comisión de servicios personalizados
Para realizar la comisión a la estructura local de Android, usamos los parámetros predeterminados para compilar el CommissioningRequest
en la API de CommissioningClient:
val request: CommissioningRequest = CommissioningRequest.builder().build()
Si quieres controlar y administrar dispositivos nuevos desde tu app, debes crear una estructura de desarrollo local y obtener las credenciales operativas para asignar dispositivos. En esta situación, tu app se convierte en un ecosistema independiente y único que asigna las credenciales de nodo adecuadas a los dispositivos.
Para informar al SDK de Home Mobile SDK que quieres asignar dispositivos a tu propia estructura, pasa un servicio personalizado a CommissioningRequest:
class CommissioningRequest { static CommissioningRequest.Builder builder(); class Builder { Builder setCommissioningService(@Nullable ComponentName commissioningService); CommissioningRequest build(); } }
En los próximos pasos, modificaremos la función commissionDevice()
para usar un servicio personalizado. También agregaremos un selector de actividades al fragmento de la pantalla principal y usaremos objetos LiveData para administrar el flujo de la API.
Paso 1: Crea un Selector de actividad de GPS
Primero, crearemos un selector de actividades para controlar IntentSender
desde la API de CommissioningClient.
- Abre
HomeScreen
en la carpetajava/com/google/homesampleapp/screens/home/
. - Reemplaza el comentario
// CODELAB: commissionDeviceLauncher definition
por el siguiente código para registrar y controlar el resultado de la actividad de comisión: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) } }
Paso 2: Activa la acción de dispositivo de comisión
En este paso, el usuario activa el parámetro "Commission Device" acción haciendo clic en el signo "+" en la esquina inferior derecha de la pantalla principal. Luego, se realiza una llamada a commissionDevice()
.
val onCommissionDevice = { ... commissionDevice(activity!!.applicationContext, commissionDeviceLauncher) }
Paso 3: Llama a la API
- Aún en
HomeScreen.kt
en la carpetajava/com/google/homesampleapp/screens/home
. - Reemplaza el comentario
// CODELAB: commissionDevice
por el siguientecommissionDeviceRequest
.setCommissioningService
vinculaAppCommissioningService
a una instancia deCommissioningService
, que se muestra en una función de devolución de llamada. Cuando pasas un servicio personalizado, el SDK de Home para dispositivos móviles primero asigna dispositivos a la estructura local de Android y, luego, envía la carga útil de integración aAppCommissioningService
.val commissionDeviceRequest = CommissioningRequest.builder() .setCommissioningService(ComponentName( context, AppCommissioningService::class.java)) .build()
- Llama a
.getCommissioningClient()
y, luego, llama a.commissionDevice()
.
Matter.getCommissioningClient(context) .commissionDevice(commissionDeviceRequest)
Para completar nuestra función commissionDevice
, agrega un addOnSuccessListener
y un addOnFailureListener
:
.addOnSuccessListener { result -> commissionDeviceLauncher.launch(IntentSenderRequest.Builder(result).build()) } .addOnFailureListener { error -> Timber.e(error) }
5. Crea un servicio de comisión
En la función commissionDevice()
, solicitamos que obtuviéramos un CommissioningService de la API de CommissioningClient. En este flujo, la API de CommissioningClient primero asigna dispositivos a la estructura local de Android y, luego, muestra una devolución de llamada que incluye el objeto CommissioningRequestMetadata:
public interface CommissioningService { interface Callback { void onCommissioningRequested(CommissioningRequestMetadata metadata); } }
Ahora, tenemos que heredar el CommissioningService.Callback y proporcionar la funcionalidad necesaria para enviar dispositivos a nuestra app de ejemplo. Este es un ejemplo de una implementación básica de 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()) } }
Paso 1: Explora el AppCommissioningService personalizado
Para ayudarte a comenzar, ya definimos la estructura de clases básica para nuestro CommissioningService personalizado. A continuación, presentamos una descripción general rápida de la funcionalidad del servicio. Para continuar, abre AppCommissioningService
en java/commissioning
.
Agregamos las siguientes importaciones para las APIs del SDK de Home Mobile:
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
también incluye bibliotecas del repositorio de Matter (connectedhomeip
):
import com.google.homesampleapp.chip.ChipClient
Por último, el servicio incluye importaciones para admitir las corrutinas de Hilt y Kotlin.
A continuación, crearemos el constructor y configuraremos algunas cosas, incluida la commissioningServiceDelegate
, que usaremos para informarle a los Servicios de Google Play cuando se complete la puesta en servicio.
private lateinit var commissioningServiceDelegate: CommissioningService ... commissioningServiceDelegate = CommissioningService.Builder(this).setCallback(this).build()
Ahora es el momento de agregar las funciones de comisión.
Paso 2: Anula onCommissioningRequested
Para asignar dispositivos a la estructura de desarrollo de la app, completa los siguientes pasos:
- Abrir
AppCommissioningService
enjava/commissioning
. - Ubica la función
onCommissioningRequested()
. Proporcionamos un mensaje de registro que imprime elCommissioningRequestMetadata
. Reemplaza el comentario// CODELAB: onCommissioningRequested()
para iniciar la corrutinaserviceScope
y obtener eldeviceId
.// Perform commissioning on custom fabric for the sample app. serviceScope.launch { val deviceId = devicesRepository.incrementAndReturnLastDeviceId()
- Realizar la puesta en marcha En este paso, podemos pasar la información del dispositivo que se muestra en el objeto CommissioningRequestMetadata.
ChipClient
usa esta información de metadatos para crear un canal seguro entre la app de GHSA para Matter y tu dispositivo.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 }
- Usa el
commissioningServiceDelegate
para informar a los Servicios de Google Play que se completó la comisión. En.sendCommissioningComplete()
, pasa 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") } }
Ejecuta la app
Ahora que tenemos todo el código requerido para realizar la comisión a nuestra estructura local, es momento de probarlo. Elige tu dispositivo Android y ejecuta la app. En la pantalla principal, presiona Agregar dispositivo y completa los pasos para asignar el dispositivo.
Cuando se complete la puesta en marcha, tu dispositivo ahora participará en dos tejidos: la estructura local de Android y la estructura de desarrollo local. Cada red tiene su propio conjunto de credenciales y un ID de tejido único de 64 bits.
6. Controla dispositivos
La comisión a un tejido de desarrollo te permite usar las bibliotecas del repositorio de Matter (connectedhomeip
) para controlar dispositivos desde la app de ejemplo.
Creamos algunas clases auxiliares para facilitar el acceso a los clústeres del dispositivo y el envío de comandos. Para obtener más información, abre ClustersHelper
en java/clusters
. Este ayudante de singleton importa las siguientes bibliotecas para acceder a la información del dispositivo:
import chip.devicecontroller.ChipClusters import chip.devicecontroller.ChipStructs
Podemos usar esta clase para obtener el clúster de activación/desactivación de un dispositivo y, luego, llamar 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) } }) } }
Activa o desactiva un dispositivo
Después de asignar un dispositivo, la carga útil que se muestra en CommissioningResult se agrega a DataStore. Esto le da a nuestra app acceso a información del dispositivo que podemos usar para enviar comandos.
Las apps de Matter dependen de los eventos. Cuando se inicializa la pila de Matter, los servicios del clúster escuchan los mensajes entrantes. Una vez que se pone en marcha un dispositivo, los clientes de Matter envían comandos a través del canal operativo seguro que se estableció durante la puesta en marcha del dispositivo.
En el dispositivo, los paquetes se validan, se desencriptan y luego se despachan con una devolución de llamada. Las funciones de devolución de llamada incluyen EndpointId, ClusterId y AttributeId, a los que se puede acceder desde attributePath
. Por ejemplo, este código se puede implementar en un dispositivo 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; }
En los próximos pasos, usarás el SDK de Matter y ClustersHelper
para activar o desactivar un dispositivo.
- Ve a
DeviceViewModel
enjava/screens/device
. - Ubica la función
updateDeviceStateOn
. - Reemplaza el comentario
// CODELAB: toggle
por el código para llamar aclustersHelper
y, luego, actualiza el repositorio del dispositivo: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") }
Se llama a esta función desde DeviceScreen
:
// On/Off Switch click. val onOnOffClick: (value: Boolean) -> Unit = { value -> deviceViewModel.updateDeviceStateOn(deviceUiModel!!, value) }
Ejecuta la app
Ejecuta la app para volver a cargar tus actualizaciones. En la pantalla principal, enciende y apaga tu dispositivo.
7. Cómo compartir dispositivos con otros ecosistemas
En la especificación de Matter, se conoce como flujo de administración múltiple.
En los pasos anteriores, aprendimos que el SDK de Home Mobile permite asignar dispositivos a la estructura local de Android y también a una estructura de desarrollo para la app de ejemplo. Este es un ejemplo de flujo de varios administradores, en el que los dispositivos se pueden encargar a más de una estructura.
Es posible que quieras compartir dispositivos con más telas, especialmente si se trata de una casa en la que las personas tienen sus preferencias en cuanto a aplicaciones y plataformas.
El SDK de Home Mobile proporciona esta funcionalidad en la API de ShareDeviceRequest, lo que te permite hacer lo siguiente:
- Abre un período de comisión temporal para los dispositivos.
- Cambia el estado de tus dispositivos para que se puedan poner en marcha en otra estructura.
- Controla tus dispositivos desde otras apps y ecosistemas.
En los próximos pasos, usarás el SDK de Home Mobile para compartir dispositivos.
Paso 1: Crea un Selector de actividad de GPS
De manera similar al selector de actividad de comisión que creamos cuando le asignamos un tejido de desarrollo, creamos un selector de actividad de dispositivos compartidos para controlar el IntentSender
de la API de CommissioningClient.
- Abre
DeviceScreen
en la carpetajava/com/google/homesampleapp/screens/device/
. - Reemplaza el comentario
// CODELAB: shareDeviceLauncher definition
por el siguiente código para registrar y controlar el resultado de la actividad.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) } }
Paso 2: Activa la acción Compartir dispositivo
En este paso, el usuario activa la opción "Compartir dispositivo". acción haciendo clic en el botón “Compartir” botón en la pantalla del dispositivo. Luego, se realiza una llamada al deviceViewModel
para abrir una ventana de vinculación para compartir el dispositivo.
// Share Device button click. val onShareDevice: () -> Unit = remember { { deviceViewModel.openPairingWindow(deviceUiModel!!.device.deviceId) } }
Después de abrir correctamente la ventana de sincronización, deviceViewModel
le comunica ese hecho a la IU. La comunicación entre ViewModel
y la IU se realiza a través de objetos StateFlow
.
// Communicate to the UI that the pairing window is open. // UI can then launch the GPS activity for device sharing. _pairingWindowOpenForDeviceSharing.value = true
Cuando se observa el cambio en el objeto StateFlow, DeviceScreen realiza la siguiente llamada:
shareDevice(activity!!.applicationContext, shareDeviceLauncher, deviceViewModel)
Paso 3: Llama a la API
Ahora es el momento de iniciar una tarea para compartir dispositivos.
- Abre
DeviceScreen.kt
en la carpetajava/com/google/homesampleapp/screens/device/
. - Ubica la función
shareDevice()
. Reemplaza el comentario// CODELAB: shareDevice
porShareDeviceRequest
. ElDeviceDescriptor
proporciona información específica sobre el dispositivo, como el ID de proveedor, el ID del producto y el tipo de dispositivo. En este ejemplo, los valores se codifican.val shareDeviceRequest = ShareDeviceRequest.builder() .setDeviceDescriptor(DeviceDescriptor.builder().build()) .setDeviceName("GHSAFM temp device name")
- Establece la ventana CommissioningWindow y los parámetros.
.setCommissioningWindow( CommissioningWindow.builder() .setDiscriminator(Discriminator.forLongValue(DISCRIMINATOR)) .setPasscode(SETUP_PIN_CODE) .setWindowOpenMillis(SystemClock.elapsedRealtime()) .setDurationSeconds(OPEN_COMMISSIONING_WINDOW_DURATION_SECONDS.toLong()) .build()) .build()
- Llama a
.getCommissioningClient()
, solo que esta vez, usa la API de.shareDevice()
.Matter.getCommissioningClient(context) .shareDevice(shareDeviceRequest)
La devolución de llamada exitosa de la API de commissioningClient.shareDevice()
proporciona el objeto IntentSender que se usará para iniciar la actividad del dispositivo compartido en los Servicios de Google Play.
- Para completar nuestra función
shareDevice
, agrega unaddOnSuccessListener
y unaddOnFailureListener
. Si la operación es exitosa, se llama alaunch
enshareDeviceLauncher
para iniciar la actividad de GPS para compartir el dispositivo..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()) }
Ejecuta la app
Para compartir tu dispositivo Matter con otros ecosistemas, deberás tener otra plataforma instalada en tu dispositivo Android. Creamos otra instancia de la app de ejemplo que puedes usar como comisionado de destino.
Una vez que tengas el comisionado de destino instalado en tu dispositivo Android, verifica que puedes compartir tu dispositivo Matter. La app del comisionado objetivo está etiquetada como GHSAFM-TC.
Tus dispositivos ahora pueden participar en tres tejidos:
- La estructura local de Android.
- Tu tejido de desarrollo (esta app)
- Esta tercera tela con la que acabas de compartir el dispositivo.
8. Próximos pasos
Felicitaciones
¡Felicitaciones! Completaste correctamente este codelab y aprendiste a asignar y compartir dispositivos con el SDK de Home Mobile.
Si tienes problemas con la app de ejemplo, intenta completar los pasos para verificar tu entorno:
Si tienes preguntas sobre cómo usar la app de ejemplo o descubres un error de código, puedes enviar los problemas a la Herramienta de seguimiento de errores en el repositorio de GitHub:
Para obtener orientación oficial de Google sobre preguntas técnicas, visita el Foro de desarrolladores para la casa inteligente:
Para obtener asistencia técnica de la comunidad, usa la etiqueta google-smart-home
en Stack Overflow: