SOF(幀開始): 通知其他ECU消息進入
CAN-ID: 包含消息的優先級位和ECU的功能地址(就網絡而言,CAN-ID就像mac地址一樣,但不一樣)
RTR: 遠程傳輸請求允許ECU從網絡上其他活動的ECU請求消息
控制: 以字節為單位通知數據長度
數據: 包含要通過協議傳輸的數據值
CRC: 用于錯誤糾正和數據完整性的循環冗余值
ACK: 表示CRC處理狀態
EOF:幀結束標記CAN消息幀的結束
現在,對于網絡數據包分析,我們只需要擔心 CAN-ID, CONTROL 和 DATA
Wireshark中的CAN總線流量
正如我們在Wireshark中看到的那樣,CAN總線是事件驅動的,當ECU通過某些操作(例如,換檔,指示器開/關,門鎖/解鎖等)生成數據時,它會立即在網絡上廣播,而不會發出任何消息排序。因此,如果我們要查找特定ECU的CAN-ID,則很難通過系統中其他活動ECU生成的數據噪聲來查找。幸運的是,Linux獲得了名為can-utils的開源軟件套件。 16這使我們能夠創建用于CAN流量處理和嗅探的網絡接口。它具有名為candump的實用程序,可以顯示,過濾和記錄CAN數據到文件。
設置虛擬CAN網絡以進行試驗和娛樂
因此,我們大多數人都不敢動手去購買一些硬件并與實際車輛混為一談,但仍然想知道CAN流量如何實時運行。解決方案是ICSim 16 (用于SocketCAN的儀器集群模擬器)是虛擬CAN網絡上的車輛儀表盤數據模擬器。
編譯ICSim的步驟git clone https://github.com/zombieCraig/ICSim.gitapt-get install libsdl2-dev libsdl2-image-dev can-utilscd ICSim && make && ./setup_vcan.sh
使用默認的硬編碼CAN-ID啟動ICSim
./icsim vcan0./controls vcan0
現在根據CAN-ID短路更改數據
cansniffer vcan0 #Any CAN interface of your choice
選擇控制窗口,然后按向上箭頭鍵提高速度,您會注意到cansniffer輸出中的CAN-ID更改值很多,因此CAN-ID用于發動機ECU傳輸的車輛速度數據。您還可以在Wireshark中捕獲該流量并將其保存以備進一步分析。根據源代碼文件icsim.c,速度數據的默認仲裁/ CAN-ID為0x244。
Scapy最近增加了對CAN協議層的支持,因此現在您可以在python中進行各種數據分析。下面的基本腳本將來自CAN-ID的所有十六進制值保存在數組中,并找到最小和最大速度。可以使用matplotlib完成更酷的事情,以創建速度數據圖,以了解車輛由于道路交通而減速的次數。
from scapy.all import *
import struct
load_layer("can") #Allows us to work with CAN-bus network layer please note that it only works with latest veersion of ScaPy library
can_packets = rdpcap('canbus-traffic-capture.pcap')
CAN_ID = #Your desired CAN-ID for vehicle speed data in hex format
raw_data = []
for x in can_packets:
if x["CAN"].identifier == int(CAN_ID, 16):
data = x["CAN"].data.hex()
raw_data.append(data[10:]) #From traffic analysis we know that speed data only 4-bit long out of 14-bit hex string
raw_data = list(set(raw_data))
print("Raw RPM data in hex: " + str(raw_data))
delta_rpm = []
for y in raw_data:
delta_rpm.append(int(y, 16))
回答所涉及的環境:聯想天逸510S、Windows 10。
CAN是控制器局域網總線,是一種用于實時應用的串行通訊協議總線,它可以使用雙絞線來傳輸信號,是世界上應用最廣泛的現場總線之一。CAN協議用于汽車中各種不同元件之間的通信,以此取代昂貴而笨重的配電線束。該協議的健壯性使其用途延伸到其他自動化和工業應用。CAN協議的特性包括完整性的串行數據通訊、提供實時支持、傳輸速率高達1Mb/s、同時具有11位的尋址以及檢錯能力。
CAN總線特征如下:
報文(Message)總線上的數據以不同報文格式發送,但長度受到限制。當總線空閑時,任何一個網絡上的節點都可以發送報文。
信息路由(Information Routing)在CAN中,節點不使用任何關于系統配置的報文,比如站地址,由接收節點根據報文本身特征判斷是否接收這幀信息。因此系統擴展時,不用對應用層以及任何節點的軟件和硬件作改變,可以直接在CAN中增加節點。
標識符(Identifier) 要傳送的報文有特征標識符(是數據幀和遠程幀的一個域),它給出的不是目標節點地址,而是這個報文本身的特征。信息以廣播方式在網絡上發送,所有節點都可以接收到。節點通過標識符判定是否接收這幀信息。
數據一致性應確保報文在CAN里同時被所有節點接收或同時不接收,這是配合錯誤處理和再同步功能實現的。
位傳輸速率不同的CAN系統速度不同,但在一個給定的系統里,位傳輸速率是唯一的,并且是固定的。
優先權 由發送數據的報文中的標識符決定報文占用總線的優先權。標識符越小,優先權越高。
遠程數據請求(Remote Data Request) 通過發送遠程幀,需要數據的節點請求另一節點發送相應的數據。回應節點傳送的數據幀與請求數據的遠程幀由相同的標識符命名。
仲裁(Arbitration) 只要總線空閑,任何節點都可以向總線發送報文。如果有兩個或兩個以上的節點同時發送報文,就會引起總線訪問碰撞。通過使用標識符的逐位仲裁可以解決這個碰撞。仲裁的機制確保了報文和時間均不損失。當具有相同標識符的數據幀和遠程幀同時發送時,數據幀優先于遠程幀。在仲裁期間,每一個發送器都對發送位的電平與被監控的總線電平進行比較。如果電平相同,則這個單元可以繼續發送,如果發送的是“隱性”電平而監視到的是“顯性”電平,那么這個單元就失去了仲裁,必須退出發送狀態。
總線狀態 總線有“顯性”和“隱性”兩個狀態,“顯性”對應邏輯“0”,“隱性”對應邏輯“1”。“顯性”狀態和“隱性”狀態與為“顯性”狀態,所以兩個節點同時分別發送“0”和“1”時,總線上呈現“0”。CAN總線采用二進制不歸零(NRZ)編碼方式,所以總線上不是“0”,就是“1”。但是CAN協議并沒有具體定義這兩種狀態的具體實現方式。
故障界定(Confinement) CAN節點能區分瞬時擾動引起的故障和永久性故障。故障節點會被關閉。
應答接收節點對正確接收的報文給出應答,對不一致報文進行標記。
CAN通訊距離最大是10公里(設速率為5Kbps),或最大通信速率為1Mbps(設通信距離為40米)。
CAN總線上的節點數可達110個。通信介質可在雙絞線,同軸電纜,光纖中選擇。
報文是短幀結構,短的傳送時間使其受干擾概率低,CAN有很好的校驗機制,這些都保證了CAN通信的可靠性。
回答所涉及的環境:聯想天逸510S、Windows 10。