ウェブでの Bluetooth 経由でのシリアル

フランソワ ボーフォール
François Beaufort

Web Bluetooth APIWeb Serial API により、ウェブアプリはそれぞれ Bluetooth Low Energy(BLE)デバイスおよびシリアル デバイスと通信できます。多くのウェブ デベロッパーがすでにこれらの API を使用して大きな成功を収めていますが、Bluetooth クラシック デバイスのサポートに対する需要も高まっています。

デスクトップ版 Chrome 117 のシリアルポート プロファイル(SPP)など、ペア設定された Bluetooth Classic デバイス上の RFCOMM サービスとの通信が Web Serial API でサポートされるようになりました。これにより、ウェブ デベロッパーとユーザーの双方に新たな可能性が開かれます。このメリットが役立つ実機のいくつかを以下に示します。

  • Google Pixel Buds Pro などのワイヤレス イヤフォンは、RFCOMM を使用して音声設定やファームウェアの更新を管理します。
  • モバイル POS システムは、Bluetooth SPP を使用してレシート プリンタと通信します。
  • 家畜用 RFID タグリーダーは、Bluetooth SPP を使用して動物の動きを記録します。

Bluetooth RFCOMM プロトコル

90 年代後半にタイムスリップ。Palm Pilot をクレードルに置くだけで、翌日のカレンダーを同期できます。ワイヤレスで接続できたら便利だと思いませんか?この新しい「Bluetooth」テクノロジーにより、コードから不要なものをすべて取り除くことができます。これからの時代はワイヤレスです。問題が 1 つだけあります。問題は、どれも RS-232 ケーブルで接続できるように設計されているということです。そのため、Bluetooth は無線周波数通信(RFCOMM)プロトコルを使用して、そのインターフェースを既存のすべてのソフトウェアとハードウェアに提供します。

現在でも、RFCOMM サービスは新規および既存のハードウェアに広く使用されています。これにより、これまでのところ Bluetooth Low Energy が満たしていない特定のレイテンシと帯域幅の要件を満たすことができます。そのため Google では、メーカーが最終的に Bluetooth Low Energy に移行する前に、このような従来の RFCOMM サービスへのアクセスを可能にするために、シリアル デバイスに接続するための API である Web Serial と Bluetooth の統合を開発しました。これによりデベロッパーは、代わりに Web Bluetooth API を使用できます。

Web Serial API の変更

パソコン版 Chrome 117 以降、ウェブ デベロッパーは Web Serial API を使用して、RFCOMM サービスを介して、ペア設定された Bluetooth Classic デバイスと確実に通信できるようになります。これは、Web Serial API の以下のアップデートにより可能になりました。

  • Chrome では、標準化された Bluetooth クラシック シリアルポート プロファイルを使用して、シリアル インターフェースを公開するペア設定された Bluetooth デバイスが列挙されるようになりました。
  • オペレーティング システムがエミュレートされたシリアルポートを介してデバイスノードを作成していない場合でも、Chrome はシリアル インターフェースと通信できるようになりました。
  • Chrome は、RFCOMM シリアル インターフェースを公開する Serial Port Service 以外と通信できるようになりました(非標準のサービスクラス ID をご覧ください)。

Web Serial API の使用方法については、シリアルポートからの読み取り / シリアルポートへの書き込みに関する記事をご覧ください。この記事では、Bluetooth に関する基本的な知識があることを前提としています。また、Bluetooth 経由のシリアル変更に焦点を当てて説明します。

フィルタを指定せずに navigator.serial.requestPort() を呼び出すと、ユーザーは Bluetooth 以外のシリアルポート、すでにマッピングされている Bluetooth シリアルポート、標準化された Bluetooth クラシック シリアルポート プロファイルによって提供されるマッピングされていないシリアルポートを選択できます。

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

ほとんどのデバイスは標準化された Bluetooth Classic シリアルポート プロファイルを通じて SPP ベースの通信を公開しますが、一部のデバイスではカスタムの RFCOMM ベースのサービスが使用されます。これらのデバイスには、標準の Bluetooth UUID 範囲以外のサービスクラス ID が設定されています。

これらのカスタム RFCOMM ベースのサービスにアクセスするには、次の例に示すように、allowedBluetoothServiceClassIds リストを navigator.serial.requestPort() に渡す必要があります。

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],
});

Bluetooth SIG ベース UUID を使用するすべてのサービスクラス ID(つまり、「-0000-1000-8000-00805f9b34fb」で終わるすべての UUID)は、シリアルポート プロファイル ID を除き、すべてブロックされます。これは、Chrome は音声や動画などの Bluetooth Classic サービスをサポートしていないためです。

また、navigator.serial.requestPort() を呼び出すときに bluetoothServiceClassId フィルタキーを使用して、サービスクラス ID で識別されるフィルタ済み Bluetooth シリアルポートのリストをユーザーに表示することもできます。以下の例をご覧ください。

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 }],
});

シリアルポートが Bluetooth デバイスの一部である場合、ポートが接続されている RFCOMM チャネルに関連付けられたサービスクラス ID を含む新しい bluetoothServiceClassId キーが、port.getInfo() を呼び出して返されるシリアルポート情報で取得できます。シリアルポートがマッピングされている場合は、「00001101-0000-1000-8000-00805f9b34fb」または短縮形の 0x1101 が返されます。

const { bluetoothServiceClassId } = port.getInfo();

ユースケースの例: Google Pixel Buds Pro を操作する

Google Pixel Buds Pro ウェブ コンパニオン アプリは、ウェブブラウザを使ってあらゆるデバイスから Google Pixel Buds Pro を操作できる新しいウェブアプリです。プログレッシブ ウェブアプリ技術を使用して構築され、即時読み込みを行うようになっています。必要に応じて、他のオペレーティング システム アプリと一緒にインストールすることもできます。

アプリは Web Serial API を使用して Google Pixel Buds Pro と通信します。これにより、アクティブ ノイズ コントロール、イコライザー、装着検知、ファームウェア アップデートなど、Google Pixel Buds Pro のさまざまな設定を制御できます。

Google Pixel Buds Pro ウェブ コンパニオン アプリを試すには、ChromeOS デバイスで mypixelbuds.google.com にアクセスしてください(他のプラットフォームは近日提供予定)。

Google Pixel Buds Pro ウェブ コンパニオン アプリのスクリーンショット。
Google Pixel Buds Pro ウェブ コンパニオン アプリ。

関連情報

謝辞

レビューに協力してくれた Reilly Grant、Thomas Steiner、Ben Morss、Vincent Scheib に感謝します。 Mika Baumeister 氏による Unsplash のヒーロー画像