
Sniffer de paquetes y transmisor Bluetooth Low Energy (BLE) tanto para estándar como no estándar (bit crudo), basado en Radio Definida por Software (SDR).
BTLE es una suite de software gratuito y de código abierto de radio definida por software (Software Defined Radio) para Bluetooth Low Energy (BLE), así como un diseño de chip BTLE abierto.
Incluye:
Asegúrate de que el entorno de hardware SDR (controlador/librería) se haya configurado correctamente antes de ejecutar este proyecto.
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
El comando anterior esnifa en el canal 37. Deberías ver muchos paquetes en pantalla si tienes dispositivos BLE (teléfono/tableta/portátil) cerca.
./btle-tools/src/btle_tx 37-DISCOVERY-TxAdd-1-RxAdd-0-AdvA-010203040506-LOCAL_NAME09-SDR/Bluetooth/Low/Energy r500
El comando anterior transmite paquetes de descubrimiento en el canal ADV. Deberías ver un dispositivo con el nombre "SDR/Bluetooth/Low/Energy" en otra aplicación sniffer BLE (como LightBlue).
Para tener una secuencia de operación más rápida en HACKRF, usa lo siguiente:
#define TRANSFER_COUNT 4
#define TRANSFER_BUFFER_SIZE 4096
en hackrf/host/libhackrf/src/hackrf.c. Luego recompila la librería de HACKRF y vuelve a instalarla. No olvides recompilar BTLE para que tome el cambio de la librería de HACKRF.
Además de las herramientas, el directorio matlab incluye evaluación de algoritmos y otros scripts útiles
-h --help
Imprime todos los argumentos/usos.
-c --chan
Número de canal. Valor predeterminado 37 (uno de los canales ADV). Valor válido 0~39 (todos los canales ADV y DATA).
-g --gain
Ganancia de recepción (Rx) en dB. HACKRF rxvga predeterminado 6, válido 0 - 62. bladeRF predeterminado es la ganancia máxima de Rx de 66 dB (válido 0 - 66). La ganancia debe ajustarse con mucho cuidado para asegurar el mejor rendimiento en tus condiciones. Se sugiere probar desde una ganancia baja, porque una ganancia alta siempre causa distorsión severa y no obtienes nada.
-l --lnaGain
Ganancia LNA en dB (solo HackRF). Predeterminado 32, válido 0 - 40. La ganancia debe ajustarse con mucho cuidado para asegurar el mejor rendimiento en tus condiciones.
-b --amp
Habilita el amplificador (solo HackRF). Apagado por defecto.
-a --access
Dirección de acceso. Predeterminada 8e89bed6 para los canales ADV 37, 38, 39. Debes especificar el valor correcto para el canal de datos según el procedimiento de configuración de conexión capturado.
-k --crcinit
Predeterminado 555555 para el canal ADV. Debes especificar el valor correcto para el canal de datos según el procedimiento de configuración de conexión capturado.
-v --verbose
Modo verboso. Imprime más información cuando hay un error.
-r --raw
Modo bruto (raw). Después de detectar la dirección de acceso, imprime los siguientes 42 bytes en bruto (sin desaleatorizar ni analizar).
-f --freq_hz (need argument)
Esta frecuencia (Hz) anulará la configuración de canal (en caso de que alguien quiera trabajar en una frecuencia distinta a BTLE. Más propósito general).
-m --access_mask (need argument)
Si un bit es 1 en esta máscara, el bit correspondiente de la dirección de acceso se tendrá en cuenta en la decisión de existencia de paquete (en caso de que alguien quiera una palabra única más corta/menos densa para la detección de paquetes. Más propósito general).
-o --hop
Esto activará el seguimiento del canal de datos (saltos de frecuencia) después de que la información de configuración del enlace se capture en el paquete ADV_CONNECT_REQ en el canal ADV.
-s --filename
Guarda los paquetes en un archivo pcap.
btle_tx packet1 packet2 ... packetX ... rN
o
btle_tx packets.txt
packets.txt es un archivo de texto que contiene los parámetros de línea de comandos (packet1 packet2 ... rN) como texto. Un parámetro por línea. Una línea que comience con "#" se considera comentario. Consulta el ejemplo de packets.txt.
packetX
es una cadena que describe un paquete. Todos los paquetes componen una secuencia de paquetes.
rN
significa que la secuencia se repetirá N veces. Si no se especifica, la secuencia se enviará solo una vez.
Formato de la cadena packetX
channel_number-packet_type-field-value-field-value-...-Space-value
Cada cadena descriptora comienza con el número de canal BTLE (0~39), seguido de packet_type (RAW/iBeacon/ADV_IND/ADV_DIRECT_IND/etc. Consulta todos los ejemplos de formato AL FINAL: Apéndice ), luego un par campo-valor específico de packet_type y, por último, un par Space-valor (opcional) donde el valor especifica cuántos milisegundos se esperarán después de enviar este paquete.
NO uses el carácter de espacio " " en un descriptor de paquete de línea de comandos. SÍ puedes usar espacios en el descriptor de paquete del archivo txt.
NO uses "-" dentro de cada campo. "-" es un carácter mágico que se usa para separar diferentes campos en el descriptor de paquete.
Abre la app LightBlue (u otro sniffer BLE) en tu iPhone/dispositivo antes de este comando:
./btle-tools/src/btle_tx ../btle-tools/src/packets_discovery.txt
Verás un dispositivo llamado "SDR Bluetooth Low Energy" en tu app LightBlue.
Línea de comando correspondiente:
./btle-tools/src/btle_tx 37-DISCOVERY-TxAdd-1-RxAdd-0-AdvA-010203040506-LOCAL_NAME09-SDR/Bluetooth/Low/Energy r40
Nota: el espacio " " se reemplaza por "/" porque el espacio " " no es compatible en la línea de comandos.
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
Lo anterior simula un procedimiento de establecimiento de conexión entre el dispositivo 1 y el dispositivo 2. Archivo descriptor correspondiente: BTLE/host/btle-tools/src/packets.txt.
El primer paquete -- el dispositivo 1 envía el paquete ADV_IND en el canal 37.
El segundo paquete -- Después de que el dispositivo 2 (en estado de escaneo) recibe el paquete ADV del dispositivo 1, el dispositivo 2 envía el paquete CONNECT_REQ para solicitar el establecimiento de conexión con el dispositivo 1. En este paquete de solicitud se incluyen la dirección MAC del dispositivo 2 (InitA), la dirección MAC de destino (dirección MAC del dispositivo 1, AdvA), la dirección de acceso (AA) que usará el dispositivo 1 en el envío posterior de paquetes en el canal de datos, el valor de inicialización de CRC para el posterior envío de paquetes del dispositivo 1, la información de saltos de canal (ChM y Hop) para el canal de datos usado por el dispositivo 1, etc.
El tercer paquete -- el dispositivo 1 envía una PDU de datos vacía de la capa de enlace en el canal 9 (determinado por el esquema de saltos) de acuerdo con la información de solicitud de conexión recibida del dispositivo 2. ("XX" después del campo "DATA" significa que no hay datos para este campo).
El espacio de tiempo entre paquetes es de 1s (1000 ms). Sintoniza el sniffer de paquetes de TI al canal 37 y se capturará el procedimiento de establecimiento anterior.
./btle-tools/src/btle_tx 37-iBeacon-AdvA-010203040506-UUID-B9407F30F5F8466EAFF925556B57FE6D-Major-0008-Minor-0009-TxPower-C5-Space-100 r100
El comando anterior envía el paquete iBeacon y lo repite 100 veces con un espacio de tiempo de 100 ms. Archivo descriptor correspondiente: BTLE/host/btle-tools/src/packets_ibeacon.txt. Puedes usar un dongle sniffer BLE para ver el paquete.
La cadena descriptora del paquete:
37-iBeacon-AdvA-010203040506-UUID-B9407F30F5F8466EAFF925556B57FE6D-Major-0008-Minor-0009-TxPower-C5-Space-100
37
canal 37 (uno de los canales de publicidad BTLE 37, 38, 39)
iBeacon
palabra clave de formato de paquete que significa formato iBeacon. (En realidad, es el formato ADV_IND en Core_V4.0.pdf)
AdvA
dirección de publicidad (dirección MAC) que se establece como 010203040506 (ver Core_V4.0.pdf)
UUID
aquí la especificamos como el UUID fijo de Estimote: B9407F30F5F8466EAFF925556B57FE6D
Major
número mayor del formato iBeacon. (Aquí es 0008)
Minor
número menor del formato iBeacon. (Aquí es 0009)
Txpower
parámetro de potencia de transmisión del formato iBeacon (Aquí es C5)
Space
Cuántos milisegundos se esperarán después de enviar este paquete. (Aquí son 100 ms)
Consulta una comparación con el sniffer de paquetes de TI aquí: http://sdr-x.github.io/BTLE-SNIFFER/
Consulta demo en video de btle_rx o demo en video de btle_rx (en China) y demo en video 1 de btle_tx o demo en video 2 de btle_tx (en China)
Paquetes RAW: (Todos los bits se enviarán directamente al modulador GFSK)
37-RAW-aad6be898e8dc3ce338c4cb1207730144f9474e0e15eedb378c3bc
Paquetes de canal de PUBLICIDAD (ADVERTISING) (canal 37, por ejemplo):
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
Paquetes de canal de DATOS (DATA) (canal 9, por ejemplo):
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
Paquetes de descubrimiento: (que pueden mostrar cualquier nombre o servicio en una app de escaneo, como 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