在網路上透過藍牙連線

François Beaufort
François Beaufort

Web Bluetooth APIWeb Serial API 可讓網頁應用程式分別與藍牙低功耗 (BLE) 裝置和序列裝置進行通訊。儘管許多網頁程式開發人員已運用這些 API 大獲成功,但對於藍牙經典裝置的需求也越來越高。

現在,Web Serial API 支援在已配對的藍牙經典裝置上 (包括電腦版 Chrome 117 的序列埠設定檔) 與 RFCOMM 服務通訊。因此網頁程式開發人員和使用者也能開創更多新契機。以下幾種實體裝置都能享受這項功能:

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

藍牙 RFCOMM 通訊協定

回顧 90 年代晚期,您剛剛將 Palm Pilot 放入充電座,以便同步次日的日曆。如果你可以改用無線更新,那不是比較好嗎?透過這個新的「藍牙」功能完全消弭那些混亂的線路了。無線是未來趨勢!它只有一個問題,其餘所有功能都是透過 RS-232 傳輸線連接。因此藍牙採用射頻通訊 (RFCOMM) 通訊協定,為現有的所有軟體和硬體提供該介面。

如今,RFCOMM 服務已廣泛用於新硬體和現有硬體。可滿足藍牙低功耗技術目前不符合的特定延遲時間和頻寬需求。因此,我們開發了 Web Serial (可連線至序列裝置的 API) 和藍牙功能整合的 API,以便在製造商最終改用藍牙低功耗服務之前,支援這些舊版 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();

雖然大多數裝置都會透過標準化藍牙經典序列埠設定檔公開 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],
});

請注意,除了序列埠設定檔 ID 外,所有使用 Bluetooth SIG Base UUID (也就是結尾為「-0000-1000-8000-00805f9b34fb」) 的服務類別 ID 都會遭到封鎖,因為 Chrome 不支援音訊和影片等經典藍牙服務。

您也可以在呼叫 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 的評論。 主頁橫幅由 Mika BaumeisterUnsplash 提供。