
أداة التقاط وإرسال حزم لبلوتوث منخفض الطاقة (BLE) للتنسيقات القياسية وغير القياسية (البت الخام)، استنادًا إلى الراديو المعرَّف بالبرمجيات (SDR).
BTLE هي حزمة برمجيات حرة ومفتوحة المصدر للراديو المعرف بالبرمجيات (SDR) لتقنية البلوتوث منخفض الطاقة (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
الأمر أعلاه يرسل حزم الاكتشاف على قناة ADV. يجب أن ترى جهازًا باسم "SDR/Bluetooth/Low/Energy" في تطبيق تقاط BLE آخر (مثل LightBlue).
للحصول على تسلسل تشغيل أسرع على 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
كسب الاستقبال بوحدة dB. كسب rxvga الافتراضي لـ HACKRF هو 6، والنطاق الصالح 0 - 62. الافتراضي لـ bladeRF هو أقصى كسب استقبال 66dB (النطاق الصالح 0 - 66). يجب ضبط الكسب بعناية فائقة لضمان أفضل أداء في ظروفك. يُنصح بالاختبار بدءًا من كسب منخفض، لأن الكسب المرتفع يسبب دائمًا تشوهًا شديدًا ولن يفيدك بشيء.
-l --lnaGain
كسب LNA بوحدة dB (خاص بـ HackRF فقط). الافتراضي 32، والنطاق الصالح 0 - 40. يجب ضبط الكسب بعناية فائقة لضمان أفضل أداء في ظروفك.
-b --amp
تفعيل مكبر الإشارة (خاص بـ HackRF فقط). الافتراضي: معطّل.
-a --access
عنوان الوصول. الافتراضي 8e89bed6 لقنوات ADV 37 و38 و39. يجب عليك تحديد القيمة الصحيحة لقناة البيانات وفقًا لإجراء إعداد الاتصال الذي تم التقاطه.
-k --crcinit
الافتراضي 555555 لقناة ADV. يجب عليك تحديد القيمة الصحيحة لقناة البيانات وفقًا لإجراء إعداد الاتصال الذي تم التقاطه.
-v --verbose
الوضع التفصيلي (Verbose). طباعة مزيد من المعلومات عند وجود خطأ.
-r --raw
الوضع الخام. بعد اكتشاف عنوان الوصول، اطبع الـ 42 بايتًا الخام التالية (بدون إزالة التشويش أو التحليل).
-f --freq_hz (need argument)
هذا التردد (بالهرتز) سيتجاوز إعداد القناة (في حال أراد شخص العمل على تردد آخر غير BTLE. لأغراض أكثر عمومية).
-m --access_mask (need argument)
إذا كانت إحدى البتات في هذا القناع تساوي 1، فسيتم تضمين البت المقابل في عنوان الوصول في قرار وجود الحزمة (في حال أراد شخص كلمة فريدة أقصر/أقل كثافة لاكتشاف الحزم. لأغراض أكثر عمومية).
-o --hop
سيؤدي هذا إلى تفعيل تتبّع قناة البيانات (القفز الترددي) بعد التقاط معلومات إعداد الارتباط في حزمة 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/إلخ. اطّلع على جميع أمثلة التنسيقات في النهاية: الملحق )، ثم يليها زوج حقل-قيمة خاص بنوع الحزمة، وفي النهاية يوجد زوج Space-قيمة (اختياري) حيث تحدد القيمة عدد الميلي ثانية التي سيُنتظَر بعد إرسال هذه الحزمة.
لا تستخدم حرف المسافة " " في واصف الحزمة داخل سطر الأوامر. يمكنك استخدام المسافة في واصف الحزمة داخل ملف txt.
لا تستخدم "-" داخل أي حقل. "-" هو حرف سحري يُستخدم لفصل الحقول المختلفة في واصف الحزمة.
افتح تطبيق LightBlue (أو أداة تقاط BLE أخرى) على iPhone/جهازك قبل تنفيذ هذا الأمر:
./btle-tools/src/btle_tx ../btle-tools/src/packets_discovery.txt
سترى جهازًا باسم "SDR Bluetooth Low Energy" في تطبيق LightBlue.
سطر الأوامر المقابل:
./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 حزمة ADV_IND على القناة 37.
الحزمة الثانية -- بعد أن يستقبل الجهاز 2 (في حالة المسح) حزمة ADV من الجهاز 1، يرسل الجهاز 2 حزمة CONNECT_REQ لطلب إعداد اتصال مع الجهاز 1. تحتوي حزمة الطلب هذه على عنوان MAC للجهاز 2 (InitA)، وعنوان MAC الهدف (عنوان MAC للجهاز 1 AdvA)، وعنوان الوصول (AA) الذي سيستخدمه الجهاز 1 في إرسال الحزم اللاحقة على قناة البيانات، وقيمة تهيئة CRC للحزم اللاحقة للجهاز 1، ومعلومات القناة ذات القفز الترددي (ChM وHop) لقناة البيانات التي يستخدمها الجهاز 1، وغير ذلك.
الحزمة الثالثة -- يرسل الجهاز 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 (في الصين) وعرض فيديو 1 لـ btle_tx أو عرض فيديو 2 لـ btle_tx (في الصين)
حزم 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
حزم الاكتشاف: (والتي يمكنها إظهار أي اسم أو خدمات في تطبيق الماسح الضوئي، مثل 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 معرّفات UUID للخدمات 16-بت، مزيد من معرّفات UUID 16-بت متاحة 0x03 معرّفات UUID للخدمات 16-بت، القائمة الكاملة لمعرّفات UUID 16-بت المتاحة 0x04 معرّفات UUID للخدمات 32-بت، مزيد من معرّفات UUID 32-بت متاحة 0x05 معرّفات UUID للخدمات 32-بت، القائمة الكاملة لمعرّفات UUID 32-بت المتاحة 0x06 معرّفات UUID للخدمات 128-بت، مزيد من معرّفات UUID 128-بت متاحة 0x07 معرّفات UUID للخدمات 128-بت، القائمة الكاملة لمعرّفات UUID 128-بت المتاحة