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 Bluetooth SPP 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 base para sincronizar tu calendario para el día siguiente. ¿No sería genial si pudieras hacerlo de forma inalámbrica? Gracias a la 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 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 Bluetooth Web 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 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 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 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 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 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 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, 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 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 web complementaria 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.