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 en serie, respectivamente. Si bien muchos desarrolladores web ya utilizan estas APIs con gran éxito, también existe una demanda creciente de compatibilidad con dispositivos Bluetooth Classic.

Ahora, la API de Web Serial admite la comunicación con los servicios RFCOMM en dispositivos Bluetooth Classic vinculados, incluido el Serial Port Profile (SPP) en Chrome 117 para computadoras de escritorio. Esto abre nuevas posibilidades tanto para desarrolladores web como para los usuarios. Estos son algunos dispositivos reales que pueden beneficiarse con 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 usan Bluetooth SPP para comunicarse con las impresoras de recibos.
  • Los lectores de etiquetas RFID del ganado usan Bluetooth SPP para registrar los movimientos de los animales.

El protocolo Bluetooth RFCOMM

Vuelve a los fines de los 90. Solo tienes que colocar tu Palm Pilot en la base para sincronizar tu calendario para el día siguiente. ¿No sería mejor si pudieras hacerlo de forma inalámbrica? Gracias a la nueva tecnología "Bluetooth", puedes deshacerte de todos esos cables desordenados. ¡La conexión inalámbrica es el futuro! Solo hay un problema: todos los elementos que existen están diseñados para conectarse con un cable RS-232. Por lo tanto, Bluetooth usa el protocolo de comunicación de radiofrecuencia (RFCOMM) para proporcionar esa interfaz a todo el software y hardware existentes.

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

Cambios en la API de Web Serial

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

  • Ahora, Chrome enumera los dispositivos Bluetooth vinculados que exponen una interfaz en serie mediante el perfil estandarizado de puerto en serie clásico de Bluetooth.
  • 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 de puerto no en serie que expone una interfaz serial RFCOMM (consulta los IDs de clase de servicio no estándar).

Puedes obtener información sobre cómo usar la API de Web Serial en el artículo Lee desde un puerto en serie y escribe en él. En este artículo, se da por sentado que tienes conocimientos básicos sobre Bluetooth y se enfoca en los cambios de serie por Bluetooth.

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

// 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 estandarizado de puerto en serie clásico de Bluetooth, algunos usan servicios personalizados basados en RFCOMM. Estos dispositivos tienen un ID de clase de servicio que no se encuentra dentro del rango del UUID de Bluetooth estándar.

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 Bluetooth SIG (es decir, todos los UUID que terminan en "-0000-1000-8000-00805f9b34fb") están bloqueados, excepto el ID de perfil de puerto en serie, ya que Chrome no admite los servicios de 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 en serie de Bluetooth filtrados identificados por los 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, en la información del puerto en serie que se muestra con una llamada a port.getInfo(), se encuentra disponible una clave bluetoothServiceClassId nueva que contiene el ID de clase de servicio asociado con el canal RFCOMM al que está conectado el puerto. Si el puerto en serie está asignado, muestra "00001101-0000-1000-8000-00805f9b34fb" o 0x1101 en su forma abreviada.

const { bluetoothServiceClassId } = port.getInfo();

Ejemplo de caso de uso: Cómo controlar los Pixel Buds Pro

La aplicación 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 compiló 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 les permite a los usuarios controlar varios parámetros 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.

Para probar la aplicación web complementaria 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 web complementaria de Pixel Buds Pro.
Aplicación web complementaria para Pixel Buds Pro.

Recursos

Agradecimientos

Agradecemos a Reilly Grant, Thomas Steiner, Ben Morss y Vincent Scheib por sus opiniones. Imagen hero de Mika Baumeister en Unsplash.