
Renifleur de paquets et émetteur Bluetooth Low Energy (BLE) pour les communications standard et non standard (bits bruts), basé sur la radio logicielle (SDR).
BTLE est une suite logicielle de radio logicielle (SDR) Bluetooth Low Energy (BLE) gratuite et open-source ainsi qu'une conception de puce BTLE ouverte.
Il comprend :
Assurez-vous que votre environnement matériel SDR (pilote/lib) a été correctement configuré avant d'exécuter ce projet.
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
La commande ci-dessus renifle sur le canal 37. Vous devriez voir de nombreux paquets à l'écran si vous avez des appareils BLE (téléphone/tablette/ordinateur portable) à proximité.
./btle-tools/src/btle_tx 37-DISCOVERY-TxAdd-1-RxAdd-0-AdvA-010203040506-LOCAL_NAME09-SDR/Bluetooth/Low/Energy r500
La commande ci-dessus transmet des paquets de découverte sur le canal ADV. Vous devriez voir un appareil nommé « SDR/Bluetooth/Low/Energy » dans une autre application de reniflage BLE (comme LightBlue).
Pour obtenir une séquence d'opérations plus rapide sur HACKRF, utilisez ce qui suit :
#define TRANSFER_COUNT 4
#define TRANSFER_BUFFER_SIZE 4096
dans hackrf/host/libhackrf/src/hackrf.c. Recompilez ensuite la bibliothèque HACKRF et réinstallez-la. N'oubliez pas de recompiler BTLE pour prendre en compte la modification de la bibliothèque HACKRF.
Outre les outils, le répertoire matlab contient l'évaluation d'algorithmes et d'autres scripts utiles
-h --help
Affiche tous les arguments/utilisations.
-c --chan
Numéro de canal. Valeur par défaut 37 (un des canaux ADV). Valeur valide 0~39 (tous les canaux ADV et DATA).
-g --gain
Gain de réception en dB. HACKRF rxvga par défaut 6, valide 0 - 62. bladeRF par défaut gain rx max 66 dB (valide 0 - 66). Le gain doit être réglé très soigneusement pour garantir les meilleures performances dans votre situation. Il est suggéré de tester à partir d'un gain faible, car un gain élevé provoque toujours une forte distorsion et ne vous apporte rien.
-l --lnaGain
Gain LNA en dB (HackRF uniquement). Défaut 32, valide 0 - 40. Le gain doit être réglé très soigneusement pour garantir les meilleures performances dans votre situation.
-b --amp
Activer l'amplificateur (HackRF uniquement). Désactivé par défaut.
-a --access
Adresse d'accès. Par défaut 8e89bed6 pour les canaux ADV 37 38 39. Vous devez spécifier la valeur correcte pour le canal de données selon la procédure de configuration de connexion capturée.
-k --crcinit
Par défaut 555555 pour le canal ADV. Vous devez spécifier la valeur correcte pour le canal de données selon la procédure de configuration de connexion capturée.
-v --verbose
Mode verbeux. Affiche plus d'informations en cas d'erreur.
-r --raw
Mode brut. Après la détection de l'adresse d'accès, affiche les 42 octets bruts suivants (sans désembrouillage ni analyse).
-f --freq_hz (need argument)
Cette fréquence (Hz) remplacera le réglage du canal (au cas où l'on souhaite travailler sur une fréquence autre que BTLE. Plus polyvalent).
-m --access_mask (need argument)
Si un bit est à 1 dans ce masque, le bit correspondant de l'adresse d'accès sera pris en compte dans la décision de présence de paquet (au cas où l'on souhaite un mot unique plus court/plus clairsemé pour la détection de paquets. Plus polyvalent).
-o --hop
Ceci active le suivi du canal de données (saut de fréquence) après que les informations de configuration de liaison ont été capturées dans le paquet ADV_CONNECT_REQ sur le canal ADV.
-s --filename
Enregistre les paquets dans un fichier pcap.
btle_tx packet1 packet2 ... packetX ... rN
ou
btle_tx packets.txt
packets.txt est un fichier texte qui contient les paramètres de ligne de commande (packet1 packet2 ... rN). Un paramètre par ligne. Une ligne commençant par « # » est considérée comme un commentaire. Voir l'exemple packets.txt.
packetX
est une chaîne qui décrit un paquet. Tous les paquets composent une séquence de paquets.
rN
signifie que la séquence sera répétée N fois. S'il n'est pas spécifié, la séquence ne sera envoyée qu'une seule fois.
Format de la chaîne packetX
channel_number-packet_type-field-value-field-value-...-Space-value
Chaque chaîne descripteur commence par le numéro de canal BTLE (0~39), puis est suivie par le type de paquet (RAW/iBeacon/ADV_IND/ADV_DIRECT_IND/etc. Voir tous les exemples de formats À LA FIN : Annexe ), puis par une paire champ-valeur spécifique au type de paquet, et enfin par une paire Space-valeur (optionnelle) où la valeur indique combien de millisecondes seront attendues après l'envoi de ce paquet.
N'UTILISEZ PAS le caractère espace « » dans un descripteur de paquet en ligne de commande. Vous POUVEZ utiliser l'espace dans le descripteur de paquet du fichier txt.
N'UTILISEZ PAS « - » à l'intérieur de chaque champ. « - » est un caractère magique utilisé pour séparer les différents champs dans le descripteur de paquet.
Ouvrez l'application LightBlue (ou un autre renifleur BLE) sur votre iPhone/appareil avant cette commande :
./btle-tools/src/btle_tx ../btle-tools/src/packets_discovery.txt
Vous verrez un appareil nommé « SDR Bluetooth Low Energy » dans votre application LightBlue.
Ligne de commande correspondante :
./btle-tools/src/btle_tx 37-DISCOVERY-TxAdd-1-RxAdd-0-AdvA-010203040506-LOCAL_NAME09-SDR/Bluetooth/Low/Energy r40
Remarque : le caractère espace « » est remplacé par « / » car l'espace n'est pas pris en charge en ligne de commande.
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
Ce qui précède simule une procédure d'établissement de connexion entre le dispositif 1 et le dispositif 2. Fichier descripteur correspondant BTLE/host/btle-tools/src/packets.txt.
Le 1er paquet -- le dispositif 1 envoie un paquet ADV_IND sur le canal 37.
Le 2e paquet -- après que le dispositif 2 (en état de scan) a reçu le paquet ADV du dispositif 1, le dispositif 2 envoie un paquet CONNECT_REQ pour demander l'établissement de la connexion avec le dispositif 1. Dans ce paquet de demande, il y a l'adresse MAC du dispositif 2 (InitA), l'adresse MAC cible (adresse MAC du dispositif 1, AdvA), l'adresse d'accès (AA) qui sera utilisée par le dispositif 1 lors des envois de paquets suivants sur le canal de données, la valeur d'initialisation CRC pour les paquets suivants du dispositif 1, les informations de saut de canal (ChM et Hop) pour le canal de données utilisé par le dispositif 1, etc.
Le 3e paquet -- le dispositif 1 envoie une PDU de données de couche liaison vide sur le canal 9 (déterminé par le schéma de saut) conformément aux informations de demande de connexion reçues du dispositif 2. (« XX » après le champ « DATA » signifie qu'il n'y a pas de données pour ce champ.)
L'espace temporel entre les paquets est de 1 s (1000 ms). Réglez le renifleur de paquets de TI sur le canal 37, puis la procédure d'établissement ci-dessus sera capturée.
./btle-tools/src/btle_tx 37-iBeacon-AdvA-010203040506-UUID-B9407F30F5F8466EAFF925556B57FE6D-Major-0008-Minor-0009-TxPower-C5-Space-100 r100
La commande ci-dessus envoie un paquet iBeacon et le répète 100 fois avec un espace temporel de 100 ms. Fichier descripteur correspondant BTLE/host/btle-tools/src/packets_ibeacon.txt. Vous pouvez utiliser une clé renifleur BLE pour voir le paquet.
La chaîne descripteur du paquet :
37-iBeacon-AdvA-010203040506-UUID-B9407F30F5F8466EAFF925556B57FE6D-Major-0008-Minor-0009-TxPower-C5-Space-100
37
canal 37 (un des canaux de publicité BTLE 37 38 39)
iBeacon
mot-clé de format de paquet qui signifie format iBeacon. (En réalité, il s'agit du format ADV_IND dans Core_V4.0.pdf)
AdvA
adresse de publicité (adresse MAC) définie comme 010203040506 (voir Core_V4.0.pdf)
UUID
nous la spécifions ici comme UUID fixe d'Estimote : B9407F30F5F8466EAFF925556B57FE6D
Major
numéro majeur du format iBeacon. (Ici, il est 0008)
Minor
numéro mineur du format iBeacon. (Ici, il est 0009)
Txpower
paramètre de puissance d'émission du format iBeacon (ici, il est C5)
Space
combien de millisecondes seront attendues après l'envoi de ce paquet. (Ici, c'est 100 ms)
Voir une comparaison avec le renifleur de paquets de TI ici : http://sdr-x.github.io/BTLE-SNIFFER/
Voir la démo vidéo btle_rx ou la démo vidéo btle_rx (en Chine) et la démo vidéo 1 btle_tx ou la démo vidéo 2 btle_tx (en Chine)
Paquets RAW : (tous les bits seront envoyés directement au modulateur GFSK)
37-RAW-aad6be898e8dc3ce338c4cb1207730144f9474e0e15eedb378c3bc
Paquets des canaux de publicité (canal 37 par exemple) :
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
Paquets des canaux de données (canal 9 par exemple) :
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
Paquets de découverte : (qui peuvent afficher n'importe quel nom ou service dans une application de scan, comme 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 mode découvrable limité LE ; 0x02 mode découvrable général LE SERVICE : 0x02 UUID de service 16 bits, d'autres UUID 16 bits disponibles 0x03 UUID de service 16 bits, liste complète des UUID 16 bits disponibles 0x04 UUID de service 32 bits, d'autres UUID 3a2 bits disponibles 0x05 UUID de service 32 bits, liste complète des UUID 32 bits disponibles 0x06 UUID de service 128 bits, d'autres UUID 128 bits disponibles 0x07 UUID de service 128 bits, liste complète des UUID 128 bits disponibles