कैसे नासा के हैकाथॉन स्कूली बच्चों ने एक ड्रोन को नियंत्रित करने के लिए एक फिटनेस कंगन इंजीनियरिंग उल्टा किया
एक साल पहले, मैंने एक सोनी स्मार्टबैंड SWR10 फिटनेस ट्रैकर खरीदा था। अधिकांश अन्य फिटनेस ट्रैकर्स की तरह, गैजेट ने मेरे जीवन में कोई बड़ी भूमिका नहीं निभाई, इसका मुख्य व्यवसाय मेरी मेज पर पड़ा था। हालांकि, यह एक दिलचस्प इलेक्ट्रॉनिक उपकरण है, और जब एक दोस्त ने मुझे नासा स्पेस एप्स हैकथॉन में अपनी टीम में शामिल होने के लिए आमंत्रित किया , तो मैंने ट्रैकर का उपयोग करने का फैसला किया। हमने Do Not Crash My Drone सेक्शन का चयन किया, जहाँ हमें ड्रोन को नियंत्रित करने के लिए एक समाधान बनाने की आवश्यकता थी। ड्रोन को नियंत्रित करने के लिए इस ट्रैकर का उपयोग करने का निर्णय लिया गया।
जैसे ही हैकाथॉन शुरू हुआ, मैंने डेवलपर्स के लिए अपने कंगन या उपकरणों के एपीआई की तलाश शुरू की, लेकिन कुछ भी नहीं मिला। कुछ मंच उपयोगकर्ताओं ने कहा कि सोनी के पास एक मालिकाना एसडीके है जो डेवलपर्स को दिया जाता है जो कंपनी के साथ काम करने का निर्णय लेते हैं, लेकिन हैकाथॉन की शर्तों के तहत, केवल ओपन-सोर्स समाधान का उपयोग किया जा सकता है। इसलिए मैंने फैसला किया कि यह मेरा अपना ड्रोन कंट्रोल इंटरफेस बनाने का समय है। मैंने ट्रैकर एप्लिकेशन लॉन्च किया और "ब्लूटूथ एचसीआई स्नूप लॉग" फ़ंक्शन चालू किया। इस सुविधा ने आपको ट्रैफ़िक को सूँघने और डंप को एसडी कार्ड में सहेजने की अनुमति दी।मुझे लॉग मिला:~ adb shell echo $ EXTERNAL_STORAGE
/ sdcard
~ adb pull /sdcard/btsnoop_hci.logऔर इसे वायरशर्क में खोला:
ऐसा लगता है कि GATT प्रोटोकॉल के माध्यम से, ब्लूटूथ कम ऊर्जा प्रोटोकॉल का उपयोग करके, या अधिक सटीक रूप से डेटा ट्रांसफर किया गया था । यह एक दो-तरफ़ा डेटा ट्रांसफ़र है, जहाँ फ़ोन एक सर्वर, "GATT सर्वर" के रूप में कार्य करता है, और बाह्य उपकरणों को "GATT विशेषताएँ" प्राप्त होती हैं, जिसमें कोई भी बाइनरी डेटा हो सकता है।मैंने पहला UUID (00000208–37cb-11e3-8682-0002a5d5c51b) चुना, और इसे Google पर खोजा। मैं सामान्य मानकीकृत GATT सेवा को खोजने की उम्मीद कर रहा था, लेकिन कुछ और दिलचस्प पाया ।मैंने तय किया कि हमने किसी व्यक्ति द्वारा बनाए गए गैट भंडार की खोज की, जिसने प्रोटोकॉल को उल्टा-पुल्टा किया। और यह आंशिक रूप से सच था: परियोजना में कई कामकाजी कार्य शामिल थे, जिसमें कनेक्ट करना, हाथ आंदोलनों का जवाब देना, बैटरी की स्थिति पढ़ना और कनेक्शन को सक्रिय रखना शामिल था। लेकिन एक्सेलेरोमीटर का कार्यान्वयन अजीब था। मैंने MPAndroidChart में एक्सेलेरोमीटर डेटा जोड़ा , और मुझे यह मिला:
हालांकि ढलान पर जानकारी सही थी, मान प्रदर्शित नहीं किए गए थे। फ़ंक्शन कोड का अध्ययन करने के बाद, यह पता चला कि 32-बिट एकल-सटीक संख्या में तीन 10-बिट मान थे। यह समझ में आता है, क्योंकि अधिकांश एक्सीलरोमीटर 10-बिट सटीकता (जैसे कि अधिकांश एडीसी, एनालॉग-टू-डिजिटल कन्वर्टर्स) के साथ काम करते हैं। यहाँ स्रोत डेटा है, पहले दो बिट्स पर ध्यान दें:एसीसी डेटा: 0b00101110 0b10110101 0b10111100 0b10111000
एसीसी डेटा: 0b00111010 0b11110001 0b00011101 0b11101011
एसीसी डेटा: 0b00111110 0b01110110 0b10100110 0b10011001
एसीसी डेटा: 0b00001011 0b11011101 0b10111101 0b00111001लेकिन डेटा पार्स करने के रूप में तीन 10 बिट मूल्यों काफी अजीब था, झुकाव के हर कुछ डिग्री करने के लिए मूल्य 511 बदल -512, और ऑफसेट नहीं बदला (इसके अलावा, यहां कोई पूर्णांक ओवरफ़्लो समस्या नहीं थी)। इसलिए मैंने तय किया कि सोनी किसी तरह की मालिकाना बाइनरी पैकेजिंग विधि का उपयोग कर सकती है, या कंपनी अंकगणित कोडिंग और संपीड़न का उपयोग करेगी।मैंने प्रोटोबुफ़, MsgPack, Thrift और कई पार्सर की कोशिश की, लेकिन कुछ भी काम नहीं किया। मेरे पास अपने डिवाइस को ड्रोन के वाई-फाई से जोड़ने के लिए केवल एक दिन था। पहले से ही हताश होकर, मैंने DEX को कंपनी के एप्लिकेशन को डिकम्पोज करने की कोशिश की, और आधे घंटे के बाद यह निकला://
रफली 1: iconst_0 512 iconst_1 1023
2: r1 xor iconst_0
3: .tore_0
4: iload_0
5: ifneq 8
6: r1 xor iconst_1
7 .tt 7अगर ((डेटा & 0x200)! = 0) {
डेटा = - ((डेटा ^ 1023) + 1);
}
वापसी ((फ्लोट) (-डाटा)) * 15.625f) / GRAVITY_FACTOR;पहली छमाही [0, 512] उलटा था, और इसलिए ऊपर वर्णित स्थिति पैदा हुई। मैंने इसे नियमित XOR का उपयोग करके तय किया और इसने काम किया। मैंने for 1 जी के लिए [-1.1] परिणाम के साथ गुरुत्वाकर्षण कारक जोड़ा, और इसके बाद जो कुछ भी किया जाना चाहिए वह ड्रोन को नियंत्रित करने के लिए एक्सीलरोमीटर डेटा का उपयोग करना था।Source: https://habr.com/ru/post/hi394095/
All Articles