Dokumen ini menguraikan proses yang saya lalui untuk merekayasa balik protokol Bluetooth dari detektor radar Cobra Irad 900 saya. Tujuan awal saya adalah memiliki antarmuka Raspberry Pi 3 saya dengan perangkat melalui Bluetooth untuk menangani peringatan tanpa harus menggunakan aplikasi iOS/Android, pada akhirnya untuk berfungsi sebagai antarmuka yang bagus dengan "Carputer" Raspberry Pi saya.
Penting untuk dicatat bahwa saya tidak memiliki pengalaman awal dengan protokol Bluetooth, tetapi itu adalah pengalaman belajar yang cukup menyenangkan secara keseluruhan.
Ketika saya pertama kali memulai proyek ini, saya tidak tahu harus mulai dari mana tetapi dengan Google. Saya tahu cara mengendus lalu lintas web biasa, tetapi Bluetooth sedikit kotak hitam bagi saya. Dengan pencarian cepat, saya menemukan Perpustakaan Pybluez serta contoh -contoh berkomunikasi melalui RFComm. Saya juga menemukan beberapa sumber daya yang baik, termasuk posting blog yang menarik oleh Travis Goodspeed.
Namun, akan sedikit panduan tentang masalah ini, saya juga menghabiskan banyak waktu untuk sumber daya seperti ini, berpikir bahwa Bluetooth Le adalah apa yang saya cari.
Bermain -main dengan iPhone 5 Jailbroken lama saya, saya dapat menggunakan BTServer untuk mencatat lalu lintas Bluetooth yang dikirim dan diterima oleh iPhone saya. Dikelilingi oleh beberapa perangkat Bluetooth, file log tumbuh dengan cepat, meskipun itu bukan masalah. Untungnya, log dikeluarkan sebagai file .pklg, memudahkan untuk memfilter paket yang relevan di Wireshark.
Menggunakan filter paket bluetooth.src == B8:92:1D:00:3F:61 , saya bisa melihat paket mentah yang dikirim aplikasi iOS ke detektor radar. Saya mengambil beberapa rekaman sampel komunikasi antara ponsel saya dan detektor radar, beberapa dengan peringatan yang dihasilkan, dan beberapa tanpa.
Data Bluetooth ditransfer melalui protokol RFComm. Ketika perangkat pertama kali terhubung, mereka mengirim beberapa informasi bolak -balik, mungkin hanya menyinkronkan pengaturan (lebih lanjut tentang ini nanti). Setelah itu, kedua perangkat mengikuti pola yang dapat diprediksi antara satu sama lain. Detektor radar akan mengirimkan paket RFComm melalui Bluetooth pada interval 1/2 detik reguler. Dengan beberapa waktu dan kesabaran, saya dapat menguraikan struktur muatan yang dikirim dari detektor radar ke iPhone.
Struktur Payload: Detektor Radar → iPhone
| Barang | Nilai (hex) | Ukuran |
|---|---|---|
| Pembukaan | 55 | 1 byte |
| Ukuran muatan | xx xx | 2 byte |
| Tindakan | xx | 1 byte |
| Disimpan | 00 | 1 byte |
| Seq | xx | 1 byte |
| Disimpan | xx xx xx xx xx xx | 6 byte |
| Peringatan | xx | 1 byte |
| Jenis Peringatan | xx | 1 byte |
| ... | ... | ... |
Saat detektor radar berjalan, ia akan mengirim paket dalam format di atas. Meskipun jaringan komputer bukan bidang keahlian saya, saya akan mencoba menjelaskan sebaik mungkin.
Byte pembukaan yang dikirim selalu dikirim dengan nilai 0x55 . Ini menentukan bahwa ini adalah awal dari pesan muatan baru dari perangkat, daripada melanjutkan dari paket sebelumnya. Setelah itu adalah nilai 2-byte yang berisi ukuran sisa pesan (semuanya setelah 3 byte pertama). Nilai tindakan menentukan jenis informasi yang dikirim paket.
Nomor SEQ adalah tempat yang mulai menarik. Jika Anda mengambil kelas di jaringan, atau tahu sedikit tentang TCP, Anda mungkin sudah tahu untuk apa itu. Detektor radar akan mengirimkan nilai 1-byte ke iPhone, dan aplikasi iOS harus merespons dengan nomor ACK dengan nilai yang sama. Kalau tidak, detektor radar akan menyadari bahwa ada sesuatu yang salah dan memutuskan hubungan itu sendiri.
Alert Byte menentukan apakah peringatan dipicu. Jika demikian, itu adalah set nilai 0x41 , dan byte berikut digunakan untuk menentukan jenis peringatan sedang dikirim. Saya tidak bisa mengetahui terlalu banyak tentang nilainya karena saya tidak memiliki pistol radar yang sebenarnya. Padahal, seorang pria yang menggunakan instruktur membuat simulator senjata Lidar menggunakan Arduino. Itu banyak membantu dalam menganalisis paket.
Agar aplikasi iOS untuk mempertahankan koneksi ke perangkat, ia perlu mengirim respons dalam format yang benar. Untungnya, tanggapan terhadap detektor radar jauh lebih sederhana, dan hanya 9 byte.
Respons: iPhone → Detektor Radar
| Barang | Nilai (hex) | Ukuran |
|---|---|---|
| Pembukaan | 55 | 1 byte |
| Ukuran muatan | xx xx | 2 byte |
| Tindakan | 02 | 1 byte |
| Disimpan | 00 | 1 byte |
| ACK | xx | 1 byte |
| Disimpan | 00 42 | 2 byte |
| Menangkal | xx | 1 byte |
Seperti yang disebutkan sebelumnya, nilai ACK harus memiliki nilai yang sama dengan nilai SEQ yang diterima sebelumnya, jika tidak koneksi akan terputus. Itu cukup mudah. Beberapa protokol lain mungkin memiliki metode pengecekan klien yang jauh lebih jelas; Syukurlah ini bukan masalahnya. Menariknya, ada variabel counter lain yang digunakan. Saya tidak pernah benar -benar mengetahui untuk apa byte itu, tetapi berkurang 1 untuk setiap respons terhadap perangkat. Kedua nilai ini cukup mudah untuk mengkode ke dalam skrip Python dan tidak terlalu banyak bekerja.
Seperti yang saya sebutkan sebelumnya, ketika aplikasi iOS pertama kali terhubung ke detektor radar, beberapa pengaturan dan data disinkronkan bolak -balik. Itu bukan prioritas saya untuk mencari tahu dan memecah paket -paket itu, dan saya tidak ingin menghabiskan terlalu banyak waktu untuk ini. Saya mengekspor seluruh log paket di Wireshark sebagai file XML (data.xml), kemudian menggunakan skrip python (parsedata.py) untuk memproses dan menyimpan informasi untuk digunakan nanti.
Saat dimuat, Radar.py akan membuka data yang telah diproses dalam file packetdata.dat. Kemudian memindai detektor radar melalui Bluetooth dan mencoba untuk terhubung ke sana. Setelah terhubung, detektor radar akan mengirim beberapa paket data ke perangkat yang terhubung. Untungnya, mereka adalah paket yang persis sama dalam urutan yang persis sama setiap kali. Script Python akan melihat data dari file packetdata.dat untuk paket yang diterima. Setelah skrip Python utama menemukan paket maching, ia mengirimkan respons yang direkam sebelumnya terhadap detektor radar.
Anehnya, itu berhasil dengan baik. Padahal, saya membayangkan saya perlu memperbarui file data jika saya mengubah pengaturan apa pun dalam aplikasi iOS. Itu tidak terlalu menjadi masalah, karena saya hanya perlu mengkonfigurasi perangkat sekali, dan mungkin tidak pernah menggunakan aplikasi lagi.
Mengingat semua informasi yang saya temukan, saya dapat menulis skrip Python yang meniru koneksi iPhone. Jika suatu paket tidak ditemukan dalam database respons yang direkam, ia membangun paket respons dengan struktur yang sebelumnya saya rinci di atas.
Melihat ke belakang, itu adalah proyek yang sangat menyenangkan melakukan sesuatu yang tidak pernah saya alami. Sebagai jurusan Ilmu Komputer, menarik melakukan sesuatu dengan perangkat keras untuk sekali itu kurang lebih di luar negeri.
Brandon asuncion // [email protected]
Setiap komentar/umpan balik dihargai!