ByteScope

BLE GATT Explorer

BLE機器につないでGATTツリーを歩く——読んで、デコードして、書いて、購読する。すべてブラウザの中で。

BLE GATT サービスをブラウザ内でローカルに読み取ります。アップロードは一切ありません。

ブラウザの対応状況を確認中…

標準の GATT サービスおよび定番のベンダー UUID へのアクセスを許可します。

GATT 構造

機器を接続して GATT ツリーを探索します。

GATT ツリーから characteristic を選択すると、値の確認や操作が行えます。

通知ログ (0)

経過時間CharacteristicHexデコード結果
通知イベントはまだ受信されていません。

ブラウザ対応状況

Web Bluetooth (navigator.bluetooth) は Chromium ベースのデスクトップブラウザでサポートされています。Web Bluetooth の対応状況についての詳細

機能ChromeEdgeFirefoxSafari
navigator.bluetooth 機器選択ダイアログChromium デスクトップブラウザ。対応対応非対応非対応
GATT 経由の Read / write / notifyWeb Bluetooth 経由のコア GATT 操作。対応対応非対応非対応
Android 上の Chromium当ラボでは未検証。未検証未検証非対応対象外
Linux (BlueZ)一部のディストリビューションでは BlueZ と実験的なプラットフォームフラグが必要です。一部対応未検証非対応対象外
watchAdvertisements (パッシブスキャン)フラグの有効化が必要。パッシブスキャンはこのツールでは実装されていません。非対応非対応非対応非対応
getDevices() による再接続選択ダイアログなしで再接続するための Chromium API。未検証未検証非対応非対応

検出されたブラウザの機能

  • navigator.bluetooth
  • Bluetooth アダプター利用可能
  • セキュアコンテキスト (https)

このツールについて

本ツールは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は、ページが最初に要求したサービスにしかアクセスを許可しないのです。filtersoptionalServicesでサービスを名指しするか、acceptAllDevicesoptionalServicesのリストを添えるか——「とにかく全部見せて」というモードはこの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クライアントであって、パッシブなスキャナーではないのです。

よくある質問

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

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で見つからない機器は、ブラウザからも決して見つかりません。