iT邦幫忙

0

[實作] 不用買貴森森的 Vector!我用 Python 自製了一套 J1939 CAN Bus 解碼器

  • 分享至 

  • xImage
  •  

上週 我的離線AI知識庫 文章很榮幸拿到了 Dev.to 的 Top Docker Author 獎章(感謝大家的技術交流!🙏),這週我想換個口味,從 AI 聊聊 重型車用網路 (Heavy Duty Vehicles)。

如果你是做 CAN Bus 或 SAE J1939(卡車、巴士、重機具)相關的工程師,一定懂這種痛:

專業工具貴到爆: 一套 Vector CANalyzer 的授權費動輒幾十萬台幣。

Hex 看不懂: 看到 18FEF100 這種 16 進位碼,除非你把 J1939 規格書背下來,不然根本不知道那是啥。

硬體相依性高: 想要測試程式,手邊通常得要有實體的轉接器 (PCAN, Kvaser) 和 ECU。

為了解決這些問題,我用 Python 寫了一個 J1939 Sniffer,它不但能自動將 PGN 解碼成人類看得懂的文字,還內建了 模擬模式 (Simulation Mode),讓你就算沒有硬體也能開發測試。

🏗️ 技術挑戰:解析 29-bit ID
標準的 CAN (11-bit) 相對簡單,但 J1939 使用的是 29-bit 擴展 ID (Extended Identifiers),這個 ID 裡面其實塞了非常多資訊:

Priority (3 bits):優先級

PGN (Parameter Group Number) (18 bits) <--- 這是最關鍵的部分,決定了這封包是什麼(例如車速、轉速)

Source Address (8 bits):來源位址(例如引擎 ECU)

當你收到一個原始 ID 像 0x18FEF100 時,你需要透過 位元運算 (Bitwise Operation) 把 PGN 挖出來,才能知道這封包的意義。

🐍 Python 解析邏輯 (Core Logic)
這是我用來從 29-bit 整數中提取 PGN 和 Source Address 的核心程式碼:

Python

def parse_j1939_id(can_id):
    """
    從 29-bit CAN ID 中提取 PGN 和 Source Address
    格式: [Priority(3)] [Reserved(1)] [Data Page(1)] [PDU Format(8)] [PDU Specific(8)] [Source Address(8)]
    """
    # 右移 8 位,把最後的 Source Address 丟掉
    # 再用 Mask (0x3FFFF) 取出中間的 18-bit PGN
    pgn = (can_id >> 8) & 0x3FFFF
    
    # 用 Mask (0xFF) 直接取出最後 8 bits 作為來源位址
    source_address = can_id & 0xFF
    
    # 右移 26 位,取出最前面的 3 bits 優先級
    priority = (can_id >> 26) & 0x7

    return pgn, source_address, priority

🛠️ 解決方案:Python GUI Sniffer
我使用 python-can 函式庫處理底層通訊,並用 Tkinter 寫了一個 GUI 來即時顯示上述邏輯的運算結果。

實際效果
程式不再顯示冷冰冰的 18FEF100,而是直接告訴你: 👉 CCVS - Vehicle Speed (車速)

收到 0CF00400 時,它會顯示: 👉 EEC1 - Engine Speed (引擎轉速)

https://ithelp.ithome.com.tw/upload/images/20251125/20180622HVxMMcq4FA.png

主要功能
🚛 自動 J1939 解碼: 內建常用 PGN 字典 (RPM, Temp, Speed, Battery),收到封包即時查表顯示。

🎮 內建模擬模式 (Simulation Mode): 這是開發者最需要的功能。點擊 "Start Demo",程式會自動產生擬真的 J1939 流量。不用坐在卡車上,也能驗證你的 UI 邏輯。

🔌 通用硬體支援: 基於工業標準的 python-can,所以支援 Vector, Peak-System (PCAN), Kvaser, SocketCAN (Linux/Raspberry Pi), 以及 slcan。

📥 開源與下載
我已經將這個專案的架構設計與 J1939 解析邏輯開源在 GitHub 上,歡迎大家 fork 下來當作自己專案的模板。

🔗 GitHub Repository: Python-CAN-Bus-J1939-Sniffer-GUI

🎁 給不想從頭造輪子的朋友: 如果你需要的是一套 完整、已封裝好、支援多執行緒與 CSV 紀錄 的 Production-Ready 原始碼,我也將其整理在 Gumroad 上,省去你自己刻 GUI 和除錯的時間。

🔥 黑五限時優惠: 輸入折扣碼 BLACKFRIDAY 可享全館工具 15% OFF。

👉 取得完整原始碼 (Gumroad)

Happy Hacking! 🚛

#Python #Automotive #J1939 #CANBus #Engineering #OpenSource #嵌入式


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言