Featured image of post Web 藍牙 API:從瀏覽器連接硬體Featured image of post Web 藍牙 API:從瀏覽器連接硬體

Web 藍牙 API:從瀏覽器連接硬體

Web 藍牙 API 指南,涵蓋 GATT、裝置發現、服務/特性互動、配對、重新連接、安全性和 IoT 範例。

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 參數控制哪些裝置出現在瀏覽器選擇器中。使用 namenamePrefixservices 縮小結果範圍。 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 應用程式。從讀取感測器資料或接收通知等簡單模式開始,然後進行雙向通訊和綁定以實現更高級的用例。