Bagaimana Anak Sekolah Hackathon NASA Membalikkan Rekayasa Gelang Kebugaran untuk Mengontrol Drone



Setahun yang lalu, saya membeli pelacak kebugaran SONY SmartBand SWR10. Seperti kebanyakan pelacak kebugaran lainnya, gadget tidak memainkan peran besar dalam hidup saya, pekerjaan utamanya terletak di atas meja saya. Namun, ini adalah perangkat elektronik yang menarik, dan ketika seorang teman mengundang saya untuk bergabung dengan timnya di hackathon NASA Space Apps , saya memutuskan untuk menggunakan pelacak. Kami memilih bagian Do Not Crash My Drone, di mana kami perlu membuat solusi untuk mengendalikan drone. Diputuskan untuk menggunakan pelacak ini untuk mengendalikan drone.



Segera setelah hackathon dimulai, saya mulai mencari API gelang saya atau alat untuk pengembang, tetapi tidak ada yang ditemukan. Beberapa pengguna forum mengatakan bahwa SONY memiliki SDK eksklusif, yang diberikan kepada pengembang yang memutuskan untuk bekerja sama dengan perusahaan, tetapi di bawah ketentuan hackathon, hanya solusi open-source yang dapat digunakan. Jadi saya memutuskan sudah waktunya untuk membuat antarmuka kontrol drone saya sendiri. Saya meluncurkan aplikasi pelacak dan menyalakan fungsi β€œBluetooth HCI snoop log”. Fitur ini memungkinkan Anda mengendus lalu lintas dan menyimpan dump ke kartu SD.

Saya menemukan log:
~ adb shell echo $ EXTERNAL_STORAGE
/ sdcard
~ adb pull /sdcard/btsnoop_hci.log


dan membukanya di WireShark:



Tampaknya transfer data dilakukan menggunakan protokol Bluetooth Low Energy, atau, lebih tepatnya, melalui protokol GATT . Ini adalah transfer data dua arah, di mana ponsel bertindak sebagai server, "GATT Server", dan periferal menerima "karakteristik GATT", yang dapat berisi data biner apa pun.

Saya memilih UUID pertama (00000208–37cb-11e3–8682–0002a5d5c51b), dan mencarinya di Google. Saya mengharapkan untuk menemukan layanan GATT standar yang biasa, tetapi menemukan sesuatu yang lebih menarik .

Saya memutuskan bahwa kami menemukan repositori Git seseorang yang dibuat oleh orang yang merekayasa balik protokol. Dan ini sebagian benar: proyek mengandung beberapa fungsi kerja, termasuk menghubungkan, merespons gerakan tangan, membaca status baterai, dan menjaga koneksi tetap aktif. Tetapi implementasi accelerometer itu aneh. Saya menambahkan data accelerometer ke MPAndroidChart , dan saya mendapatkan ini:



Meskipun informasi pada lereng benar, nilainya tidak ditampilkan. Setelah mempelajari kode fungsi, ternyata angka presisi tunggal 32-bit berisi tiga nilai 10-bit. Ini masuk akal, karena sebagian besar akselerometer bekerja dengan akurasi 10-bit (seperti kebanyakan ADC, konverter analog-ke-digital). Di sini adalah sumber data, perhatikan dua bit pertama:

Data acc: 0b00101110 0b10110101 0b10111100 0b10111000
acc Data: 0b00111010 0b11110001 0b00011101 0b11101011
Data acc: 0b00111110 0b01110110 0b10100110 0b10011001
acc Data: 0b00001011 0b11011101 0b10111101 0b00111001


Tapi parsing data sebagai tiga nilai 10-bit cukup aneh, setiap beberapa derajat kemiringan berubah nilai 511 untuk -512, dan offset tidak berubah (apalagi, tidak ada masalah integer overflow di sini). Jadi saya memutuskan bahwa SONY mungkin menggunakan beberapa jenis metode pengemasan biner eksklusif, atau perusahaan akan menggunakan pengkodean dan kompresi aritmatika.

Saya mencoba Protobuf, MsgPack, Thrift dan beberapa parser, tetapi tidak ada yang berhasil. Saya hanya punya satu hari untuk menghubungkan perangkat saya ke Wi-Fi drone. Sudah putus asa, saya mencoba DEX mendekompilasi aplikasi perusahaan, dan setelah setengah jam ternyata ini:

// Kira-kira
1: iconst_0 512 iconst_1 1023
2: r1 xor iconst_0
3: istore_0
4: iload_0
5: ifneq 8
6: r1 xor ikonst_1
7: istore_0


if ((data & 0x200)! = 0) {
data = - ((data ^ 1023) +1);
}
return (((float) (-data)) * 15.625f) / GRAVITY_FACTOR;


Paruh pertama [0, 512] terbalik, dan karena itu situasi yang dijelaskan di atas muncul. Saya memperbaikinya menggunakan XOR biasa dan berhasil. Saya menambahkan faktor gravitasi, dengan hasil [-1.1] untuk Β± 1 g, dan semua yang perlu dilakukan selanjutnya adalah menggunakan data accelerometer untuk mengendalikan drone.

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


All Articles