Web Serial の Bluetooth RFCOMM の更新

François Beaufort
François Beaufort

Web Serial API は、デスクトップ版 Chrome 117 以降で、ペア設定済みの Bluetooth クラシック デバイス上の RFCOMM サービスとの通信をサポートしています。たとえば、ワイヤレス イヤホンは RFCOMM を使用して、音声設定とファームウェア アップデートを管理できます。詳しくは、ウェブ上の Bluetooth 経由のシリアル をご覧ください。

デスクトップ版 Chrome 130 以降では、Web Serial API が改善され、ウェブアプリはポートを開かなくても Bluetooth RFCOMM シリアルポートが利用可能かどうかを検出できるようになりました。これにより、ワイヤレス デバイスが意図的に切断された場合に不要な再接続が行われるのを防ぐことができます。

ワイヤレス デバイスがホストの範囲外になると、ウェブアプリによって開かれたワイヤレス シリアルポートは自動的に閉じられます。このような場合、ウェブアプリは SerialPort open() メソッドを使用してポートを再度開こうとする可能性があります。ただし、ワイヤレス デバイスが意図的に切断された場合(オペレーティング システムのコントロール パネルからユーザーが切断した場合など)、ウェブアプリはポートを再度開かないようにして、ワイヤレス デバイスへの再接続を防ぐ必要があります。

ワイヤレス シリアルポートをホストするワイヤレス デバイスの論理接続状態を新しいブール値の SerialPort connected 属性で公開することで、ウェブアプリはこれらのケースを区別し、切断が意図しないものであった場合にのみ再接続できるようになりました。

SerialPort connected 属性は、ポートをホストするワイヤレス デバイスがシステムにアクティブな接続を持っている場合、ワイヤレス シリアルポートに対して true になります。有線シリアルポートの場合、ポートがシステムに物理的に接続されている場合は true になります。

次のスニペットは、利用可能なデバイスを確認し、自動的に接続する方法を示しています。

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.
  }
}

以前は、有線シリアルポートのみが接続イベントと切断イベントをディスパッチしていました。Bluetooth RFCOMM シリアルポートは、ポートが論理的に接続または切断されると、これらのイベントをディスパッチするようになりました。

デモ

SerialPort 接続デモ。

リソース

謝辞

レビューしてくださった Jack Hsieh さんと Reilly Grant さんに感謝いたします。