Saat membuat aplikasi, kami dihadapkan dengan banyak pilihan, masalah, dan sebagainya, yang akan kami coba kenalkan kepada Anda di artikel ini. Ternyata, Anda bisa berdialog dengan mobil, dan cukup produktif. Secara alami, untuk mengatur komunikasi dengan mobil, Anda perlu "menjalin kontak", "mengajukan pertanyaan yang tepat" dan memahami dengan benar "jawaban" yang diterima dari mobil. Oleh karena itu, artikel ini akan bertujuan menjelaskan organisasi dialog dalam bahasa yang dapat diakses, serta memberi tahu Anda kesalahan apa yang mungkin Anda temui di sepanjang jalan dan cara menghadapinya.
Pilihan Koneksi
Awalnya, perlu diklarifikasi bahwa adaptor ELM327 akan digunakan untuk terhubung ke mobil. ELM327 adalah rangkaian mikro yang memungkinkan Anda untuk mengubah protokol yang digunakan dalam ban diagnostik mobil menjadi protokol RS232, di mana kami akan mentransfer data. Karena fakta bahwa pengiriman data melalui protokol RS232 terjadi secara berurutan, masalah pertama muncul - kecepatan transfer data, yang akan kami coba selesaikan dalam salah satu paragraf berikut.
Ada beberapa variasi adaptor ELM327, yang diklasifikasikan berdasarkan metode transfer data - Bluetooth, WIFI, USB. Berdasarkan kenyataan bahwa tujuan pengembangan adalah perangkat seluler yang menjalankan Android, Anda dapat memilih dua versi ELM327 yang paling cocok, seperti Bluetooth dan WIFI. Karena hanya ada satu cara untuk menerima dan memproses data, dan mereka hanya berbeda dalam opsi koneksi ke adaptor, Anda hanya dapat memilih satu, mengatur dialog dengannya, dan kemudian menambahkan opsi koneksi yang tersisa.
ELM327 1.5 vs ELM327 2.1

