Web Bluetooth API と Web Serial API を使用すると、ウェブアプリが Bluetooth Low Energy(BLE)デバイスまたはシリアル デバイスと通信できるようになります。多くのウェブ デベロッパーはすでにこれらの API を使用して大きな成功を収めていますが、Bluetooth クラシック デバイスのサポートに対する需要も高まっています。
このたび、ウェブ シリアル API が、ペア設定された Bluetooth クラシック デバイスの RFCOMM サービスとの通信をサポートするようになりました。これには、パソコン版 Chrome 117 のシリアルポート プロファイル(SPP)が含まれます。これにより、ウェブ デベロッパーにもユーザーにも新たな可能性が開かれます。このことからメリットが得られるデバイスをいくつか紹介します。
- Google Pixel Buds Pro やその他のワイヤレス イヤホンは、RFCOMM を使用して音声設定とファームウェアの更新を管理します。
- モバイル POS システムは、Bluetooth SPP を使用してレシート プリンタと通信します。
- 家畜用 RFID タグリーダーは、Bluetooth SPP を使用して動物の動きを記録します。
Bluetooth RFCOMM プロトコル
90 年代後半の思い出を振り返る。Palm Pilot をクレードルに入れるだけで、翌日のカレンダーを同期できます。代わりに、ワイヤレスでデータを転送できたら便利だと思いませんか?この新しい「Bluetooth」ではテクノロジーを使って 散らかったコードを一掃できるのです未来のワイヤレスに。ただし、すべてが RS-232 ケーブルで接続するように設計されています。そのため、Bluetooth は高周波通信(RFCOMM)プロトコルを使用して、既存のすべてのソフトウェアとハードウェアにこのインターフェースを提供します。
現在でも、RFCOMM サービスは新規および既存のハードウェアで広く使用されています。これにより、これまでの Bluetooth Low Energy では実現できない特定のレイテンシと帯域幅の要件を満たすことができます。そこで Google は、シリアル デバイスに接続するための API であるウェブ シリアルと Bluetooth の統合を開発し、メーカーが最終的に Bluetooth Low Energy に移行し、デベロッパーが代わりに Web Bluetooth API を使用できるようにする前に、これらの従来の RFCOMM サービスにアクセスできるようにしました。
Web Serial API の変更
パソコン版 Chrome 117 以降、ウェブ デベロッパーは Web Serial API を使用して、RFCOMM サービスを介して、ペア設定された Bluetooth クラシック デバイスと確実に通信できるようになりました。これは、Web Serial API の以下のアップデートによって可能になりました。
- 標準化された Bluetooth クラシック シリアル ポート プロファイルを使用して、シリアル インターフェースを公開しているペア設定された Bluetooth デバイスが列挙されるようになりました。
- オペレーティング システムがエミュレートされたシリアルポートを介してデバイスノードを作成していない場合でも、Chrome はシリアル インターフェースと通信できるようになりました。
- Chrome は、RFCOMM シリアル インターフェースを公開する非シリアルポート サービスと通信できるようになりました(標準以外のサービスクラス 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 クラシック シリアル ポート プロファイルを介して SPP ベースの通信を公開していますが、一部のデバイスは RFCOMM ベースのカスタム サービスを使用しています。これらのデバイスのサービスクラス ID は、標準の Bluetooth UUID の範囲にありません。
これらのカスタム 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 Base UUID を使用するすべてのサービスクラス ID(「-0000-1000-8000-00805f9b34fb」で終わるすべての UUID)は、シリアルポート プロファイル ID を除きブロックされます。Chrome は音声や動画などの Bluetooth クラシック サービスをサポートしていないためです。
また、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 にアクセスします(他のプラットフォームは近日提供予定)。
<ph type="x-smartling-placeholder">リソース
謝辞
Reilly Grant、Thomas Steiner、Ben Morss、Vincent Scheib のレビューに感謝します。 ヒーロー画像(Mika Baumeister、Unsplash より)。