كيف يقوم طلاب مدرسة Hackathon School عكس هندسة الهندسة سوار اللياقة للتحكم في طائرة بدون طيار



قبل عام ، اشتريت جهاز تعقب اللياقة البدنية Sony SmartBand SWR10. مثل معظم أجهزة تتبع اللياقة البدنية الأخرى ، لم تلعب الأداة دورًا كبيرًا في حياتي ، حيث كان احتلالها الرئيسي مستلقياً على طاولتي. ومع ذلك ، هذا جهاز إلكتروني مثير للاهتمام ، وعندما دعاني صديق للانضمام إلى فريقه في هاكاثون تطبيقات الفضاء ناسا ، قررت استخدام تعقب. لقد اخترنا قسم "عدم تحطم طائرة بدون طيار" ، حيث كنا بحاجة إلى إيجاد حل للتحكم في الطائرة بدون طيار. تقرر استخدام هذا المقتفي للسيطرة على الطائرة بدون طيار.



بمجرد أن بدأت hackathon ، بدأت في البحث عن API الخاص بسواري أو أدوات المطورين ، ولكن لم يتم العثور على أي شيء. قال بعض مستخدمي المنتدى إن SONY لديها حزمة SDK مملوكة للمطورين الذين يقررون العمل مع الشركة ، ولكن وفقًا لشروط hackathon ، لا يمكن استخدام سوى الحلول مفتوحة المصدر. لذلك قررت أن الوقت قد حان لإنشاء واجهة التحكم في الطائرات بدون طيار الخاصة بي. لقد أطلقت تطبيق التعقب وقمت بتشغيل وظيفة "Bluetooth HCI snoop log". تسمح لك هذه الميزة بتعرف حركة المرور وحفظ التفريغ على بطاقة SD.

لقد وجدت السجل:
~ صدى shell adb $ EXTERNAL_STORAGE
/ sdcard
~ adb pull /sdcard/btsnoop_hci.log


وفتحه في WireShark:



يبدو أن نقل البيانات تم باستخدام بروتوكول Bluetooth منخفض الطاقة ، أو بتعبير أدق عبر بروتوكول الجات . هذا هو نقل البيانات ثنائي الاتجاه ، حيث يعمل الهاتف كخادم "خادم GATT" ، وتتلقى الأجهزة الطرفية "خصائص GATT" ، والتي يمكن أن تحتوي على أي بيانات ثنائية.

لقد اخترت UUID الأول (00000208–37cb-11e3–8682–0002a5d5c51b) ، وبحثت عنه على Google. كنت أتوقع أن أجد خدمة GATT الموحدة المعتادة ، ولكن وجدت شيئًا أكثر إثارة للاهتمام .

قررت أننا اكتشفنا مستودع Git لشخص ما تم إنشاؤه بواسطة شخص قام بتصميم الهندسة العكسية للبروتوكول. وكان هذا صحيحًا جزئيًا: احتوى المشروع على العديد من وظائف العمل ، بما في ذلك الاتصال ، والاستجابة لحركات اليد ، وقراءة حالة البطارية ، والحفاظ على الاتصال نشطًا. لكن تنفيذ مقياس التسارع كان غريباً. أضفت بيانات مقياس التسارع إلى MPAndroidChart ، وحصلت على هذا: على



الرغم من أن المعلومات الموجودة على المنحدرات صحيحة ، لم يتم عرض القيم. بعد دراسة رمز الوظيفة ، اتضح أن رقم الدقة المفردة 32 بت يحتوي على ثلاث قيم 10 بت. هذا أمر منطقي ، لأن معظم مقاييس التسارع تعمل بدقة 10 بت (مثل معظم ADCs ، المحولات التناظرية إلى الرقمية). فيما يلي بيانات المصدر ، انتبه إلى أول بتين:

بيانات لجنة التنسيق الإدارية: 0b00101110 0b10110101 0b10111100 0b10111000
البيانات ACC: 0b00111010 0b11110001 0b00011101 0b11101011
البيانات ACC: 0b00111110 0b01110110 0b10100110 0b10011001
البيانات ACC: 0b00001011 0b11011101 0b10111101 0b00111001


لكن تحليل البيانات كما كانت القيم الثلاث 10 بت غريبة جدا، كل درجة قليلة من الميل تغير قيمة 511 ل -512 ، ولم يتغير الإزاحة (علاوة على ذلك ، لم تكن هناك مشكلة تجاوز عدد صحيح هنا). لذلك قررت أن SONY قد تستخدم نوعًا من طريقة التعبئة الثنائية المسجلة الملكية ، أو أن الشركة ستستخدم الترميز والضغط الحسابي.

لقد جربت Protobuf و MsgPack و Thrift والعديد من المحللين ، ولكن لم ينجح أي شيء. لم يكن لدي سوى يوم واحد لتوصيل جهازي بشبكة Wi-Fi للطائرة بدون طيار. يائسة بالفعل ، حاولت فك تجميع DEX لتطبيق الشركة ، وبعد نصف ساعة اتضح هذا:

//
Roughly 1: iconst_0 512 iconst_1 1023
2: r1 xor iconst_0
3: istore_0
4: iload_0
5: ifneq 8
6: r1 xor iconst_1
7: istore_0


if ((data & 0x200)! = 0) {
data = - ((data ^ 1023) + 1) ؛
}
العودة (((float) (-data)) * 15.625f) / GRAVITY_FACTOR ؛


تم قلب النصف الأول [0 ، 512] ، وبالتالي نشأت الحالة الموصوفة أعلاه. قمت بإصلاحه باستخدام XOR العادي وعملت. أضفت عامل الجاذبية ، مع النتيجة [-1.1] لـ ± 1 جم ، وكل ما يلزم القيام به بعد ذلك هو استخدام بيانات مقياس السرعة للتحكم في الطائرة بدون طيار.

Source: https://habr.com/ru/post/ar394095/


All Articles