ByteScope

BLE GATT Explorer

連上任何 BLE 裝置,把整棵 GATT 樹走一遍 —— 讀取、解碼、寫入、訂閱,全在瀏覽器裡。

在你的瀏覽器本機讀取 BLE GATT service,絕不上傳任何資料。

正在檢查瀏覽器支援情況…

允許存取標準 GATT service 與常見的廠商 UUID。

GATT 結構

連線裝置以瀏覽其 GATT 結構樹。

在 GATT 結構樹中選擇 characteristic 以檢視其數值與操作。

通知紀錄 (0)

經過時間CharacteristicHex解碼內容
尚未收到任何通知事件。

瀏覽器支援矩陣

以 Chromium 為基礎的桌面版瀏覽器支援 Web Bluetooth (navigator.bluetooth)。進一步了解 Web Bluetooth 支援情況

功能ChromeEdgeFirefoxSafari
navigator.bluetooth 裝置選擇器Chromium 桌面版瀏覽器。支援支援不支援不支援
透過 GATT 進行 Read / write / notify透過 Web Bluetooth 執行的核心 GATT 操作。支援支援不支援不支援
Android 上的 Chromium我們的實驗室未實測。未實測未實測不支援不適用
Linux (BlueZ)在部分發行版上需要 BlueZ 與實驗性平台旗標。部分支援未實測不支援不適用
watchAdvertisements (被動掃描)需透過旗標開啟;本工具未實作被動掃描功能。不支援不支援不支援不支援
getDevices() 重新連線無需彈出選擇器即可重新連線的 Chromium API。未實測未實測不支援不支援

偵測到的瀏覽器功能

  • navigator.bluetooth
  • 藍牙轉接器可用
  • 安全內容 (https)

關於這個工具

這個工具透過 Web Bluetooth API 連上藍牙低功耗(BLE)裝置:按下連線,從瀏覽器的裝置選擇器挑好裝置,頁面就把整棵 GATT 樹攤開 —— service、characteristic、descriptor 一層層列出來,每個 characteristic 都標上 READ / WRITE / NOTIFY / INDICATE 屬性徽章。認得的 UUID 會直接對出 Bluetooth SIG assigned numbers 裡的正式名稱(Battery Service、Heart Rate Measurement、Client Characteristic Configuration),常見的廠商 UUID 像 Nordic UART、Nordic DFU、Improv Wi-Fi 也認得;不認得的就原樣顯示 UUID,絕不亂猜。一切都在你的瀏覽器本機執行,從裝置讀到的資料一個位元組都不會上傳。要注意 Web Bluetooth 是 Chromium 專屬的 API:桌面版 Chrome、Edge、Opera;Android 版 Chrome 照理也能用,但我們沒有實測過;Firefox 和 Safari 完全沒有實作。

為什麼剛連上的裝置看起來是空的

Web Bluetooth 有一個第一次用一定會踩到的設計:requestDevice 只授權頁面一開始就點名要的 service。你要嘛在 filtersoptionalServices 裡把 service 列出來,要嘛用 acceptAllDevices 搭配一份 optionalServices 清單 —— 這個 API 沒有「全部給我看」的模式。這個工具連線時已經預先把一長串標準與常見廠商 service 塞進 optionalServices,所以多數裝置一連上,樹就是滿的;如果你的裝置用自訂 service UUID,記得在挑裝置之前先把 UUID 貼進連線選項,不然那個 service 就是不會出現。一台「看起來沒有任何 service」的裝置,幾乎都是這個原因,不是硬體壞了。

讀取、解碼、寫入、訂閱

讀取一個 characteristic 時,原始位元組會同時以十六進位和 UTF-8 顯示,旁邊排出所有常用的數值解讀 —— uint8/16/32 與帶號整數、little-endian 與 big-endian、浮點數。標準 characteristic 更會整包解碼:Heart Rate Measurement(0x2A37)不再是一串謎樣位元組,而是「72 bpm、偵測到接觸、RR 間隔 781.25 ms」。寫入可以用十六進位或文字、選擇要不要回應,而且一律有一道確認關卡 —— 把錯的位元組寫進錯的 characteristic,是真的會改掉裝置設定的。訂閱 NOTIFY 或 INDICATE 的 characteristic 之後,每筆更新都帶著時間戳記進紀錄,可以暫停/繼續,也能匯出 CSV 或 JSONL。老實交代一個限制:watchAdvertisements(不連線就讀廣播封包和 RSSI)躲在瀏覽器旗標後面,這個工具沒有實作。它是跟手機 App 一樣的 GATT client,不是被動的掃描器。

常見問題

我連上了,但裝置的 service 不見了,為什麼?

Web Bluetooth 只會讓頁面看到連線前就列出來的 service —— 這是 requestDevice 的設計,不是你的裝置有問題。這個工具已經把一長串標準與常見廠商 service 預載進 optionalServices,但自訂的 service UUID 得自己動手加:把 UUID 貼進連線選項、重新連線,service 就會出現。如果手機 App 看得到那個 service、這個頁面卻看不到,答案幾乎每次都是 optionalServices 少列了一條。

可以不連線就掃描附近的裝置或看 RSSI 嗎?

這裡不行。被動掃描 —— 不連線就讀廣播封包和 RSSI —— 是 watchAdvertisements 這個 API,它躲在實驗性瀏覽器旗標後面,這個工具沒有實作;我們寧可把話講明,也不想端出一個要你先改 chrome://flags 才會動的掃描器。這個頁面是連上你從瀏覽器選擇器挑的那一台裝置,以 GATT client 的身分跟它對話,跟手機 App 的做法一模一樣。真要監聽廣播,還是得用 nRF Connect 這類原生 App,或一支專門的 sniffer dongle。

裝置的資料會被上傳嗎?

不會。Web Bluetooth 是瀏覽器和裝置之間的直接對話 —— GATT 樹、你讀到的每個值、紀錄下來的每筆通知,全都留在你的電腦上,CSV/JSONL 匯出也是在本機產生的。網站的分析只會記錄你用過這個工具,絕不會碰任何裝置資料。

對 characteristic 寫入安全嗎?

讀取永遠是安全的 —— 需要敬畏的是寫入。寫下去的位元組會直達裝置:把錯的位元組寫進設定用的 characteristic 會改掉設定,有些 characteristic(例如 DFU 的 control point)甚至能讓裝置重開進 bootloader。所以這裡的每一次寫入都有一道確認關卡,明白列出即將送出的是哪個 characteristic、哪些位元組。如果你正在逆向一台來路不明的裝置,先讀、先訂閱,確認過身分的 characteristic 才寫。

Linux 上的 Chrome 為什麼找不到任何裝置?

Linux 上的 Web Bluetooth 走 BlueZ,Chrome 在這個平台的支援比 Windows 和 macOS 年輕,有些發行版還得先在 chrome://flags 打開實驗性旗標。先確認 bluetooth 服務有在跑(systemctl status bluetooth)、bluetoothctl 找得到你的裝置,BlueZ 太舊就更新 —— bluetoothctl 找不到的裝置,瀏覽器也絕對找不到。