Salah satu masalah pertama yang dapat Anda temui adalah masalah memilih adaptor secara langsung, dalam kasus kami Bluetooth. Ternyata jika Anda perlu mendukung semua (setidaknya sebagian besar) mobil, Anda harus memilih versi v1.5 daripada v2.1, yang sebenarnya perlu diklarifikasi beberapa kali ketika membeli adaptor, karena penjual mencoba untuk memberikan versi adaptor bukan untuk yang ada. sebenarnya, karena mereka tidak terlalu berbeda. Bahkan, dalam versi v2.1 tidak ada dukungan untuk protokol J1850 PWM dan J1850 VPW, yang berarti Anda tidak akan dapat terhubung ke mobil yang menggunakan protokol ini.
Koneksi
Menghubungkan ke adaptor berlangsung dalam beberapa tahap:
- Terhubung ke adaptor (Bluetooth, WIFI)
- Mengirim perintah inisialisasi (string inisialisasi)
Jika semuanya jelas dengan organisasi koneksi. Prinsip operasi sama dengan semua obrolan Bluetooth / WIFI. Untuk memahami cara mengirim string inisialisasi, perlu untuk mempelajari perintah apa yang ada, serta fungsi apa yang mereka lakukan.
AT Z [reset semua]
Setel ulang pengaturan adaptor ke status pabrik.
AT L1-0Aktifkan / Nonaktifkan umpan baris.
AT E1-0Gema on-off
AT H1-0Header hidup-mati
AT AT0-1-2Adaptive Timing Off - Adaptif Timing Auto1 - Adaptif Timing Auto2
AT ST FFTetapkan batas waktu maksimum.
ATD [atur semua ke Default]
Setel ulang pengaturan ke kondisi awal yang dikonfigurasi pengguna.
AT DP [Jelaskan Protokol saat ini]
Pemindai dapat menentukan secara mandiri protokol kendaraan yang terhubung.
AT IB10 [atur tingkat Baud ISO ke 10400]
Perintah ini mengatur baud rate untuk ISO 9141-2 dan
ISO 14230-4 10400
AT IB96 [atur laju Baud ISO ke 9600]
Perintah ini mengatur baud rate untuk ISO 9141-2 dan
ISO 14230-4 9600 untuk protokol 3,4,5.
AT SP h [Tetapkan Protokol h]
Perintah pemilihan protokol h, di mana h:
0 - Otomatis;
1 - SAE J1850 PWM (41,6 Kbaud);
2 - SAE J1850 VPW (10.4 Kbaud);
3 - ISO 9141-2 (5 baud init, 10,4 Kbaud);
4 - ISO 14230-4 KWP (5 baud init, 10,4 Kbaud);
5 - ISO 14230-4 KWP (init cepat, 10,4 Kbaud);
6 - ISO 15765-4 CAN (ID 11 bit, 500 Kbaud);
7 - ISO 15765-4 CAN (29 bit ID, 500 Kbaud);
8 - ISO 15765-4 CAN (ID 11 bit, 250 Kbaud);
9 - ISO 15765-4 CAN (29 bit ID, 250 Kbaud);
AT SP Ah [Tetapkan Protokol h dengan Otomatis]
Perintah menetapkan protokol default h, jika koneksi menggunakan protokol h gagal, maka adaptor memulai pemilihan protokol secara otomatis.
Berdasarkan perintah yang dijelaskan di atas, kami membentuk string inisialisasi.
initializeCommands = Arrays.asList("ATZ", "ATL0", "ATE1", "ATH1", "ATAT1", "ATSTFF", "ATDP", "ATSP0");
Dianjurkan untuk memungkinkan pengguna untuk mengubah perintah inisialisasi, karena untuk memilih "kunci" untuk beberapa mobil, perlu untuk memilih pengaturan adaptor yang lebih cocok. Dalam kasus kami, pengaturan digunakan yang sesuai untuk sebagian besar protokol standar.
Dianjurkan untuk memperhatikan perintah APSP0, jadi kami mengatur pemilihan protokol otomatis default, ini mungkin memerlukan waktu.
Dengan demikian, jika pengguna tahu apa protokol otomatisnya, kemudian menggunakan kemampuan untuk mengubah protokol koneksi, ia dapat mengubah 0 ke nomor protokolnya.
Baca data diagnostik
Perintah khusus PID digunakan untuk membaca data diagnostik.
PID (Parameter id's - On-board Diagnostic Parameter Identifiers) - kode yang digunakan untuk menanyakan kinerja sensor kendaraan tertentu.
Id utama dapat ditemukan di Wikipedia, ada satu set lengkap perintah dasar yang harus didukung oleh semua mobil. Ada juga set perintah untuk merek dan jenis mobil tertentu, set ini disediakan untuk biaya. Dalam kasus kami, aplikasi difokuskan pada diagnostik dasar mobil, masing-masing, kami menggunakan serangkaian perintah dasar.
Dimungkinkan juga untuk menerima data saat ini dari mobil, sementara perintah untuk menerima data dari mobil akan memiliki
01 di awal, menunjukkan bahwa kami ingin mendapatkan data nyata. Jika kami ingin mendapatkan data mobil yang disimpan, maka pada awal perintah Anda harus menentukan
02 . Misalnya, perintah untuk mendapatkan kecepatan mobil saat ini adalah
010D , dan untuk mendapatkan kecepatan yang disimpan -
020D .
Jika Anda hati-hati melihat jumlah perintah yang disediakan oleh sumber terbuka, Anda bisa melihat masalah yang saya tulis di awal, yaitu masalah kecepatan respons adaptor. Karena mengirim dan menerima perintah berurutan, untuk menerima pembacaan sensor pada saat ini, perlu menunggu jawaban untuk semua perintah sebelumnya. Dengan demikian, jika Anda meminta untuk menerima semua perintah, maka ada kemungkinan besar bahwa pembaruan data nyata akan terjadi sangat lambat. Tetapi masalah ini dapat diselesaikan jika Anda menggunakan perintah yang hanya menampilkan tim-tim yang ada di dalam mobil. Sebagai contoh:
0100 - PID didukung [01 - 20]
0120 - PID didukung [21 - 40]
0140 - PID didukung [41 - 60]
0160 - PID didukung [61 - 80]
0180 - PID didukung [81 - A0]
01A0 - PID didukung [A1 - C0]
Saya akan menunjukkan cara menentukan sensor yang ada di dalam mobil menggunakan salah satu dari pids. Sebagai contoh:
- 0100 \\ permintaan
- BB1E3211 \\ jawaban dari mobil
Kami menerjemahkan jawaban dari mobil ke sistem angka biner
BB1E3211(16) > 10111011000111100011001000010001(2)
Dengan menggunakan pelat berikut ini, kita dapat menentukan mana yang didukung oleh mobil kami, mulai dari 01 hingga 20:

Berdasarkan data yang diperoleh, kami dapat menentukan bahwa mobil kami mendukung nomor-nomor berikut:
01, 03, 04, 05, 07, 08, 0C, 0D, 0E, 0F, 13, 14, 17, 1C, 20
Sekarang, alih-alih mengirim semua 32 tim dan menunggu jawaban untuk mereka, terlepas dari kenyataan bahwa beberapa mungkin tidak ada, kami hanya akan menggunakan 15 tim. Tapi ini bukan batas yang disebut optimasi. Agar data diperbarui lebih cepat, saya menyarankan Anda untuk hanya meminta data tentang sensor yang ditampilkan di layar. Meskipun ini membatasi beberapa fungsionalitas aplikasi. Misalnya, catatan sejarah.
Membaca dan mendekode kesalahan mobil
Kesalahan mobil juga bisa berbeda dan perintah terpisah juga ada untuk mereka. Sebagai contoh:
- 03 - Untuk menampilkan kode kesalahan yang disimpan
- 0A - Untuk menampilkan kode kesalahan persisten.
Seperti dengan perintah lain, kesalahan mobil datang dalam bentuk yang disandikan, masing-masing, seperti dalam perintah lain, mereka perlu diterjemahkan untuk mendapatkan informasi yang diperlukan. Saya akan memberikan contoh operasi decoding kesalahan. Kode:
private final static char[] dtcLetters = {'P', 'C', 'B', 'U'}; private final static char[] hexArray = "0123456789ABCDEF".toCharArray(); private void performCalculations(String fault) { final String result = fault; String workingData = ""; int startIndex = 0; troubleCodesArray.clear(); try { if (result.contains("43")) { workingData = result.replaceAll("^43|[\r\n]43|[\r\n]", ""); } else if (result.contains("47")) { workingData = result.replaceAll("^47|[\r\n]47|[\r\n]", ""); } for(int begin=startIndex; begin < workingData.length(); begin += 4) { String dtc = ""; byte b1 = Utility.hexStringToByteArray(workingData.charAt(begin)); int ch1 = ((b1 & 0xC0) >> 6); int ch2 = ((b1 & 0x30) >> 4); dtc += dtcLetters[ch1]; dtc += hexArray[ch2]; dtc += workingData.substring(begin + 1, begin + 4); if (dtc.equals("P0000")) { continue; } troubleCodesArray.add(dtc); } } catch (Exception e) { Log.e(TAG, "Error: " + e.getMessage()); } }
Dan sekarang untuk penjelasannya.
Berdasarkan respons yang diterima, kita bisa mendapatkan kode kesalahan, untuk ini kita mendekode pesan yang diterima menggunakan pelat berikut.
Karakter pertama:

Karakter kedua:

3, 4, 5 karakter dibentuk sesuai dengan tabel ini:

Berdasarkan ini, kita dapat mencoba menguraikan jawaban berikut 0001000000111110

Kode Kesalahan: P103E
Epilog
Pada tahap ini, kami menemukan cara mengatur dialog dengan adaptor, mengirim perintah kepadanya, menerima dan mendekripsi jawabannya. Ini adalah bagian besar dari pekerjaan, jika Anda mempertimbangkan berapa banyak waktu yang diperlukan untuk mempelajari materi, tetapi pada saat yang sama cukup menarik. Di luar artikel ini, ada banyak masalah yang terkait dengan antarmuka visual, serta banyak fungsi tambahan, seperti menambahkan id baru dari file, cara standar dan lanjutan untuk terhubung ke adaptor dan membuat grafik.
Matvienko Alexander, Hossein Fakhr.