En serie por Bluetooth en la Web

François Beaufort
François Beaufort

La API de Web Bluetooth y la API de Web Serial permiten que las apps web se comuniquen con dispositivos Bluetooth de bajo consumo (BLE) y dispositivos seriales, respectivamente. Si bien muchos desarrolladores web ya usan estas APIs con gran éxito, existe una demanda creciente de compatibilidad con dispositivos Bluetooth Classic.

Ahora, la API de Serial Web admite la comunicación con servicios de RFCOMM en dispositivos Bluetooth Classic vinculados, incluido el perfil de puerto serie (SPP) en Chrome 117 para computadoras de escritorio. Esto abre nuevas posibilidades para los desarrolladores y usuarios web. Estos son algunos dispositivos de la vida real que pueden beneficiarse de esta función:

  • Los Pixel Buds Pro y otros auriculares inalámbricos usan RFCOMM para administrar la configuración de audio y las actualizaciones de firmware.
  • Los sistemas de punto de venta móviles usan Bluetooth SPP para comunicarse con impresoras de recibos.
  • Los lectores de etiquetas RFID para ganado usan el SPP de Bluetooth para registrar los movimientos de los animales.

El protocolo RFCOMM de Bluetooth

Regresa a finales de los 90. Solo tienes que colocar tu Palm Pilot en la estación de carga para sincronizar tu calendario del día siguiente. ¿No sería genial si pudieras hacerlo de forma inalámbrica? Con esta nueva tecnología “Bluetooth”, puedes deshacerte de todos esos cables desordenados. La tecnología inalámbrica es el futuro. Solo hay un problema: todo lo que existe está diseñado para conectarse con un cable RS-232. Por lo tanto, Bluetooth usa el protocolo Comunicación de radiofrecuencia (RFCOMM) para proporcionar esa interfaz a todo el software y hardware existentes.

Incluso hoy en día, los servicios de RFCOMM se usan ampliamente en hardware nuevo y existente. Permite cumplir con requisitos específicos de latencia y ancho de banda que Bluetooth de bajo consumo aún no cumple. Por eso, desarrollamos una integración entre Web Serial, una API para conectarse a dispositivos seriales, y Bluetooth, para permitir el acceso a estos servicios heredados de RFCOMM antes de que los fabricantes migren a Bluetooth de baja energía y los desarrolladores puedan usar la API de Web Bluetooth en su lugar.

Cambios en la API de Web Serial

A partir de Chrome 117 para computadoras, los desarrolladores web ahora pueden comunicarse de forma confiable con dispositivos Bluetooth Classic vinculados a través de servicios RFCOMM con la API de Serial Web. Esto fue posible gracias a las siguientes actualizaciones de la API de Web Serial:

  • Chrome ahora enumera los dispositivos Bluetooth vinculados que exponen una interfaz en serie con el perfil de puerto serie Bluetooth clásico estandarizado.
  • Chrome ahora puede comunicarse con la interfaz en serie, incluso si el sistema operativo no creó un nodo de dispositivo a través de un puerto en serie emulado específicamente.
  • Chrome ahora puede comunicarse con un servicio que no sea de puerto serie que exponga una interfaz serie RFCOMM (consulta los IDs de clase de servicio no estándar).

Puedes obtener información para usar la API de Web Serial en el artículo Cómo leer y escribir en un puerto serie. En este artículo, se da por sentado que tienes conocimientos básicos sobre Bluetooth y se enfoca en los cambios de la conexión serie a través de Bluetooth.

Sin especificar ningún filtro, llamar a navigator.serial.requestPort() permite a los usuarios seleccionar puertos serie que no sean Bluetooth, puertos serie Bluetooth que ya se hayan asignado y cualquier puerto serie sin asignar que proporcione el perfil de puerto serie Bluetooth clásico estandarizado.

// Prompt user to select any serial port.
const port = await navigator.serial.requestPort();

Si bien la mayoría de los dispositivos exponen la comunicación basada en SPP a través del perfil de puerto serie Bluetooth clásico estandarizado, algunos usan servicios personalizados basados en RFCOMM. Estos dispositivos tienen un ID de clase de servicio que no está dentro del rango de UUID estándar de Bluetooth.

Debes pasar la lista allowedBluetoothServiceClassIds a navigator.serial.requestPort() para acceder a estos servicios personalizados basados en RFCOMM, como se muestra en el siguiente ejemplo.

const myBluetoothServiceUuid = "01234567-89ab-cdef-0123-456789abcdef";

// Prompt user to select any serial port.
// Access to the custom Bluetooth RFCOMM service above will be allowed.
const port = await navigator.serial.requestPort({
  allowedBluetoothServiceClassIds: [myBluetoothServiceUuid],
});

Ten en cuenta que todos los IDs de clase de servicio que usan el UUID base de Bluetooth SIG (es decir, todos los UUID que terminan en "-0000-1000-8000-00805f9b34fb") están bloqueados, excepto el ID de perfil de puerto serie, ya que Chrome no admite servicios Bluetooth Classic, como audio y video.

También puedes usar la clave de filtro bluetoothServiceClassId cuando llames a navigator.serial.requestPort() para solicitarle al usuario una lista de puertos serie Bluetooth filtrados identificados por IDs de clase de servicio. Consulta el siguiente ejemplo.

const myBluetoothServiceUuid = "01234567-89ab-cdef-0123-456789abcdef";

// Prompt the user to select Bluetooth serial ports with
// the custom Bluetooth RFCOMM service above.
const port = await navigator.serial.requestPort({
  allowedBluetoothServiceClassIds: [myBluetoothServiceUuid],
  filters: [{ bluetoothServiceClassId: myBluetoothServiceUuid }],
});

Si el puerto serie forma parte de un dispositivo Bluetooth, hay disponible una nueva clave bluetoothServiceClassId que contiene el ID de clase de servicio asociado con el canal RFCOMM al que está conectado el puerto en la información del puerto serie que se muestra cuando se llama a port.getInfo(). Si el puerto serie está asignado, muestra "00001101-0000-1000-8000-00805f9b34fb" o 0x1101 en su forma abreviada.

const { bluetoothServiceClassId } = port.getInfo();

Ejemplo de caso de uso: Controla los Pixel Buds Pro

La app web complementaria de Pixel Buds Pro es una nueva app web que permite a los usuarios controlar sus Pixel Buds Pro desde cualquier dispositivo con un navegador web. Se compila con tecnologías de apps web progresivas para brindar una experiencia de carga instantánea y, de manera opcional, se puede instalar junto con otras apps del sistema operativo.

La app usa la API de Web Serial para comunicarse con los Pixel Buds Pro. Esto permite a los usuarios controlar varios parámetros de configuración de sus Pixel Buds Pro, como el control de ruido activo, el ecualizador, la detección intraauricular y las actualizaciones de firmware.

Para probar la app web complementaria de Pixel Buds Pro, visita mypixelbuds.google.com en un dispositivo ChromeOS (próximamente en otras plataformas).

Captura de pantalla de la app complementaria web de Pixel Buds Pro.
Aplicación web complementaria de Pixel Buds Pro.

Recursos

Agradecimientos

Gracias a Reilly Grant, Thomas Steiner, Ben Morss y Vincent Scheib por sus comentarios.