Actualizaciones de Bluetooth RFCOMM en Web Serial

François Beaufort
François Beaufort

La API de Web Serial admite la comunicación con servicios RFCOMM en dispositivos Bluetooth Classic vinculados desde Chrome 117 en computadoras de escritorio. Por ejemplo, esto permite que los auriculares inalámbricos usen RFCOMM para administrar la configuración de audio y las actualizaciones de firmware. Consulta Serial over Bluetooth en la Web para obtener más información.

A partir de Chrome 130 para computadoras de escritorio, una mejora en la API de Web Serial permite que las apps web detecten cuándo está disponible un puerto en serie Bluetooth RFCOMM sin tener que abrirlo. Esto evita reconexiones innecesarias cuando el dispositivo inalámbrico se desconectó de forma intencional.

Cuando un dispositivo inalámbrico se sale del alcance del host, se cierra automáticamente cualquier puerto en serie inalámbrico que abra una app web. En esos casos, la app web puede intentar volver a abrir el puerto con el método SerialPort open(). Sin embargo, si el dispositivo inalámbrico se desconectó de forma intencional (por ejemplo, el usuario desde el panel de control del sistema operativo), la app web no debe volver a abrir el puerto para evitar volver a conectarse al dispositivo inalámbrico.

Al exponer el estado de conexión lógica del dispositivo inalámbrico que aloja el puerto en serie inalámbrico a través de un nuevo atributo booleano SerialPort connected, las apps web ahora pueden distinguir estos casos y volver a conectarse solo si la desconexión no fue intencional.

El atributo SerialPort connected es verdadero para los puertos en serie inalámbricos si el dispositivo inalámbrico que aloja el puerto tiene alguna conexión activa al sistema. Para los puertos en serie con cable, es verdadero si el puerto está conectado físicamente al sistema.

En el siguiente fragmento, se muestra cómo verificar qué dispositivos están disponibles y, potencialmente, conectarse a ellos automáticamente.

const ports = await navigator.serial.getPorts();
for (const port of ports) {
  if (port.connected) {
    // Automatically try to connect to the Bluetooth device.
    await port.open({ baudRate: 9600 });
  } else {
    // Otherwise, when the port is not logically connected:
    // 1. Prompt the user to make sure the Bluetooth device is available.
    // 2. Show a "connect" button to try opening the port.
  }
}

Anteriormente, solo los puertos en serie con cable enviaban eventos de conexión y desconexión. Los puertos en serie Bluetooth RFCOMM ahora envían estos eventos cuando el puerto se conecta o desconecta de forma lógica.

Demostración

Demostración de SerialPort conectado.

Recursos

Reconocimientos

Gracias a Jack Hsieh y Reilly Grant por sus opiniones.