En serie por Bluetooth en la Web

Francisco Beaufort
François Beaufort

La API de Web Bluetooth y la API de Web Serial permiten que las aplicaciones web se comuniquen con dispositivos Bluetooth de bajo consumo (BLE) y dispositivos en serie, respectivamente. Si bien muchos desarrolladores web ya están utilizando estas API con gran éxito, cada vez hay una demanda creciente de compatibilidad con dispositivos Bluetooth Classic.

Ahora, la API de Web Serial admite la comunicación con servicios RFCOMM en dispositivos con Bluetooth clásicos vinculados, incluido el perfil de puerto en serie (SPP) en Chrome 117 para computadoras de escritorio. Esto abre nuevas posibilidades para desarrolladores web y usuarios por igual. Estos son algunos dispositivos reales que pueden beneficiarse de esto:

  • 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 utilizan Bluetooth SPP para comunicarse con las impresoras de recibos.
  • Los lectores de etiquetas RFID para ganado utilizan Bluetooth SPP para registrar los movimientos de los animales.

El protocolo Bluetooth RFCOMM

Vuelve a la década de los 90. Solo tienes que poner tu Palm Pilot en la base para sincronizar el calendario del día siguiente. ¿No sería fantástico si pudieras hacerlo de forma inalámbrica? Con esta nueva tecnología "Bluetooth", puedes deshacerte de todos esos cables desordenados. La conexión 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 de comunicación por 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 el Bluetooth de bajo consumo no cumple hasta el momento. Por eso desarrollamos una integración entre Web Serial, una API para conectarse a dispositivos en serie, y Bluetooth, para habilitar el acceso a estos servicios RFCOMM heredados antes de que los fabricantes migren finalmente a Bluetooth de bajo consumo y que los desarrolladores puedan usar la API de Bluetooth web en su lugar.

Cambios en la API de Web Serial

A partir de la versión 117 de Chrome para computadoras de escritorio, los desarrolladores web ahora pueden comunicarse de manera confiable con dispositivos con Bluetooth clásico vinculados mediante servicios RFCOMM con la API de Web Serial. Esto fue posible gracias a las siguientes actualizaciones en la API de Web Serial:

  • Chrome ahora enumera los dispositivos Bluetooth vinculados que exponen una interfaz en serie mediante el perfil estandarizado del puerto en serie Bluetooth clásico.
  • Chrome ahora puede comunicarse con la interfaz en serie incluso si el sistema operativo no creó un nodo del dispositivo específicamente a través de un puerto en serie emulado.
  • Ahora Chrome puede comunicarse con un servicio de puerto en serie que expone una interfaz en 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 Leer desde un puerto en serie y escribir en él. En este artículo, se da por sentado que tienes conocimientos básicos sobre Bluetooth y se enfoca en los cambios en serie por Bluetooth.

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

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

Aunque la mayoría de los dispositivos exponen la comunicación basada en SPP a través del perfil de puerto en serie clásico de Bluetooth estandarizado, algunos usan servicios personalizados basados en RFCOMM. Estos dispositivos tienen un ID de clase de servicio que no se encuentra en el 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 de base de Bluetooth SIG (es decir, todos los UUID que terminan en "-0000-1000-8000-00805f9b34fb") están bloqueados, excepto el ID de perfil del puerto en serie, ya que Chrome no admite servicios clásicos de Bluetooth, 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 en 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 en serie forma parte de un dispositivo Bluetooth, una nueva clave bluetoothServiceClassId que contiene el ID de clase de servicio asociado con el canal RFCOMM al que está conectado el puerto estará disponible en la información del puerto en serie que se muestra cuando se llama a port.getInfo(). Si se asignó el puerto en serie, se 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 que tenga un navegador web. Se compila con tecnologías de apps web progresivas para 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. De esta manera, los usuarios pueden controlar varias opciones de configuración en sus Pixel Buds Pro, como el control de ruido activo, el ecualizador, la detección de audífonos y las actualizaciones de firmware.

Si quieres probar la aplicación complementaria web de Pixel Buds Pro, visita mypixelbuds.google.com en un dispositivo ChromeOS (próximamente se agregarán otras plataformas).

Captura de pantalla de la app complementaria web de Pixel Buds Pro.
App complementaria web de Pixel Buds Pro.

Recursos

Reconocimientos

Gracias a Reilly Grant, Thomas Steiner, Ben Morss y Vincent Scheib por sus opiniones. Hero image de Mika Baumeister en Unsplash.