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, datos 4456020001. 4456 es DV, 0200 es la dirección 0002, y el 01 final 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:

  1. 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.
  2. Mantiene una tabla de dispositivos: al escribir add 0002 Luz del salón en el terminal se añade una luz. Cada dispositivo aparece en Matter como un dispositivo puenteado independiente.
  3. 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

  1. Abre nRF Connect en el teléfono y ve a la pestaña Scanner.
  2. Toca “Luz del salón” en Apple Home.
  3. El terminal del PC imprime BLE TX -> 0002, y el gateway emite el comando durante un segundo.
  4. En la lista de escaneo de nRF Connect aparece un dispositivo nuevo con datos de fabricante 0xFFFF y 4757 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

  1. En nRF Connect, crea un anuncio nuevo (Advertiser). En Android, introduce los datos de fabricante 0xFFFF / 4456020001; en iPhone, pon como nombre del dispositivo DV0002:1.
  2. Empieza a emitir.
  3. El terminal del PC imprime BLE RX <- 0002 (Luz del salón): ON.
  4. 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.

Leer y compartir con WeChat

Código QR del artículo

Escanea para abrir y comparte desde el menú de WeChat.