在網路上透過藍牙連線

François Beaufort
François Beaufort

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

在 Chrome 117 桌面版中,Web Serial API 現已支援與已配對藍牙經典裝置上的 RFCOMM 服務進行通訊,包括序列埠設定檔 (SPP)。因此網頁程式開發人員和使用者也能開創更多新契機。以下是一些實際可受益的裝置:

  • 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() 可讓使用者選取非藍牙序列埠、已對應的藍牙序列埠,以及由標準化藍牙經典序列埠設定檔提供的任何未對應序列埠。

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

如果序列埠屬於藍牙裝置,系統會提供新的 bluetoothServiceClassId 金鑰 (內含與通訊埠所連線 RFCOMM 管道相關聯的 Service 類別 ID),可透過呼叫 port.getInfo() 傳回的序列埠資訊取得該金鑰。如為對應序列埠,則會傳回「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 提供意見。