<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    CAN 總線協議是什么

    CAN

    發現錯別字 8個月前 提問
    回答
    2
    瀏覽
    9601
    請勿發布不友善或者負能量的內容。與人為善,比聰明更重要!
    信息安全等級高級測評師 CISP-PTE
    最佳答案

    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。

    8個月前 / 評論
    回答數量: 2
    風險管理(專業級)RM/PL CICSA

    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.git
    apt-get install libsdl2-dev libsdl2-image-dev can-utils
    cd 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。

    8個月前 / 評論
    亚洲 欧美 自拍 唯美 另类