Web 藍牙 API 將硬體互動引入瀏覽器,使 Web 應用程式能夠與藍牙低功耗 (BLE) 裝置進行通訊。這開啟了物聯網用例,例如直接從網頁連接心率監測器、溫度感測器和智慧燈。
網路藍牙的工作原理
Web 藍牙透過 GATT(通用屬性設定檔)協定運行,該協定是 BLE 通訊的標準。在此模型中,BLE 設備充當公開服務和特性的周邊設備,而瀏覽器則充當使用它們的中心。
| 術語 | 描述 | 範例 |
|---|---|---|
| 服務 | 特色集合 | 電池服務(0x180F) |
| 特性 | 具有屬性的資料點 | 電池電量(0x2A19) |
| 描述符 | 有關特徵的元資料 | 單位、描述 |
| UUID | 服務/特性識別碼 | 16 位元標準或 128 位元自訂 |
Web 藍牙需要安全情境(HTTPS 或本機)且必須由使用者手勢啟動。此安全模型可防止後台掃描和未經授權的存取。
設備發現和連接
第一步是從瀏覽器請求設備:
async function connectDevice() {
try {
const device = await navigator.bluetooth.requestDevice({
filters: [{ services: ['battery_service'] }],
optionalServices: ['environmental_sensing'],
});
const server = await device.gatt.connect();
console.log('Connected to:', device.name);
return server;
} catch (error) {
console.error('Connection failed:', error);
}
}
filters 參數控制哪些裝置出現在瀏覽器選擇器中。使用 name、namePrefix 或 services 縮小結果範圍。 optionalServices 授予對非廣告服務的存取權限。
讀取和寫入數據
連接後,存取服務和特徵以交換資料:
async function readBatteryLevel(server) {
const service = await server.getPrimaryService('battery_service');
const characteristic = await service.getCharacteristic('battery_level');
const value = await characteristic.readValue();
return value.getUint8(0);
}
async function writeToCharacteristic(server, serviceUUID, charUUID, data) {
const service = await server.getPrimaryService(serviceUUID);
const characteristic = await service.getCharacteristic(charUUID);
await characteristic.writeValue(new TextEncoder().encode(data));
}
如需即時數據,請訂閱通知:
const characteristic = await service.getCharacteristic('heart_rate_measurement');
await characteristic.startNotifications();
characteristic.addEventListener('characteristicvaluechanged', (event) => {
const value = event.target.value;
// Parse heart rate data from ArrayBuffer
});
重連和連線管理
優雅地處理斷開連接並實現重新連接:
const device = await navigator.bluetooth.requestDevice({ filters: [...] });
device.addEventListener('gattserverdisconnected', () => {
console.log('Device disconnected, attempting reconnect...');
setTimeout(async () => {
if (device.gatt.connected) return;
await device.gatt.connect();
}, 1000);
});
await device.gatt.connect();
使用 device.watchAdvertisements() 偵測附近的設備,從而啟用位置感知功能。
安全考慮
網路藍牙在多個層面上加強安全性。安全上下文要求 (HTTPS) 確保加密傳輸。使用者手勢要求可防止未經授權的掃描。配對可能涉及透過金鑰輸入或數位比較進行身份驗證,具體取決於裝置功能。
使用者先前允許的裝置可以透過 navigator.bluetooth.getDevices() 訪問,但瀏覽器在未經使用者明確同意的情況下絕不會公開裝置。
限制和替代方案
Web 藍牙有重要的限制:它僅支援 BLE(不是經典藍牙),在行動瀏覽器上沒有背景掃描,且 iOS Safari 支援仍處於實驗階段。有效範圍約為 10-30 米,每個資料包的有效負載限制約為 20 位元組。
對於超出 Web 藍牙功能的場景,請考慮 Web Serial(用於序列埠通訊)、Web USB 或透過 WebSocket 橋接的本機配套應用程式。
Web 藍牙 API 支援與實體世界互動的新型 Web 應用程式。從讀取感測器資料或接收通知等簡單模式開始,然後進行雙向通訊和綁定以實現更高級的用例。

