# BLE GATT Explorer

> ChromeからBLE機器に接続し、GATTツリーを丸ごと閲覧。サービスとcharacteristicをSIG名で表示し、値のデコード読み取り、確認付き書き込み、通知ログのCSV書き出し。

- URL: https://bytescope.dev/ja/ble-explorer/
- Locale: ja · Also: [en](https://bytescope.dev/en/ble-explorer.md) · [zh-Hant](https://bytescope.dev/zh-Hant/ble-explorer.md)
- Runs: BLE GATT サービスをブラウザ内でローカルに読み取ります。アップロードは一切ありません。
- 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でBluetooth Low Energy機器に接続します。Connectを押してブラウザの選択ダイアログから機器を選ぶと、GATTツリー全体——サービス、characteristic、ディスクリプタ——を展開し、各characteristicにはREAD / WRITE / NOTIFY / INDICATEのプロパティバッジが付きます。UUIDはBluetooth SIGのassigned numbers（Battery Service、Heart Rate Measurement、Client Characteristic Configuration）に加え、Nordic UART、Nordic DFU、Improv Wi-Fiといった定番のベンダーUUIDまで名前に解決します。知らないUUIDは生の値のまま表示し、推測はしません。処理はすべてブラウザ内で完結し、機器から読んだデータがアップロードされることは一切ありません。なおWeb BluetoothはChromium系専用のAPIです（デスクトップのChrome、Edge、Opera。Android版Chromeも動くはずですが、こちらでは未検証です。FirefoxとSafariはまったく実装していません）。

### 接続したのにサービスが空に見えるのはなぜか

Web Bluetoothには、初見で全員がつまずく仕様がひとつあります。`requestDevice`は、ページが最初に要求したサービスにしかアクセスを許可しないのです。`filters`や`optionalServices`でサービスを名指しするか、`acceptAllDevices`に`optionalServices`のリストを添えるか——「とにかく全部見せて」というモードはこのAPIに存在しません。本ツールは標準サービスと定番ベンダーサービスの長いリストをあらかじめ`optionalServices`に詰めて接続するので、たいていの機器はツリーが埋まった状態で開きます。独自のサービスUUIDを使う機器なら、機器を選ぶ前に接続オプションへそのUUIDを貼り付けてください。貼らなければ、そのサービスはツリーに現れません。「サービスがひとつもない機器」の正体は、ほぼ間違いなくこれで、ハードウェアの故障ではありません。

### 読む、デコードする、書く、購読する

characteristicを読むと、生のバイト列をHEXとUTF-8で表示し、その横にuint8/16/32と符号付き整数、リトル／ビッグエンディアン、floatといった定番の数値解釈を並べます。標準characteristicなら構造まで完全にデコードします。Heart Rate Measurement（`0x2A37`）は、バイトのパズルではなく「72 bpm、接触検出あり、RR間隔781.25 ms」として読めるのです。書き込みはHEXまたはテキストで、レスポンスあり／なしを選べて、必ず確認ステップを挟みます——間違ったバイトを間違ったcharacteristicに書けば、機器の設定が実際に変わってしまうからです。NOTIFYやINDICATEのcharacteristicを購読すれば、届いた更新はすべてタイムスタンプ付きでログに残り、一時停止／再開とCSV・JSONL書き出しに対応します。正直に言っておくべき制限がひとつ。接続せずにアドバタイズパケットやRSSIを読む`watchAdvertisements`はブラウザのフラグの裏にあり、本ツールでは実装していません。これはスマホアプリと同じGATTクライアントであって、パッシブなスキャナーではないのです。

## Limits

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

警告: 未知の characteristic に書き込むと、機器の設定が変更されたり、再起動やブートローダーモードに移行したりする恐れがあります。

## FAQ

### 接続できたのに、機器のサービスが見つかりません。なぜですか？

Web Bluetoothは、接続前にページが列挙したサービスしか見せてくれません。これは`requestDevice`の設計であって、機器の不具合ではありません。本ツールは標準サービスと定番ベンダーサービスを`optionalServices`にあらかじめ詰めていますが、独自のサービスUUIDだけは手で足す必要があります。接続オプションにUUIDを貼り付けて再接続すれば、そのサービスが現れます。スマホアプリでは見えるのにこのページでは見えない——そういうときの答えは、ほぼ毎回`optionalServices`の記載漏れです。

### 接続せずに周囲の機器をスキャンしたり、RSSIを見たりできますか？

本ツールではできません。接続なしでアドバタイズパケットやRSSIを読むパッシブスキャンは`watchAdvertisements`というAPIですが、実験的なブラウザフラグの裏にあり、本ツールには実装していません。`chrome://flags`をいじった人にしか動かないスキャナーを出すより、できないと正直に言うほうを選びました。このページは、ブラウザの選択ダイアログで選んだ1台にGATTクライアントとして接続します。スマホアプリとまったく同じ振る舞いです。アドバタイズを傍受したいなら、いまでもnRF Connectのようなネイティブアプリか、専用のスニファドングルが正解です。

### 機器のデータがどこかにアップロードされますか？

いいえ。Web Bluetoothはブラウザと機器の間で直接やり取りします。GATTツリーも、読んだ値も、ログに残した通知も、すべて手元のマシンに留まり、CSV／JSONLの書き出しもローカルで生成されます。サイト側の解析はツールを使ったという事実だけを記録し、機器のデータには一切触れません。

### characteristicへの書き込みは安全ですか？

読み取りは常に安全です。敬意を払うべきは書き込みのほうです。書き込んだバイトはそのまま機器に届きます。設定用のcharacteristicに間違ったバイトを書けば設定が変わりますし、characteristicによっては（たとえばDFUのコントロールポイント）機器をブートローダーに再起動させることもあります。だから本ツールの書き込みには必ず確認ステップがあり、どのcharacteristicへどのバイトを送ろうとしているかをその場で見せます。素性の分からない機器をリバースエンジニアリングしているなら、まず読み取りと購読から始めて、正体を突き止めたcharacteristicにだけ書いてください。

### LinuxのChromeで機器がひとつも見つからないのはなぜですか？

LinuxのWeb BluetoothはBlueZ経由で動き、WindowsやmacOSに比べるとChromeの対応はまだ若く、ディストリビューションによっては`chrome://flags`の実験的フラグを有効にする必要があります。まずbluetoothサービスが動いているか（`systemctl status bluetooth`）、`bluetoothctl`からその機器が見えるかを確認し、BlueZが古ければ更新してください。`bluetoothctl`で見つからない機器は、ブラウザからも決して見つかりません。
