OBD2 čtěte a zapamatujte si. — DRIVE2

m.habr.com/ru/post/444726/
Článek není můj, ale téměř všechny informace o obd jsou uvedeny stručně a jasně. Doporučuji přečíst a uložit do historie.
Při tvorbě aplikace jsme se potýkali s mnoha volbami, problémy a tak dále, se kterými se vás pokusíme seznámit v tomto článku. Jak se ukázalo, s autem se dá vést dialog, a to docela produktivní. Aby bylo možné zorganizovat komunikaci s autem, je samozřejmě nutné „navázat kontakt“, „položit správnou otázku“ a správně porozumět „odpovědi“ obdržené z auta. V souladu s tím bude článek zaměřen na vysvětlení organizace dialogu v přístupném jazyce a také na to, s jakými chybami se můžete během cesty setkat a jak se s nimi vypořádat.
Na úvod je potřeba si ujasnit, že pro připojení k vozu bude použit adaptér ELM327. ELM327 je čip, který umožňuje převádět protokoly používané v diagnostických sběrnicích automobilů na protokol RS232, na který budeme přenášet data. Vzhledem k tomu, že k přenosu dat protokolem RS232 dochází postupně, nastává první problém – rychlost přenosu dat, kterou se pokusíme překonat v některém z následujících odstavců.
Existuje několik variant adaptéru ELM327, které jsou klasifikovány podle způsobu přenosu dat – Bluetooth, WIFI, USB. Vzhledem k tomu, že cílem vývoje je mobilní zařízení s operačním systémem Android, lze vybrat dvě nejvhodnější verze ELM327, jako je Bluetooth a WIFI. Vzhledem k tomu, že existuje jeden způsob příjmu a zpracování dat a liší se pouze možnostmi připojení k adaptéru, můžete vybrat pouze jeden, uspořádat pomocí něj dialog a poté přidat další možnosti připojení.
ELM327 1.5 vs ELM327 2.1
Jedním z prvních problémů, se kterými se můžete setkat, byl problém s výběrem samotného adaptéru, v našem případě Bluetooth. Ukazuje se, že pokud potřebujete podporovat všechna (alespoň většinu) aut, musíte místo v1.5 zvolit verzi v2.1, což je ve skutečnosti potřeba při nákupu adaptéru několikrát vyjasnit, protože prodejci se snaží vydávat verzi adaptéru za něco jiného, než čím ve skutečnosti je, protože nejsou nijak zvlášť odlišné. Verze 2.1 ve skutečnosti nepodporuje protokoly J1850 PWM a J1850 VPW, což znamená, že se nebudete moci připojit k automobilům, které tyto protokoly používají.
Připojení k adaptéru probíhá v několika fázích:
Připojení k adaptéru (Bluetooth, WIFI)
Odesílání inicializačních příkazů (inicializační řetězec)
Pokud je vše jasné s organizací připojení. Princip fungování je stejný jako u jakéhokoli Bluetooth/WIFI chatu. Abyste tedy pochopili, jak odeslat inicializační řetězec, musíte si prostudovat, jaké příkazy existují a jaké funkce provádějí.
AT Z [resetovat vše]Resetujte adaptér do továrního nastavení.
AT L1-0
Povolit/zakázat znaky nového řádku.
AT E1-0
Echo zapnuto – vypnuto
AT H1-0
Záhlaví zapnuto – vypnuto
V AT0-1-2
Adaptive Timing Off – adaptivní časování Auto1 – adaptivní časování Auto2
NA ST FF
Nastavte časový limit na maximum.
AT D [nastavit vše na výchozí]Obnoví nastavení do původního, uživatelem nakonfigurovaného stavu.
AT DP [Popište aktuální protokol]Skener je schopen samostatně určit protokol vozu, ke kterému je připojen.
AT IB10 [nastav přenosovou rychlost ISO na 10400]Příkaz nastaví přenosovou rychlost pro ISO 9141-2 a
ISO 14230-4 10400
AT IB96 [nastavit přenosovou rychlost ISO na 9600]Příkaz nastaví přenosovou rychlost pro ISO 9141-2 a
ISO 14230-4 9600 pro protokoly 3,4,5.
AT SP h [Nastavit protokol h]Příkaz volby protokolu h, kde h:
0 – Automaticky;
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 (rychlá init, 10.4 Kbaud);
6 – ISO 15765-4 CAN (11bitové ID, 500 kbaud);
7 – ISO 15765-4 CAN (29bitové ID, 500 kbaud);
8 – ISO 15765-4 CAN (11bitové ID, 250 kbaud);
9 – ISO 15765-4 CAN (29bitové ID, 250 kbaud);
AT SP Ah [Nastavit protokol h s Auto]
Příkaz nastaví standardně protokol h, pokud selže připojení pomocí protokolu h, adaptér zahájí automatický výběr protokolu.
Na základě výše popsaných příkazů vytvoříme inicializační řetězec.
initializeCommands
= Arrays.asList(“ATZ”, “ATL0”, “ATE1”, “ATH1”, “ATAT1”, “ATSTFF”, “ATDP”, “ATSP0”);
Je vhodné dát uživateli možnost změnit inicializační příkazy, protože pro výběr „klíče“ pro některá auta je nutné zvolit vhodnější nastavení adaptéru. V našem případě používáme nastavení, která jsou vhodná pro většinu standardních protokolů.
Dále je vhodné věnovat pozornost příkazu APSP0, proto nastavujeme standardně automatický výběr protokolu, může to chvíli trvat.
Pokud tedy uživatel ví, jaký protokol má jeho auto, pak pomocí možnosti změnit protokol připojení může změnit 0 na své číslo protokolu.
Čtení diagnostických dat
Ke čtení diagnostických dat se používají speciální příkazy PID.
PID (ID parametrů) jsou kódy, které se používají k dotazování na hodnoty určitých snímačů vozidla.
Hlavní PID lze nalézt na Wikipedii, je zde kompletní sada základních příkazů, které by měla podporovat všechna auta. Existují také sady příkazů pro určité značky a typy vozů, tyto sady jsou k dispozici za příplatek. V našem případě je aplikace určena pro základní diagnostiku vozu, používáme tedy základní sadu příkazů.
Je také možné přijímat aktuální data z vozu, v tomto případě bude mít příkaz pro příjem dat z vozu na začátku 01, což znamená, že chceme přijímat skutečná data. Pokud chceme získat uložená data vozu, pak na začátku příkazu musíme zadat 02. Například příkaz pro získání aktuální rychlosti vozu je 010D a pro získání uložené rychlosti je 020D.
Pokud se pozorně podíváte na počet příkazů, které poskytují otevřené zdroje, můžete si všimnout problému, o kterém jsem psal na samém začátku, a to problému rychlosti odezvy adaptéru. Vzhledem k tomu, že odesílání a přijímání příkazů probíhá sekvenčně, aby bylo možné získat údaje snímače v aktuálním čase, je nutné počkat na odezvu na všechny předchozí příkazy. Pokud tedy požadujete všechny příkazy, je vysoká pravděpodobnost, že aktualizace skutečných dat bude probíhat velmi pomalu. Ale i tento problém lze vyřešit, pokud použijete příkazy, které zobrazí pouze ty příkazy, které v autě existují. Například:
0100 – podporované PID [01 – 20]0120 – podporované PID [21 – 40]0140 – podporované PID [41 – 60]0160 – podporované PID [61 – 80]0180 – podporované PID [81 – A0]01A0 – podporované PID [A1 – C0]
Ukážu, jak určit, které senzory jsou přítomné v autě pomocí jednoho z PID. Například:
0100požadavek
BB1E3211 odpověď z auta
Převod odpovědi z auta do binární číselné soustavy
Pomocí následující tabulky můžeme určit, která pid podporuje naše auto, počínaje 01 až 20:
Na základě získaných dat můžeme určit, že naše auto podporuje následující PID:
01, 03, 04, 05, 07, 08, 0C, 0D, 0E, 0F, 13, 14, 17, 1C, 20
Nyní místo toho, abychom odeslali všech 32 příkazů a čekali na odpověď, i když některé mohou chybět, použijeme pouze 15 příkazů. To ale není hranice takzvané optimalizace. Aby se data aktualizovala ještě rychleji, doporučuji si vyžádat pouze data o těch senzorech, které se zobrazují na obrazovce. I když to omezuje některé funkce aplikace. Například historie nahrávání.
Čtení a dekódování chyb vozidla
Chyby auta mohou být také různé a také pro ně existují samostatné příkazy. Například:
03 – Zobrazení uložených chybových kódů
0A – Zobrazení trvalých chybových kódů.
Vzhledem k tomu, že u jiných příkazů přicházejí chyby vozidla v zakódované podobě, je třeba je stejně jako u jiných příkazů dekódovat, aby bylo možné získat potřebné informace. Dovolte mi uvést příklad, jak funguje dekódování chyb. Kód:
private final static char[] dtcLetters = ;
private final static char[] hexArray = “0123456789ABCDEF”.toCharArray();
private void performCalculations(String fault) final String result = chyba;
String workingData = “”;
int startIndex = 0;
troubleCodesArray.clear();
zkuste if (result.contains(“43”)) workingData = result.replaceAll(“^43|[rn]43|[rn]”, “”);
> else if (result.contains(“47”)) workingData = result.replaceAll(“^47|[rn]47|[rn]”, “”);
>
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(začátek + 1, začátek + 4);
if (dtc.equals(“P0000”)) pokračovat;
>
troubleCodesArray.add(dtc);
>
> catch (Výjimka e) Log.e(TAG, “Chyba: ” + e.getMessage());
>
>
Nyní k vysvětlení.
Na základě přijaté odpovědi můžeme získat chybový kód, dekódujeme přijatou zprávu pomocí následujících znaků.
3, 4, 5 znaků se tvoří podle této tabulky:
Na základě toho se můžeme pokusit analyzovat následující odpověď 0001000000111110
Kód chyby: P103E
V této fázi jsme přišli na to, jak organizovat dialog s adaptérem, posílat mu příkazy, přijímat a dešifrovat jeho odpovědi. To je hodně práce, vezmeme-li v úvahu, kolik času zabere studium látky, ale zároveň docela zajímavé. Nad rámec tohoto článku existuje mnoho problémů spojených s vizuálním rozhraním a také mnoho dalších funkcí, jako je přidávání nových pid ze souboru, standardní a pokročilý způsob připojení k adaptéru a vykreslování grafů.