在網路上透過藍牙連線

法蘭索瓦博福
François Beaufort

Web Bluetooth APIWeb Serial API 可讓網頁應用程式分別與藍牙低功耗 (BLE) 裝置和序列裝置進行通訊。雖然許多網頁開發人員已採用這些 API 獲得良好成效,但對於經典藍牙裝置的支援需求也日益增加。

現在 Web Serial API 支援在已配對的藍牙裝置上與 RFCOMM 服務通訊,包括在 Chrome 117 電腦版上使用的序列埠設定檔 (SPP)。為網頁開發人員和使用者開啟了全新的可能性。以下列舉幾個實際可行的裝置:

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

藍牙 RFCOMM 通訊協定

回到 90 年代末期。您把 Palm Pilot 放進座架後,開始同步隔天的日曆。如果能改以無線方式進行,不是很棒嗎?有了這項新的「藍牙」技術,您不必再使用那些混亂的電線。無線技術是未來趨勢!只有一個問題,一切都是為連接 RS-232 傳輸線所設計。因此,藍牙使用射頻通訊 (RFCOMM) 通訊協定,提供這個介面給所有現有的軟體和硬體。

即使如今,新硬體和現有硬體中廣泛使用 RFCOMM 服務。如此一來,就能滿足目前藍牙低功耗技術無法滿足的特定延遲時間和頻寬需求。因此,我們開發了 Web Serial (可連接序列裝置和藍牙的 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],
});

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

您也可以在呼叫 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 上提供。