Accelerometer - alias G-sensor - adalah salah satu sensor yang paling umum saat ini. Anda dapat menemukannya di hampir setiap gadget modern. Accelerometer melakukan tugas yang cukup sederhana - mengukur akselerasi perangkat. Mari kita lihat bagaimana dia melakukannya - mari kita menganalisis mekanisme sensor Android API menggunakan contoh tugas No. 7 dari tahap online NeoQUEST-2019.
Menurut legenda, kami diberi 2 file:
7.apk dan
7.txt . Kesimpulan berikut dapat diambil dari teks tugas (dan semua tugas masih tersedia di
sini ):
7.apk - program
enkripsi yang entah bagaimana menggunakan pengaturan akselerometer perangkat;
7.txt - cryptogram yang dihasilkan oleh encoder. Berikut ini tertulis di dalamnya:
[1749054104147639] [2.07154922] [10.001905] [4.5387093] [1749056073889025] [5.7193284] [8.221763] [0.01391537] [1749058029180773] [4.684068] [12,05614] [0,0377285] [1749060105291613] [4,6900544] [6,9307165] [4,7094293] [1749062123327502 ] [4.4682417] [7.512769] [6.037215] [1749067640096818] [1.0396843] [8.798672] [4.9335976] [1749070016073380] [2.3173676] [10.180047] [4.948362] [4.9483623679582] [1260] 2.48394698] [10.834006] [6.306282] [1749075827770391] [0.2795044] [13.279829] [0.19391555]Kita melihat bahwa teks tersebut adalah kelompok berulang dari 4 nilai, salah satunya adalah integer, dan 3 sisanya adalah angka floating-point. Untuk kenyamanan, kami menempatkannya di jalur yang berbeda:
[1749054104147639] [- 2.07154922] [10.001905] [4.5387093]
[1749056073889025] [5.7193284] [8.221763] [0.01391537]
[1749058029180773] [- 4.684068] [12.05614] [0,0377285]
[1749060105291613] [4.6900544] [6.9307165] [- 4.7094293]
[1749062123327502] [4.4682417] [7.512769] [6.037215]
[1749067640096818] [1.0396843] [8.798672] [- 4.9335976]
[1749070016073380] [- 2.3173676] [10.180047] [4.948362]
[1749072343679582] [- 4.3660607] [12.218135] [0.5312999]
[1749073674459611] [- 2.48394698] [10.834006] [- 6.306282]
[1749075827770391] [0.2795044] [13.279829] [- 0.19391555]Format kriptogram diurutkan, tetapi nilai-nilai ini tidak diketahui. Beberapa parameter accelerometer perangkat, tanpa spesifik. Dan mari kita pergi ke situs pengembang Android dan
melihat apa yang dapat ditampilkan accelerometer secara umum.
Kami melihat deskripsi berikut:
Kami telah mengetahui apa yang bertanggung jawab atas parameter floating point - ini adalah akselerasi perangkat di sepanjang sumbu X, Y, dan Z. Tetapi bagaimana memahami sumbu mana yang masing-masing bertanggung jawab? Saatnya untuk meluncurkan aplikasi. Ini terlihat seperti ini:
Ada 2 opsi untuk menentukan perilaku aplikasi: mendekompilasi
.apk dan menganalisis nilai yang dihasilkan. Selanjutnya, kami mempertimbangkan metode kedua dan memberikan penyisipan kode dekompilasi yang bertanggung jawab atas tindakan aplikasi.
Kriptogram berisi nilai positif dan negatif (kita tahu bahwa ini adalah akselerasi pada sumbu yang berbeda), sehingga kita dapat membuat asumsi: jika vektor kemiringan perangkat di sepanjang sumbu berlawanan, maka nilai akselerasi akan kira-kira sama dengan nilai absolut, dan perbedaannya hanya akan dalam tanda.
Berikut ini adalah daftar kode untuk menyimpan informasi percepatan:
public class MotionSnapshot { public final float angle_alpha; public final float angle_beta; public final float angle_gamma; public final long event_time; ... }
Berdasarkan pertimbangan ini, kami menghadapi tugas-tugas berikut:
- Tentukan nilai apa dalam cryptogram yang sesuai dengan kemiringan perangkat
- Tentukan pola deviasi
- Untuk setiap digit untuk mengaitkan pola penyimpangan untuk dekripsi
2 tugas pertama akan dilakukan secara paralel. Di telepon kita dapat menguji 2 jenis kemiringan:
- Dari diriku sendiri / diriku sendiri
- Kiri / kanan
Kode yang bertanggung jawab untuk menangani acara dari accelerometer public class SensorListener implements SensorEventListener { private MotionTrace Trace; public SensorListener(MotionTrace trace, MainActivity activity) { Trace = trace; } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } @Override public void onSensorChanged(SensorEvent event) { Trace.addSnaphot(new MotionSnapshot(event.values, event.timestamp)); } }
Kode yang bertanggung jawab untuk menghasilkan kemiringan perangkat dengan mengklik tombol public class MotionTrace { private ArrayList<MotionSnapshot> Deltas; private long Length; private MotionSnapshot LastSnapshot; public MotionTrace(long len) { LastSnapshot = new MotionSnapshot(0,0,0,0); Deltas = new ArrayList<>(); Length = len; } public void addSnaphot(MotionSnapshot snapshot) { if (Deltas.size() >= Length) { Deltas.remove(0); } MotionSnapshot delta = new MotionSnapshot(0,0,0,0); if (Deltas.size() > 0) { delta = snapshot; } Deltas.add(delta); } public ArrayList<MotionSnapshot> getDeltas() { return new ArrayList<>(Deltas); } }
Kode yang bertanggung jawab untuk menghasilkan cryptogram public void SaveCiphertext() { Log.d(Config.MAIN_TAG, "SAVING - {{" + Ciphertext + "}}"); try { File root = new File(Environment.getExternalStorageDirectory(), Config.DIRNAME); if (!root.exists()) { Log.d(Config.MAIN_TAG, "Creating directory - [" + root + "]"); if (!root.mkdirs()) { Log.d(Config.MAIN_TAG, "Error creating directory"); } } File out_file = new File(root, Config.FILENAME); Log.d(Config.MAIN_TAG, "Out - [" + out_file + "]"); PrintWriter writer = new PrintWriter(out_file, "UTF-8"); writer.println(Ciphertext); writer.close(); Toast.makeText(this, "Saved to - [" + out_file + "]", Toast.LENGTH_LONG).show(); } catch (IOException ex) { Toast.makeText(this, "Error saving data", Toast.LENGTH_SHORT).show(); } Ciphertext = ""; }
Mari kita mulai. Untuk menguji kemiringan tipe pertama, kami memilih angka 2 dan 8. Klik pada masing-masing 3 kali dengan upaya yang meningkat. Kami mendapatkan hasil sebagai berikut:
[2687418463227102] [- 0,23700714] [10.764615] [- 0,9759079]
[2687419411042043] [- 3.5834892] [13.591138] [- 1.7036858]
[2687420383026907] [- 5.575793] [13.533228] [- 1.3104248]
[2687421461360546] [0.6850295] [6.0002656] [0.5568123]
[2687422317256542] [4.1720495] [1.8675026] [1.545407]
[2687423250514599] [7.9689393] [- 3.600097] [0.33846742]Nah, perbedaan dalam 2 parameter terlihat dengan mata telanjang. Mari mulai mengisi template.
Kami mewakili template dalam bentuk rentang nilai bidang yang sesuai di baris kriptogram. Kami menandai dengan tanda tanya apa yang belum kami ketahui.
[? ]
[(<0) - penyimpangan dari diri sendiri; (> 0) - penolakan diri]
[?]
[?]Demikian pula, kami akan melakukan pengujian dengan tombol 4 dan 6. Hasil:
[2688019191605386] [1.7270225] [9.541045] [0.0397171]
[2688020247971353] [1.0615791] [9.794326] [4.9135437]
[2688021887957875] [1.0974716] [7.5535636] [7.8307548]
[2688023749896352] [1.3328063] [9.43923] [- 0.27600938]
[2688024849688832] [1.1357567] [9.9313135] [- 2.4410355]
[2688026002520864] [0.30400848] [6.4610033] [- 8.0956335]Perbarui template dengan mempertimbangkan pola yang dipelajari:
[? ]
[(<0) - penyimpangan dari diri sendiri; (> 0) - penolakan diri]
[?]
[(<0) - penyimpangan ke kanan; (> 0) - deviasi ke kiri]Jelas, nilai ketiga adalah penyimpangan atas / bawah, karena ini adalah satu-satunya vektor yang tersisa. Dan kita tidak perlu memeriksanya, karena untuk penentuan tombol yang ditekan, kita sudah memiliki templat terkenal.
Sekarang buat templat untuk setiap digit pada keyboard, berdasarkan posisi tombol dan templat yang dikembangkan (* - parameternya tidak menarik bagi kami):
1 - [*] [<0] [*] [> 0]
2 - [*] [<0] [*] [dekat dengan 0]
3 - [*] [<0] [*] [<0]
4 - [*] [] [*] []
5 - [*] [dekat dengan 0] [*] [dekat dengan 0]
6 - [*] [dekat dengan 0] [*] [<0]
7 - [*] [> 0] [*] [> 0]
8 - [*] [> 0] [*] [dekat dengan 0]
9 - [*] [> 0] [*] [<0]
0 - [*] [> 0] [*] [dekat dengan 0]Seperti yang dapat dilihat dari gambar, tombol 8 dan 0 memiliki parameter yang sama, sehingga dekripsinya bisa ambigu - saat bertemu kombinasi seperti itu dalam kriptogram, Anda harus mencoba kedua opsi. Sekarang kami menerapkan templat yang diperoleh ke cryptogram, dan kami mendapatkan 2 jawaban: 1029761235 dan 1829761235, di antaranya
1829761235 benar . Tugas selesai!
Segera - pada tanggal 26 Juni - Kompetisi Tatap Muka NeoQUEST 2019 akan diadakan! Cepat
mendaftar di situs web acara. Dalam waktu dekat habrastatya akan dirilis dengan pengumuman program, jangan lewatkan!