
ब्लूटूथ लो एनर्जी (BLE) पैकेट स्निफर और ट्रांसमीटर, सॉफ्टवेयर डिफाइंड रेडियो (SDR) पर आधारित, मानक और गैर-मानक (रॉ बिट) दोनों प्रकार के लिए।
BTLE एक मुफ़्त और ओपन-सोर्स ब्लूटूथ लो एनर्जी (BLE) सॉफ्टवेयर डिफ़ाइंड रेडियो सॉफ्टवेयर सूट और ओपन BTLE चिप डिज़ाइन है।
इसमें शामिल है:
इस प्रोजेक्ट को चलाने से पहले सुनिश्चित करें कि आपका SDR हार्डवेयर वातावरण (driver/lib) सही ढंग से सेट किया गया है।
git clone https://github.com/JiaoXianjun/BTLE.git
cd BTLE/host
mkdir build
cd build
cmake ../ (डिफ़ॉल्ट। HackRF के लिए)
cmake ../ -DUSE_BLADERF=1 (केवल 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
उपरोक्त कमांड 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 चैनलों में से एक)। मान्य मान 0~39 (सभी ADV और DATA चैनल)।
-g --gain
Rx लाभ dB में। HACKRF rxvga डिफ़ॉल्ट 6, मान्य 0 - 62। bladeRF डिफ़ॉल्ट अधिकतम rx लाभ 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
रॉ मोड। एक्सेस एड्रेस का पता लगाने के बाद, अगले 42 रॉ बाइट्स प्रिंट करें (डिस्क्रैम्बलिंग, पार्सिंग के बिना)
-f --freq_hz (तर्क की आवश्यकता है)
यह आवृत्ति (Hz) चैनल सेटिंग को ओवरराइड करेगी (यदि कोई BTLE के अलावा अन्य आवृत्ति पर काम करना चाहता है। अधिक सामान्य उद्देश्य)।
-m --access_mask (तर्क की आवश्यकता है)
यदि इस मास्क में कोई बिट 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) टेक्स्ट होते हैं। एक पैरामीटर प्रति पंक्ति। "#" से शुरू होने वाली पंक्ति को टिप्पणी माना जाता है। 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/आदि। सभी प्रारूप उदाहरण अंत में: परिशिष्ट देखें), फिर field-value जोड़ी जो packet_type विशिष्ट है, अंत में Space-value जोड़ी (वैकल्पिक) होती है जहां मान निर्दिष्ट करता है कि इस पैकेट के भेजे जाने के बाद कितने मिलीसेकंड प्रतीक्षा की जाएगी।
कमांड लाइन पैकेट डिस्क्रिप्टर में स्पेस वर्ण " " का उपयोग न करें। आप 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 चैनल 37 में ADV_IND पैकेट भेजता है।
दूसरा पैकेट -- डिवाइस 2 (स्कैनिंग स्थिति में) डिवाइस 1 से ADV पैकेट प्राप्त करने के बाद, डिवाइस 2 डिवाइस 1 के साथ कनेक्शन सेटअप का अनुरोध करने के लिए CONNECT_REQ पैकेट भेजता है। इस अनुरोध पैकेट में, डिवाइस 2 का MAC पता (InitA), लक्ष्य MAC पता (डिवाइस 1 का MAC पता AdvA), एक्सेस पता (AA) जो डिवाइस 1 द्वारा डेटा चैनल में निम्नलिखित पैकेट भेजने में उपयोग किया जाएगा, डिवाइस 1 द्वारा अगले पैकेट भेजने के लिए CRC आरंभिकरण मान, डिवाइस 1 द्वारा उपयोग किए जाने वाले डेटा चैनल के लिए होपिंग चैनल जानकारी (ChM और Hop), आदि शामिल हैं।
तीसरा पैकेट -- डिवाइस 1 डिवाइस 2 से प्राप्त कनेक्शन अनुरोध जानकारी के अनुसार चैनल 9 (होपिंग योजना द्वारा तय) में एक खाली लिंक लेयर डेटा PDU भेजता है। ("DATA" फ़ील्ड के बाद "XX" का अर्थ है कि इस फ़ील्ड के लिए कोई डेटा नहीं है)
पैकेटों के बीच समय स्थान 1s (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 में से एक)
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
विज्ञापन चैनल पैकेट (उदाहरण के लिए चैनल 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
डेटा चैनल पैकेट (उदाहरण के लिए चैनल 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 सीमित खोज योग्य मोड; 0x02 LE सामान्य खोज योग्य मोड
SERVICE:
0x02 16-बिट सेवा UUID अधिक 16-बिट UUID उपलब्ध
0x03 16-बिट सेवा UUID उपलब्ध 16-बिट UUID की पूरी सूची
0x04 32-बिट सेवा UUID अधिक 32-बिट UUID उपलब्ध
0x05 32-बिट सेवा UUID उपलब्ध 32-बिट UUID की पूरी सूची
0x06 128-बिट सेवा UUID अधिक 128-बिट UUID उपलब्ध
0x07 128-बिट सेवा UUID उपलब्ध 128-बिट UUID की पूरी सूची