
Сниффер пакетов и передатчик Bluetooth Low Energy (BLE) для стандартных и нестандартных (сырых битов) на основе программно-определяемого радио (SDR).
========
BTLE — это бесплатный и открытый программный комплекс Software Defined Radio (SDR) для 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-устройства (телефон/планшет/ноутбук), на экране должно появиться множество пакетов.
./btle-tools/src/btle_tx 37-DISCOVERY-TxAdd-1-RxAdd-0-AdvA-010203040506-LOCAL_NAME09-SDR/Bluetooth/Low/Energy r500
Приведённая выше команда передаёт discovery-пакеты в ADV-канале. В другом BLE-сниффере (например, LightBlue) вы должны увидеть устройство с именем "SDR/Bluetooth/Low/Energy".
Для более быстрой последовательности операций на HACKRF используйте следующее:
#define TRANSFER_COUNT 4
#define TRANSFER_BUFFER_SIZE 4096
в hackrf/host/libhackrf/src/hackrf.c. Затем перекомпилируйте библиотеку HACKRF и переустановите её. Не забудьте перекомпилировать BTLE, чтобы изменения библиотеки HACKRF вступили в силу.
Кроме инструментов, в каталоге matlab содержатся сценарии оценки алгоритмов и другие полезные скрипты
-h --help
Вывести все аргументы/варианты использования.
-c --chan
Номер канала. По умолчанию 37 (один из ADV-каналов). Допустимые значения 0~39 (все ADV- и DATA-каналы).
-g --gain
Коэффициент усиления при приёме (Rx gain) в дБ. У HACKRF rxvga по умолчанию 6, диапазон 0–62. У bladeRF по умолчанию максимальный Rx gain 66 дБ (диапазон 0–66). Усиление следует подбирать очень тщательно, чтобы обеспечить наилучшую производительность в ваших условиях. Рекомендуется начинать с низкого усиления, потому что высокое усиление всегда вызывает сильные искажения и не даёт результата.
-l --lnaGain
Коэффициент усиления LNA в дБ (только HackRF). По умолчанию 32, диапазон 0–40. Усиление следует подбирать очень тщательно, чтобы обеспечить наилучшую производительность в ваших условиях.
-b --amp
Включить усилитель (amp) (только HackRF). По умолчанию выключен.
-a --access
Адрес доступа (access address). По умолчанию 8e89bed6 для ADV-каналов 37, 38, 39. Для data-канала следует указывать правильное значение в соответствии с захваченной процедурой установки соединения.
-k --crcinit
По умолчанию 555555 для ADV-канала. Для data-канала следует указывать правильное значение в соответствии с захваченной процедурой установки соединения.
-v --verbose
Подробный режим. Выводить больше информации при ошибке
-r --raw
Сырой режим. После обнаружения адреса доступа выводить следующие 42 сырых байта (без дескремблирования и разбора)
-f --freq_hz (need argument)
Эта частота (Гц) переопределит настройку канала (если нужно работать на частоте, отличной от BTLE. Более универсально).
-m --access_mask (need argument)
Если в этой маске бит равен 1, соответствующий бит адреса доступа будет учитываться при принятии решения о наличии пакета (если нужна более короткая/разреженная уникальная последовательность для обнаружения пакета. Более универсально).
-o --hop
Включает отслеживание data-канала (перескок частоты) после того, как информация о настройке соединения захвачена в пакете ADV_CONNECT_REQ на ADV-канале.
-s --filename
Сохранять пакеты в pcap-файл.
btle_tx packet1 packet2 ... packetX ... rN
или
btle_tx packets.txt
packets.txt — это текстовый файл, содержащий параметры командной строки (packet1 packet2 ... rN). Один параметр в строке. Строка, начинающаяся с "#", считается комментарием. См. пример packets.txt
packetX
это одна строка, описывающая один пакет. Все пакеты образуют последовательность пакетов.
rN
означает, что последовательность будет повторена N раз. Если параметр не указан, последовательность будет отправлена только один раз.
Формат строки 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-value (необязательная), где значение указывает, сколько миллисекунд ожидать после отправки этого пакета.
НЕ используйте пробел " " в дескрипторе пакета в командной строке. В дескрипторе пакета в txt-файле пробел использовать МОЖНО.
НЕ используйте "-" внутри каждого поля. "-" — это служебный символ, используемый для разделения полей в дескрипторе пакета.
Откройте приложение LightBlue (или другой BLE-сниффер) на iPhone/устройстве перед выполнением этой команды:
./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 отправляет пакет ADV_IND в канале 37.
2-й пакет — после того как устройство 2 (в состоянии сканирования) получает ADV-пакет от устройства 1, устройство 2 отправляет пакет CONNECT_REQ для запроса установления соединения с устройством 1. В этом запросе содержатся MAC-адрес устройства 2 (InitA), целевой MAC-адрес (MAC-адрес устройства 1 — AdvA), адрес доступа (AA), который будет использоваться устройством 1 при последующей отправке пакетов в data-канале, значение инициализации CRC для последующих пакетов устройства 1, информация о перескоке канала (ChM и Hop) для data-канала, используемого устройством 1, и т. д.
3-й пакет — устройство 1 отправляет пустой PDU данных канального уровня в канале 9 (выбранном схемой перескока) в соответствии с информацией о запросе соединения, полученной от устройства 2. ("XX" после поля "DATA" означает, что в этом поле нет данных)
Интервал между пакетами — 1 с (1000 мс). Настройте пакетный сниффер TI на канал 37, и приведённая выше процедура установления соединения будет захвачена.
./btle-tools/src/btle_tx 37-iBeacon-AdvA-010203040506-UUID-B9407F30F5F8466EAFF925556B57FE6D-Major-0008-Minor-0009-TxPower-C5-Space-100 r100
Эта команда отправляет iBeacon-пакет и повторяет его 100 раз с интервалом 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)
iBeacon
ключевое слово формата пакета, означающее формат iBeacon. (На самом деле это формат ADV_IND из Core_V4.0.pdf)
AdvA
Рекламный адрес (MAC-адрес), заданный как 010203040506 (см. Core_V4.0.pdf)
UUID
здесь задаётся фиксированный UUID Estimote: B9407F30F5F8466EAFF925556B57FE6D
Major
старшее число (major) формата iBeacon. (Здесь 0008)
Minor
младшее число (minor) формата iBeacon. (Здесь 0009)
Txpower
параметр мощности передачи формата iBeacon (здесь C5)
Space
Сколько миллисекунд ожидать после отправки этого пакета. (Здесь 100 мс)
Сравнение с пакетным сниффером 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-каналов, например канал 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
Discovery-пакеты: (позволяют отобразить любое имя или сервисы в приложении-сканере, например 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