在網路上透過藍牙連線

François Beaufort
François Beaufort

Web Bluetooth APIWeb Serial API 可分別讓網路應用程式與藍牙低功耗 (BLE) 裝置和序列裝置通訊。雖然許多網頁開發人員已成功使用這些 API,但對支援傳統藍牙裝置的需求也日益增加。

在 Chrome 117 桌面版中,Web Serial API 現已支援與已配對的藍牙經典裝置 (包括序列埠設定檔 (SPP)) 的 RFCOMM 服務進行通訊。這為網路開發人員和使用者開啟了新的可能性。以下是一些實際可受益的裝置:

  • Pixel Buds Pro 和其他無線耳塞式耳機會使用 RFCOMM 管理音訊設定和韌體更新。
  • 行動銷售點系統會使用藍牙 SPP 與收據印表機通訊。
  • 畜牧業 RFID 標籤讀取器會使用藍牙 SPP 記錄動物移動情形。

藍牙 RFCOMM 通訊協定

讓你重溫 90 年代末期的感覺。只要將 Palm Pilot 放入座架,即可同步隔天的日曆。這樣一來,你就能以無線方式進行這項操作,有了這項全新的「藍牙」技術,你就能擺脫所有雜亂的線材。無線是未來!只有一個問題,所有現有的裝置都必須透過 RS-232 傳輸線連接。因此,藍牙會使用無線電頻率通訊 (RFCOMM) 協定,為所有現有軟硬體提供該介面。

即便在今天,RFCOMM 服務仍廣泛用於新舊硬體。這項技術可滿足特定的延遲時間和頻寬需求,而藍牙低功耗目前無法達到這類需求。因此,我們開發了 Web Serial 與藍牙的整合功能,讓開發人員在廠商最終遷移至低功耗藍牙 (Bluetooth Low Energy) 前,可以使用這些舊版 RFCOMM 服務,並改用 Web Bluetooth API。

Web Serial API 異動

從 Chrome 117 版的電腦版開始,網頁開發人員現在可以使用 Web Serial API,透過 RFCOMM 服務與已配對的傳統藍牙裝置進行可靠通訊。這項功能是透過下列 Web Serial API 更新實現:

  • Chrome 現已列舉配對的藍牙裝置,這些裝置會使用標準化的藍牙傳統序列埠設定檔公開序列介面。
  • 即使作業系統未透過模擬序列埠建立 裝置節點,Chrome 也能與序列介面通訊。
  • Chrome 現可與公開 RFCOMM 序列介面的非序列埠服務進行通訊 (請參閱「非標準服務類別 ID」)。

如要瞭解如何使用 Web Serial API,請參閱「從序列埠讀取及寫入資料」一文。本文假設您具備藍牙的基本知識,並著重於透過藍牙的序列通訊變更。

在不指定任何篩選器的情況下,呼叫 navigator.serial.requestPort() 可讓使用者選取非藍牙序列埠、已對應的藍牙序列埠,以及標準化藍牙 Classic 序列埠設定檔提供的任何未對應序列埠。

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

雖然大多數裝置會透過標準化的藍牙 Classic 序列埠設定檔提供 SPP 通訊,但有些裝置會使用自訂 RFCOMM 服務。這些裝置的服務類別 ID 不在標準藍牙 UUID 範圍內。

您必須將 allowedBluetoothServiceClassIds 清單傳遞至 navigator.serial.requestPort(),才能存取這些自訂的 RFCOMM 服務,如以下範例所示。

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 識別的篩選過的藍牙序列埠清單。請參閱下方的範例。

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

如果序列埠是藍牙裝置的一部分,則在呼叫 port.getInfo() 傳回的序列埠資訊中,會提供新的 bluetoothServiceClassId 鍵,其中包含與連接埠連結的 RFCOMM 通道相關聯的服務類別 ID。如果已對應序列埠,則會傳回「00001101-0000-1000-8000-00805f9b34fb」或簡寫的「0x1101」。

const { bluetoothServiceClassId } = port.getInfo();

使用情境範例:控制 Pixel Buds Pro

Pixel Buds Pro 網頁版隨附應用程式是一款全新的網頁應用程式,可讓使用者透過任何裝置的網路瀏覽器控制 Pixel Buds Pro。這個應用程式採用漸進式網頁應用程式技術建構,可提供即時載入體驗,並可視需要與其他作業系統應用程式一併安裝。

應用程式會使用 Web Serial API 與 Pixel Buds Pro 通訊。這可讓使用者控制 Pixel Buds Pro 的各種設定,例如主動降噪、均衡器、入耳偵測和韌體更新。

如要試用 Pixel Buds Pro 網頁版隨附應用程式,請在 ChromeOS 裝置上前往 mypixelbuds.google.com (其他平台即將推出)。

Pixel Buds Pro 網頁版隨附應用程式的螢幕截圖。
Pixel Buds Pro 網頁版隨附應用程式。

資源

特別銘謝

感謝 Reilly Grant、Thomas Steiner、Ben Morss 和 Vincent Scheib 提供意見。