2018年2月1日 星期四

BMW E38 深入行車電腦協議

由上一篇了解 BMW E38 電腦診斷接頭規格後接著上車實際驗證. OBDII / D-Bus 是以半雙工的方式傳送資料, 由診斷電腦送出命令到OBDII / D-Bus上, 命令中所呼叫的電腦(DME / EGS等)再回應. 以下實際來看看OBDII / D-Bus上的命令與回應.

偷窺D-Bus


作法很簡單就是攔截C310診斷電腦在D-Bus上發送與接收的資料 Baudrate 9600 8E1.
硬體需求 : OBDII 一公二母 Y 線, K+DCan 線組, C310診斷電腦, PC Notebook
                    
                    PC Notebook
                           +
                            |
                            |
 C310 +-----+----+ K+Dcan
                    |
                    |
                   +
       OBDII / K-Line



軟體需求 : PC Notebook上需要一支程式讀取顯示K+DCan線組上的資料

OS Ubuntu 16.04 執行以下程式

sudo stty -F /dev/ttyUSB0 raw
sudo stty -F /dev/ttyUSB0 -echo -echoe -echo
sudo stty -F /dev/ttyUSB0 9600 cs8 parenb -parodd -cstopb
sudo cat /dev/ttyUSB0 | hexdump -C

操作 C310 進入引擎系統DME, 在PC Notebook上可看到類似以下的輸出

...
00000190  00 3a b8 f1 12 2d 62 40  00 00 00 80 00 80 00 00  |.:...-b@........|
000001a0  00 00 4a 00 00 00 00 6d  6a 00 05 00 00 a8 d1 7f  |..J....mj.......|
000001b0  00 94 64 0c 80 0c 80 0c  80 0c 80 0c 80 0c 80 0c  |..d.............|
000001c0  40 0c 80 2a 

DME資料解析


這些資料經過整理以後16進位數值如下

12 04 94 82
12 04 94 82
12 04 94 82
12 04 00 16
12 04 00 16
12 04 00 16
12 04 94 82
12 04 94 82
12 04 94 82
12 04 00 16
12 04 00 16
12 04 00 16
b8 12 f1 01 a2 f8
b8 f1 12 2b e2 37 35 30 36 33 36 36 30 46 30 31 41 38  36 30 30 38 30 30 30 30 31 30 32 31 33 35 31 30  ff ff ff ff 30 30 30 30 38 33 38 32 38 99 
...

先看第一筆 12 04 94 82
12 : DME, 04 : 4 bytes, 94 : data, 82 checksum 剛好符合DS2的格式
後面跟著多筆 12 04 XX XX 而且看起來 DME 似乎沒有回應. 最後還兩筆b8 開頭的資料完全不符合DS2. 這是怎麼回事呢?

b8 開頭的資料其實是KWP2000的格式,結構如下
[ header ] [ target ][ source ][ size of data ][ data ] ... [ check sum ]

原來是 M62TU 的 DME 電腦 Bosch ME7.2 只支援 KWP2000

C310診斷電腦進入DME診斷時會先發送DS2格式的命令讀取DME的型號, 在發送幾次後沒有得到回應便改發送KWP2000格式的命令.

以下是DME回應的資料解讀, 透過與C310診斷電腦畫面比對可了解部份的內容

b8 f1 12 2b  
e2 
37 35 30 36 33 36 36 # 料號 7506366 
30 46 # 0F 硬體編號
30 31 # 01 編碼索引
41 38 # A8 診斷編號
36 30 # 60 匯流排索引
30 38 # 08 製造時間 星期
30 30 # 00 製造時間 年
30 30 31 30 32 31 # 供應商編號 001031 
33 35 31 30 
ff ff #
ff ff 30 30 30 30 38 33 38 32 38 99




BMW並沒有公開這些編碼的解讀方式, 只能透過比對來解碼. 網路上也有部份的資訊但很不完整.

https://github.com/inferiorhumanorgans/DS2PlusPlus/blob/master/dpp-json/dme/me-7.2/dme_me7_2.json

不過經過一番搜尋及研究發現還是有方法可以從INPA / EDIABAS的檔案 *.PRG 中分離出編碼的解譯表, 參考以下連結

http://eurokclub.bike/index.php?topic=2734.0

最後轉成excel的表格, 可以清楚看到哪個參數資料在第幾個byte,長度多少,轉換的乘數值,偏移值,單位.


與DME / EGS對話


知道資料格式就可以自己與DME溝通取的所需要的資訊, 例如轉速,水溫,空氣流量等.
以PC Notebook作為平台, python語言來寫軟體, 一樣透過K+DCan線組連接車身. 
原始碼如下


執行結果



除了DME之外EGS(變速箱)電腦也用同樣的方式成功取的資料. 值得注意的是EGS是走DS2協議, 同一條D-Bus上可走不同的協議.


目前可讀取的參數
DME : 轉速, 時速, 水溫, 水箱出水口溫度, 進氣溫度, 進氣流量, 節氣門開啟百分比等
EGS : 轉速, 變速箱油溫, 水溫, 檔位等

至此我們已經把手伸進DME / EGS電腦裡面, 下一步要脫離PC由獨立的硬體來整合上車.