Probar un puente Matter con Apple Home usando solo un PC y un móvil
Antes de tener hardware: un PC con Windows como pasarela y un móvil con nRF Connect como dispositivo Bluetooth. Emparejamiento, control y estado en Apple Home.
En el artículo anterior conté el plan general: poner un gateway Matter entre nuestros dispositivos Bluetooth y Apple Home, y dejar que traduzca los mensajes en ambas direcciones.
Los planes siempre se ven muy ordenados sobre el papel. Antes de tocar ningún hardware quería confirmar una sola cosa: ¿Apple Home aceptará de verdad un gateway escrito por nosotros y controlará los dispositivos Bluetooth que hay detrás?
Esa pregunta no necesita hardware. Las placas de desarrollo seguían de camino, así que usé lo que ya tenía sobre el escritorio, un PC con Windows y un teléfono, y recorrí toda la cadena de punta a punta.
Primero el software, después el hardware
En los proyectos de hardware es tentador empezar comprando placas, soldando módulos y flasheando firmware. El problema es que, con una cadena larga, cuesta saber qué capa ha fallado: ¿falló el emparejamiento de Matter, hay un bug en el gateway, el enlace serie perdió bytes o simplemente la señal Bluetooth es débil?
Si primero pones a funcionar las dos capas superiores en software, el área de búsqueda se reduce cuando llega el hardware real. Y casi no cuesta nada: basta con un ordenador y un teléfono.
Quién hace cada papel
| Rol | En el producto real | En esta demo |
|---|---|---|
| Controlador | Apple Home | Apple Home (el de verdad) |
| Gateway | Placa Linux + módulo Bluetooth | Un PC con Windows y su Bluetooth integrado |
| Dispositivo Bluetooth | Interruptores y luces | Un teléfono con nRF Connect |
Apple Home es el real, y el programa del gateway es el mismo que irá en el producto. Solo el dispositivo Bluetooth de abajo lo interpreta un teléfono.
nRF Connect es la aplicación gratuita de depuración Bluetooth de Nordic para Android e iPhone. Puede escanear los anuncios Bluetooth cercanos y emitir los suyos, lo que la convierte en un buen sustituto de un dispositivo.
¿Por qué no simular directamente un dispositivo Bluetooth Mesh?
En el producto real, los dispositivos y el gateway hablan SIG Mesh. Pero un teléfono no puede hacer de dispositivo Mesh: ni Android ni iOS permiten que una aplicación se convierta en nodo Mesh. Aplicaciones como nRF Mesh solo pueden aprovisionar dispositivos y hacer de mando a distancia.
Por eso la demo usa algo más simple: el dispositivo y el gateway intercambian anuncios Bluetooth normales. Para encender una luz, el gateway emite “encender”; cuando cambia el estado de un dispositivo, este lo emite de vuelta al gateway.
Este formato no tiene cifrado ni protección contra repetición. Existe solo para probar la cadena y nunca saldrá en un producto. Su valor es que todo lo del gateway, salvo la capa de comunicación más baja, es real: el emparejamiento Matter, la tabla de dispositivos, la traducción de comandos y la sincronización de estado.
El formato de anuncio de la demo
Cuanto más simple sea el formato, mejor: tiene que poder escribirse a mano en una aplicación del teléfono.
Gateway → dispositivo (enlace descendente): una entrada de Manufacturer Data con Company ID 0xFFFF. Ese ID lo reserva el Bluetooth SIG para pruebas y no debe usarse en productos reales.
| Bytes | Contenido | Ejemplo |
|---|---|---|
| 1–2 | Fijo GW |
47 57 |
| 3–4 | Dirección del dispositivo, little-endian | 02 00 significa 0002 |
| 5 | Estado de encendido/apagado | 01 encendido, 00 apagado |
| 6 | Número de secuencia, +1 cada vez | 05 |
Dispositivo → gateway (enlace ascendente): un formato para Android y otro para iPhone.
- Android: también Manufacturer Data, Company ID
0xFFFF, datos4456020001.4456esDV,0200es la dirección 0002, y el01final significa encendido. - iPhone: iOS no permite que las aplicaciones pongan datos de fabricante personalizados en los anuncios, solo cambiar el nombre del dispositivo. Así que se pone el nombre
DV0002:1, que significa dirección 0002, encendido.
El análisis en el lado del gateway ocupa unas pocas líneas y acepta ambos:
pub fn uplink(sections: &[(u8, Vec<u8>)]) -> Option<(u16, bool)> {
sections.iter().find_map(|(t, d)| match (*t, d.as_slice()) {
// Android: datos de fabricante FF FF 'D' 'V' dirección estado
(0xFF, [0xFF, 0xFF, b'D', b'V', a0, a1, on, ..]) => {
Some((u16::from_le_bytes([*a0, *a1]), *on != 0))
}
// iPhone: nombre del dispositivo DV0002:1
(0x08 | 0x09, name) => {
let s = std::str::from_utf8(name).ok()?.strip_prefix("DV")?;
let (addr, on) = s.split_once(':')?;
Some((u16::from_str_radix(addr, 16).ok()?, match on {
"1" => true,
"0" => false,
_ => return None,
}))
}
_ => None,
})
}
El programa del gateway
El gateway está escrito en Rust y usa el proyecto de código abierto rs-matter para Matter. El Bluetooth del PC se maneja con las API Bluetooth integradas de Windows, así que no hacen falta controladores adicionales.
Una vez en marcha, el programa hace tres cosas:
- Actúa como gateway Matter: se anuncia en la red local y espera a que Apple Home lo empareje. Si todavía no está emparejado, el código QR de emparejamiento se imprime directamente en el terminal.
- Mantiene una tabla de dispositivos: al escribir
add 0002 Luz del salónen el terminal se añade una luz. Cada dispositivo aparece en Matter como un dispositivo puenteado independiente. - Envía y recibe anuncios: los comandos de Apple Home se convierten en anuncios descendentes; los anuncios ascendentes del teléfono actualizan el estado, que se sincroniza de vuelta con Apple Home.
La tabla de dispositivos y los datos de emparejamiento se guardan en archivos locales, de modo que al reiniciar el programa no hace falta volver a emparejar.
Añadirlo a Apple Home
Escanea el código QR del terminal con la app Casa en un iPhone. Hay que tener en cuenta algunas cosas:
- Verás un aviso de “Accesorio no certificado”. Durante el desarrollo el gateway usa los certificados de prueba oficiales de Matter, que no están certificados, así que iOS te avisa. Elige “Añadir de todos modos”. Las unidades de producción necesitan certificados reales, emitidos tras la certificación.
- El PC y el iPhone deben estar en la misma red local, y el Firewall de Windows debe permitir que el programa envíe y reciba tráfico de red. Si el emparejamiento agota el tiempo de espera, revisa esto primero.
- Necesitas un concentrador doméstico. Apple Home necesita un HomePod o un Apple TV como concentrador doméstico para controlar accesorios Matter.
Una vez añadido, Apple Home muestra un gateway con “Luz del salón” y “Luz del estudio” detrás, cada una de las cuales puede ir a una habitación distinta como cualquier otra luz.
Enlace descendente: encender una luz desde Apple Home
- Abre nRF Connect en el teléfono y ve a la pestaña Scanner.
- Toca “Luz del salón” en Apple Home.
- El terminal del PC imprime
BLE TX -> 0002, y el gateway emite el comando durante un segundo. - En la lista de escaneo de nRF Connect aparece un dispositivo nuevo con datos de fabricante
0xFFFFy4757 0200 01 xx, que se lee como “el gateway dice: dispositivo 0002, encendido”.
Es posible que el PC use una dirección Bluetooth distinta en cada anuncio. Si cuesta localizarlo en la lista, filtra por datos de fabricante o por intensidad de señal.
Enlace ascendente: el dispositivo informa a Apple Home
- En nRF Connect, crea un anuncio nuevo (Advertiser). En Android, introduce los datos de fabricante
0xFFFF/4456020001; en iPhone, pon como nombre del dispositivoDV0002:1. - Empieza a emitir.
- El terminal del PC imprime
BLE RX <- 0002 (Luz del salón): ON. - La luz del salón aparece encendida en Apple Home.
Esto simula que alguien pulsa el interruptor de la pared. Importa incluso más que el enlace descendente: si el estado del dispositivo no puede volver, lo que muestra Apple Home no coincidirá con la realidad.
Tropiezos por el camino
Nada de esto es complicado, pero hay algunos puntos donde es fácil atascarse la primera vez.
1. El anuncio del teléfono volvía a encender las luces. El teléfono repite el mismo paquete sin parar. Al principio el gateway actualizaba el estado cada vez que recibía uno, así que, tras apagar una luz en Apple Home, el paquete “encendido” del teléfono la volvía a encender un segundo después. La solución fue contar un reporte solo cuando su contenido cambia. Los dispositivos reales necesitan lo mismo: los mensajes repetidos hay que deduplicarlos.
2. El iPhone pone el nombre del dispositivo en la scan response. Cuando un iPhone emite, el nombre del dispositivo no va en el primer paquete de anuncio sino en la scan response. El escaneo pasivo por defecto del PC nunca la ve; hay que usar escaneo activo.
3. No se puede identificar a los dispositivos por su dirección Bluetooth. Los teléfonos y los PC emiten con direcciones aleatorias que cambian periódicamente. Por eso la identidad del dispositivo va dentro del propio anuncio, en esos dos bytes de dirección. Coincide con cómo funciona Mesh: los dispositivos Mesh se identifican por la dirección unicast que se les asigna, no por su MAC.
4. Varios anuncios a la vez interfieren en Windows. Al tocar varias luces seguidas se enviaron varios anuncios al mismo tiempo y se pisaban unos a otros. Ponerlos en cola, uno detrás de otro, lo arregló.
5. Emitir bloqueaba Matter. En Windows cada anuncio tiene que estar activo durante un rato. Al llamarlo directamente dentro del bucle de procesamiento de Matter, cualquier otro comando de Apple Home tenía que esperar mientras tanto. Así que la emisión pasó a su propio hilo.
6. Cambiar el fabricante y el modelo del gateway no obliga a volver a emparejar. Apple Home los lee del gateway y toma los valores nuevos tras un reinicio. Eso sí, los guarda en caché y no se sabe cuándo los actualiza. Si necesitas ver el cambio de inmediato, elimina y vuelve a añadir el gateway, pero ten en cuenta que al eliminarlo también se eliminan todos los dispositivos que hay detrás.
Además, el programa recién compilado era bastante grande al principio. Con optimización de tamaño y sin símbolos de depuración, la compilación release ocupa unos 2.3 MB, que caben de sobra en una placa de gateway.
Lo que demuestra la demo
Demostrado:
- Apple Home reconoce y empareja un gateway escrito por nosotros.
- Los dispositivos puenteados se pueden controlar individualmente en Apple Home.
- Funcionan tanto los comandos descendentes como el estado ascendente.
- Tras añadir o quitar dispositivos, o reiniciar después de una desconexión, Apple Home sigue sincronizado.
Aún sin demostrar:
- Aprovisionamiento, cifrado y red reales de Bluetooth Mesh.
- Si el módulo de Silicon Labs y los dispositivos de Telink funcionan bien juntos.
- Cómo se comporta en una placa de gateway con Linux.
- El comportamiento con decenas o cientos de dispositivos conectados a la vez.
En otras palabras, la mitad Matter está verificada; la mitad Bluetooth Mesh tendrá que esperar al hardware real. El siguiente paso es reemplazar los anuncios simples del PC por un módulo Bluetooth conectado por puerto serie. En el programa del gateway, eso es simplemente otra capa de adaptación.
Reflexiones finales
El mayor beneficio de este paso fue confirmar lo más importante antes de gastar dinero en hardware: Apple Home acepta este gateway. Pase lo que pase más adelante, al menos la capa Matter ya no es sospechosa.
Si estás construyendo un gateway parecido, o quieres poner Matter en marcha antes de tener hardware, con gusto hablamos. Los detalles del código y las lecciones aprendidas están sobre la mesa: linktr.ee/weiyii
Estoy preparando el código de la demo en una versión más pequeña para publicarlo como código abierto. Añadiré el enlace a este artículo cuando salga.