
Software Defined Radio (SDR) に基づき、標準および非標準 (raw bit) の両方に対応した Bluetooth Low Energy (BLE) パケットスニファ兼トランスミッタ。
BTLEは、無料かつオープンソースのBluetooth Low Energy(BLE)ソフトウェア無線ソフトウェアスイートであり、オープンBTLEチップ設計です。
以下が含まれます:
このプロジェクトを実行する前に、SDRハードウェア環境(ドライバ/ライブラリ)が正しくセットアップされていることを確認してください。
git clone https://github.com/JiaoXianjun/BTLE.git
cd BTLE/host
mkdir build
cd build
cmake ../ (default. for HackRF)
cmake ../ -DUSE_BLADERF=1 (only for bladeRF)
make
./btle-tools/src/btle_rx
上記のコマンドはチャンネル37を傍受します。周囲にBLEデバイス(スマートフォン/タブレット/ノートPC)があれば、画面上に多数のパケットが表示されるはずです。
./btle-tools/src/btle_tx 37-DISCOVERY-TxAdd-1-RxAdd-0-AdvA-010203040506-LOCAL_NAME09-SDR/Bluetooth/Low/Energy r500
上記のコマンドはADVチャンネルでディスカバリーパケットを送信します。別のBLEスニファアプリ(LightBlueなど)に「SDR/Bluetooth/Low/Energy」という名前のデバイスが表示されるはずです。
HACKRFでより高速な操作シーケンスを実現するには、次を使用します:
#define TRANSFER_COUNT 4
#define TRANSFER_BUFFER_SIZE 4096
hackrf/host/libhackrf/src/hackrf.c にこの設定を適用します。次にHACKRFライブラリを再コンパイルし、再インストールしてください。HACKRFライブラリの変更を反映するためにBTLEも再コンパイルすることを忘れないでください。
ツール以外にも、matlabディレクトリにはアルゴリズム評価やその他の便利なスクリプトが含まれています
-h --help
すべての引数/使用方法を表示します。
-c --chan
チャンネル番号。デフォルト値は37(ADVチャンネルの1つ)。有効値は0〜39(すべてのADVおよびDATAチャンネル)。
-g --gain
受信ゲイン(dB)。HACKRF rxvga のデフォルトは6、有効範囲は0〜62。bladeRF のデフォルトは最大受信ゲイン66dB(有効範囲は0〜66)。ゲインは、お使いの環境で最高のパフォーマンスを確保するために非常に慎重に調整する必要があります。高ゲインは常に深刻な歪みを引き起こし何も得られないため、低ゲインから試すことをお勧めします。
-l --lnaGain
LNAゲイン(dB)(HackRFのみ)。デフォルトは32、有効範囲は0〜40。ゲインは、お使いの環境で最高のパフォーマンスを確保するために非常に慎重に調整する必要があります。
-b --amp
アンプを有効にします(HackRFのみ)。デフォルトはオフ。
-a --access
アクセスアドレス。ADVチャンネル37 38 39のデフォルトは8e89bed6。データチャンネルでは、キャプチャした接続確立手順に応じて正しい値を指定する必要があります。
-k --crcinit
ADVチャンネルのデフォルトは555555。データチャンネルでは、キャプチャした接続確立手順に応じて正しい値を指定する必要があります。
-v --verbose
詳細モード。エラー時に詳細な情報を表示します。
-r --raw
rawモード。アクセスアドレスが検出された後、続く生の42バイトを(デスクランブルやパースなしで)表示します。
-f --freq_hz (need argument)
この周波数(Hz)はチャンネル設定を上書きします(BTLE以外の周波数で作業したい場合向け。より汎用的です)。
-m --access_mask (need argument)
このマスクのビットが1の場合、アクセスアドレスの対応するビットがパケット存在判定に使用されます(パケット検出のためにより短い/疎なユニークワードを使用したい場合向け。より汎用的です)。
-o --hop
ADVチャンネルのADV_CONNECT_REQパケットでリンク設定情報がキャプチャされた後、データチャンネルの追跡(周波数ホッピング)を有効にします。
-s --filename
パケットをpcapファイルに保存します。
btle_tx packet1 packet2 ... packetX ... rN
または
btle_tx packets.txt
packets.txt はコマンドラインパラメータ(packet1 packet2 ... rN)のテキストを含むテキストファイルです。1行に1パラメータです。「#」で始まる行はコメントと見なされます。packets.txt の例 を参照してください。
packetX
は1つのパケットを表す文字列です。すべてのパケットがパケットシーケンスを構成します。
rN
は、シーケンスがN回繰り返されることを意味します。指定しない場合、シーケンスは1回だけ送信されます。
packetX 文字列の形式
channel_number-packet_type-field-value-field-value-...-Space-value
各ディスクリプタ文字列はBTLEチャンネル番号(0〜39)で始まり、その後にpacket_type(RAW/iBeacon/ADV_IND/ADV_DIRECT_INDなど。すべての形式例は最後: 付録を参照)が続き、次にpacket_type固有のフィールドと値のペアが続きます。最後にSpaceと値のペア(オプション)があり、値はこのパケット送信後に待機するミリ秒数を指定します。
コマンドラインのパケットディスクリプタでは、スペース文字" "を使用しないでください。txtファイルのパケットディスクリプタではスペースを使用できます。
各フィールド内で「-」を使用しないでください。「-」はパケットディスクリプタ内の異なるフィールドを区切るための特殊文字です。
このコマンドの前に、iPhone/デバイスでLightBlueアプリ(または他のBLEスニファ)を開いてください:
./btle-tools/src/btle_tx ../btle-tools/src/packets_discovery.txt
LightBlueアプリに「SDR Bluetooth Low Energy」という名前のデバイスが表示されます。
対応するコマンドライン:
./btle-tools/src/btle_tx 37-DISCOVERY-TxAdd-1-RxAdd-0-AdvA-010203040506-LOCAL_NAME09-SDR/Bluetooth/Low/Energy r40
注: コマンドラインではスペース" "がサポートされていないため、スペースは「/」に置き換えられています。
btle_tx 37-ADV_IND-TxAdd-0-RxAdd-0-AdvA-90D7EBB19299-AdvData-0201050702031802180418-Space-1 37-CONNECT_REQ-TxAdd-0-RxAdd-0-InitA-001830EA965F-AdvA-90D7EBB19299-AA-60850A1B-CRCInit-A77B22-WinSize-02-WinOffset-000F-Interval-0050-Latency-0000-Timeout-07D0-ChM-1FFFFFFFFF-Hop-9-SCA-5-Space-1 9-LL_DATA-AA-60850A1B-LLID-1-NESN-0-SN-0-MD-0-DATA-XX-CRCInit-A77B22-Space-1
上記は、デバイス1とデバイス2の間の接続確立手順をシミュレートしています。対応するディスクリプタファイルは BTLE/host/btle-tools/src/packets.txt です。
1つ目のパケット -- デバイス1がチャンネル37でADV_INDパケットを送信します。
2つ目のパケット -- デバイス2(スキャン状態)がデバイス1からADVパケットを受信した後、デバイス2はデバイス1との接続設定を要求するためにCONNECT_REQパケットを送信します。この要求パケットには、デバイス2のMACアドレス(InitA)、ターゲットMACアドレス(デバイス1のMACアドレスAdvA)、デバイス1がその後のデータチャンネルでのパケット送信に使用するアクセスアドレス(AA)、その後のデバイス1のパケット送信のためのCRC初期値、デバイス1が使用するデータチャンネルのホッピングチャンネル情報(ChMとHop)などが含まれます。
3つ目のパケット -- デバイス1は、デバイス2から受信した接続要求情報に従って、チャンネル9(ホッピングスキームで決定)で空のリンク層データPDUを送信します。(フィールド「DATA」の後の「XX」はこのフィールドにデータがないことを意味します)
パケット間の時間間隔は1秒(1000ms)です。TIのパケットスニファをチャンネル37に合わせると、上記の確立手順がキャプチャされます。
./btle-tools/src/btle_tx 37-iBeacon-AdvA-010203040506-UUID-B9407F30F5F8466EAFF925556B57FE6D-Major-0008-Minor-0009-TxPower-C5-Space-100 r100
上記のコマンドはiBeaconパケットを送信し、100msの間隔で100回繰り返します。対応するディスクリプタファイルは BTLE/host/btle-tools/src/packets_ibeacon.txt です。BLEスニファドングルを使用してパケットを確認できます。
パケットディスクリプタ文字列:
37-iBeacon-AdvA-010203040506-UUID-B9407F30F5F8466EAFF925556B57FE6D-Major-0008-Minor-0009-TxPower-C5-Space-100
37
チャンネル37(BTLEアドバタイズチャンネル37 38 39の1つ)
iBeacon
iBeacon形式を意味するパケット形式キーワード。(実際にはCore_V4.0.pdfのADV_IND形式です)
AdvA
アドバタイズアドレス(MACアドレス)。010203040506 に設定されています(Core_V4.0.pdf を参照)
UUID
ここではEstimoteの固定UUID: B9407F30F5F8466EAFF925556B57FE6D を指定します。
Major
iBeacon形式のメジャー番号。(ここでは0008)
Minor
iBeacon形式のマイナー番号。(ここでは0009)
Txpower
iBeacon形式の送信電力パラメータ(ここではC5)
Space
このパケット送信後に待機するミリ秒数。(ここでは100ms)
TIのパケットスニファとの比較はこちら: http://sdr-x.github.io/BTLE-SNIFFER/
btle_rx ビデオデモ または btle_rx ビデオデモ(中国国内向け)、および btle_tx ビデオデモ1 または btle_tx ビデオデモ2(中国国内向け)をご覧ください。
RAWパケット: (すべてのビットがGFSK変調器に直接送信されます)
37-RAW-aad6be898e8dc3ce338c4cb1207730144f9474e0e15eedb378c3bc
ADVERTISING CHANNELパケット(例: チャンネル37):
37-IBEACON-AdvA-010203040506-UUID-B9407F30F5F8466EAFF925556B57FE6D-Major-0008-Minor-0009-TxPower-C5
37-ADV_IND-TxAdd-1-RxAdd-0-AdvA-010203040506-AdvData-00112233445566778899AABBCCDDEEFF
37-ADV_DIRECT_IND-TxAdd-1-RxAdd-0-AdvA-010203040506-InitA-0708090A0B0C
37-ADV_NONCONN_IND-TxAdd-1-RxAdd-0-AdvA-010203040506-AdvData-00112233445566778899AABBCCDDEEFF
37-ADV_SCAN_IND-TxAdd-1-RxAdd-0-AdvA-010203040506-AdvData-00112233445566778899AABBCCDDEEFF
37-SCAN_REQ-TxAdd-1-RxAdd-0-ScanA-010203040506-AdvA-0708090A0B0C
37-SCAN_RSP-TxAdd-1-RxAdd-0-AdvA-010203040506-ScanRspData-00112233445566778899AABBCCDDEEFF
37-CONNECT_REQ-TxAdd-1-RxAdd-0-InitA-010203040506-AdvA-0708090A0B0C-AA-01020304-CRCInit-050607-WinSize-08-WinOffset-090A-Interval-0B0C-Latency-0D0E-Timeout-0F00-ChM-0102030405-Hop-3-SCA-4
DATA CHANNELパケット(例: チャンネル9):
9-LL_DATA-AA-60850A1B-LLID-1-NESN-0-SN-0-MD-0-DATA-XX-CRCInit-A77B22
9-LL_CONNECTION_UPDATE_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-WinSize-02-WinOffset-0e0F-Interval-0450-Latency-0607-Timeout-07D0-Instant-eeff-CRCInit-A77B22
9-LL_CHANNEL_MAP_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-ChM-1FFFFFFFFF-Instant-0201-CRCInit-A77B22
9-LL_TERMINATE_IND-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-ErrorCode-12-CRCInit-A77B22
9-LL_ENC_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-Rand-0102030405060708-EDIV-090A-SKDm-0102030405060708-IVm-090A0B0C-CRCInit-A77B22
9-LL_ENC_RSP-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-SKDs-0102030405060708-IVs-01020304-CRCInit-A77B22
9-LL_START_ENC_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-CRCInit-A77B22
9-LL_START_ENC_RSP-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-CRCInit-A77B22
9-LL_UNKNOWN_RSP-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-UnknownType-01-CRCInit-A77B22
9-LL_FEATURE_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-FeatureSet-0102030405060708-CRCInit-A77B22
9-LL_FEATURE_RSP-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-FeatureSet-0102030405060708-CRCInit-A77B22
9-LL_PAUSE_ENC_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-CRCInit-A77B22
9-LL_PAUSE_ENC_RSP-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-CRCInit-A77B22
9-LL_VERSION_IND-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-VersNr-01-CompId-0203-SubVersNr-0405-CRCInit-A77B22
9-LL_REJECT_IND-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-ErrorCode-00-CRCInit-A77B22
ディスカバリーパケット: (LightBlueなどのスキャナーアプリに任意の名前やサービスを表示できます):
37-DISCOVERY-TxAdd-1-RxAdd-0-AdvA-010203040506-FLAGS-02-LOCAL_NAME09-CA-TXPOWER-03-SERVICE03-180D1810-SERVICE_DATA-180D40-MANUF_DATA-0001FF-CONN_INTERVAL-0006 (-SERVICE_SOLI14-1811)
FLAGS: 0x01 LE Limited Discoverable Mode; 0x02 LE General Discoverable Mode
SERVICE:
0x02 16-bit Service UUIDs More 16-bit UUIDs available
0x03 16-bit Service UUIDs Complete list of 16-bit UUIDs available
0x04 32-bit Service UUIDs More 3a2-bit UUIDs available
0x05 32-bit Service UUIDs Complete list of 32-bit UUIDs available
0x06 128-bit Service UUIDs More 128-bit UUIDs available
0x07 128-bit Service UUIDs Complete list of 128-bit UUIDs available