BMW Elektronika a sběrnice aktualizováno 31. 7. 2026 4 min čtení
I-BUS a K-BUS v BMW E39: jak vypadá zpráva a proč je bránou mezi nimi přístrojovka
Moduly v pětce E39 spolu nemluví přes jeden řídicí počítač, ale po dvou pomalých sběrnicích. Formát zprávy je natolik prostý, že se rámec dá dekódovat tužkou: čtyři bajty režie, jeden bajt příkazu, nejvýš dvaačtyřicet bajtů dat a na konci XOR všeho předchozího. Dva nezávislé otevřené projekty ho mají popsaný přímo ve zdrojovém kódu.

Pátá řada E39 se podle anglické Wikipedie vyráběla od roku 1996 do roku 2004 a její elektrika nestojí na jednom velkém řídicím počítači. Rádio, navigace, světla, klimatizace i přístrojovka jsou samostatné jednotky, které se domlouvají po dvou pomalých sběrnicích. Jmenují se I-BUS a K-BUS.
Kdo v tom provozu chce číst, nemusí spoléhat na fóra. Protokol mají popsaný dva nezávislé otevřené projekty a v obou se dá ověřit řádek po řádku. node-bmw-client je software pro Raspberry Pi pod licencí MIT; jeho repozitář vznikl 24. dubna 2017 a autor v něm uvádí, že projekt vyvíjí na americké E39 540i z roku 2000 a na E39 M5 z roku 2002. BlueBus je firmware sériově vyráběného modulu do téhož vozu, repozitář je z 14. června 2018. Oba obsluhují I-BUS i K-BUS jedním a týmž kódem, protože formát zprávy je na obou stejný.
Kdo sedí na které sběrnici
node-bmw-client má v souboru lib/bus-data.js funkci, která podle cílového modulu rozhoduje, kterou sítí zprávu poslat. Je to nejjasnější veřejně dostupný soupis toho, kdo kam patří.
Na I-BUS podle ní patří rádio, měnič CD, navigační jednotka, palubní monitor, víceřádkový displej MID, ovládání na volantu, parkovací senzory, zesilovač DSP, světelný modul LCM, telefon a přístrojovka. Je to tedy zhruba všechno, co má co dělat s obsluhou a zábavou.
Na K-BUS patří karosářský modul GM, který ovládá zámky, okna a osvětlení interiéru, dále automatická klimatizace, imobilizér EWS, airbagová jednotka, střešní okno, dešťový a světelný senzor a nezávislé topení. Tedy karoserie a komfort.
Adresy modulů jsou jednobajtové a pevně dané: rádio 0x68, přístrojovka 0x80, měnič CD 0x18, karosářský modul 0x00, klimatizace 0x5B, ovládání na volantu 0x50. Úplný seznam vede node-bmw v souboru bus-modules.js a nezávisle na něm hlavička ibus.h ve firmwaru BlueBus. Tam, kde se překrývají, se shodují do posledního bajtu.
Zprávu z jedné sítě do druhé přeposílá přístrojovka
Zvláštní postavení má adresa 0xBF, označovaná zkratkou GLO. Zpráva poslaná na ni je určená všem. Komentář u téhle adresy v bus-data.js říká, že právě takové zprávy přístrojovka zrcadlí mezi I-BUS a K-BUS. Přístrojovka tedy není jen budík: je to brána, přes kterou se hlášení z jedné sítě dostane do druhé.
Pro hledání chyby z toho plyne užitečná věc. Modul připojený na I-BUS uslyší hromadné hlášení modulu z K-BUS, ale adresnou zprávu mezi dvěma jednotkami K-BUS ne. Když se tedy dvě jednotky „neslyší“, nemusí být hned na vině vodič nebo konektor. Může jít o zprávu, která přes bránu z principu neprochází.
Rámec: čtyři bajty režie, nejvýš dvaačtyřicet dat
Stavbu zprávy má ibus.h zapsanou jedinou řádkou komentáře nad definicí maximální délky: odesílatel, délka, příjemce, příkaz, data a kontrolní součet. Celý rámec smí mít nejvýš 47 bajtů, na data tedy zbývá dvaačtyřicet.
- bajt 0, odesílatel – adresa modulu, který mluví.
- bajt 1, délka – počet bajtů, které následují za ním, tedy příjemce, data a součet. Celý rámec je o dva bajty delší než tohle číslo.
- bajt 2, příjemce – adresa cíle, nebo 0xBF pro všechny.
- bajt 3 a další – příkaz a jeho data.
- poslední bajt – kontrolní součet.
Konkrétní příklad je přihlašovací zpráva měniče CD, kterou se modul ohlásí rádiu. Ve funkci IBusCommandCDCAnnounce firmware BlueBus posílá z adresy 0x18 na adresu 0xFF dvojici bajtů 0x02 a 0x01, což je odpověď na dotaz po stavu modulu. Odeslaný rámec proto vypadá takhle:
18 04 FF 02 01 E0
Poslední bajt v kódu nikde nestojí, dopočítali jsme ho sami podle pravidla ze stejného souboru.
Kontrolní součet je jediné XOR
Odesílatel sloučí operací XOR všechny bajty rámce kromě posledního a výsledek připojí na konec. Příjemce udělá totéž, jenže i s tím posledním: vyjde-li nula, rámec je v pořádku. Přesně takhle je to zapsané ve funkcích IBusSendCommandInternal a IBusValidateChecksum v souboru ibus.c.
Žádný polynom, žádná složitější ochrana. Jedno přehozené bitové místo se pozná, dvě už nemusí. Rámec navíc jistí sudá parita, kterou počítá samo sériové rozhraní.
9 600 bitů za sekundu a osm milisekund ticha
Přenos běží na 9 600 Bd se sudou paritou, jak si ho firmware nastavuje ve funkci IBusInit. Při jedenácti bitech na bajt je to necelý kilobajt za sekundu. Po téhle sběrnici tedy jezdí povely a krátké texty, nic objemnějšího.
Zajímavější je časování. Než modul začne vysílat, počká, až bude linka chvíli ticho. Konstanta IBUS_TX_FRAME_IDLE_WAIT je 8 milisekund a autor si k ní poznamenal, proč zrovna tolik: kdyby modul začal dřív, navigační grafická jednotka MK III ve verzi 20 začne rámce ztrácet. Rozepsaný rámec, do kterého 71 milisekund nic nepřibude, firmware zahodí a čeká na další.
Po odeslání modul poslouchá, jestli uslyší vlastní bajty. Když se vrátí, označí si rámec v ladicím výpisu jako [SELF]. Když se nevrátí do deseti period rámce, pošle ho znovu, nejvýš třikrát. Tenhle detail je zároveň nejnázornějším důkazem, jak sběrnice funguje: kdo na ni mluví, slyší sám sebe, protože ji sdílí se všemi ostatními.
Co se z toho dá vyčíst
Poslech je pasivní a levný. Z provozu na sběrnici se dá odečíst rychlost, otáčky, teplota chladicí kapaliny i venkovního vzduchu, stav dveří a oken, poloha klíče v zapalování nebo hodnoty palubního počítače. Všechno tohle má node-bmw-client vypsané ve svém webovém rozhraní. BlueBus zase podle provozu sleduje, které moduly ve voze vůbec jsou: kdo se ozývá, ten tam je.
Zápis je jiná věc. Vysílat umí oba projekty a z posluchače se tím stává účastník. Modul, který se rádiu ohlásí jako měnič CD, hraje hudbu. Modul, který si spletl bajt, umí zamknout dveře.
Zdroje: zdrojový kód projektu node-bmw-client (soubor lib/bus-data.js) a knihovny node-bmw-share (bus-modules.js), firmware BlueBus (firmware/application/lib/ibus.h a ibus.c), oboje ve větvi master ke 31. červenci 2026. Licence a data vzniku obou repozitářů jsou z rozhraní GitHubu, roky výroby E39 z anglické Wikipedie. Kontrolní součet v ukázce rámce jsme dopočítali sami podle pravidla z ibus.c.