# BLE GATT Explorer

> 在 Chrome 直接連上 BLE 裝置，瀏覽整棵 GATT 樹：service 與 characteristic 自動對出 SIG 名稱，讀值即時解碼、寫入前二次確認，通知紀錄可匯出 CSV。

- URL: https://bytescope.dev/zh-Hant/ble-explorer/
- Locale: zh-Hant · Also: [en](https://bytescope.dev/en/ble-explorer.md) · [ja](https://bytescope.dev/ja/ble-explorer.md)
- Runs: 在你的瀏覽器本機讀取 BLE GATT service，絕不上傳任何資料。
- Requires: Chrome, Edge or Opera on desktop, and Chrome on Android (Web Bluetooth). Not Firefox, Safari or iOS.
- Updated: 2026-09-08

## What it does

這個工具透過 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。你要嘛在 `filters`／`optionalServices` 裡把 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，不是被動的掃描器。

## Limits

Does not pair Bluetooth Classic devices or sniff traffic between other devices; it browses GATT services on one connected BLE device.

警告：寫入未知的 characteristic 可能會變更裝置設定，或引發裝置重新開機／進入 Bootloader 模式。

## FAQ

### 我連上了，但裝置的 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` 找不到的裝置，瀏覽器也絕對找不到。
