首頁 >後端開發 >Python教學 >CAN總線速度轉換器

CAN總線速度轉換器

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-06 06:08:31411瀏覽

CANBUS Speed Converter

此 Python 腳本使用由 Tshark 匯出的值組成的文字檔案。此導出列嚴格由每個 CANBUS 有效負載組成,它是 5 位元組十六進位值。 (10 個字元)此程式將 CANBUS 十六進位值轉換為 KPH 或 MPH。

這是我用來從 CanID589.pcap 中提取此資訊的命令,該命令本身是從 Wireshark 導出的對 CANBUS ID 589(指速度)的剖析。還有 32 種其他不同類型的 CANBUS ID,但我們目前不需要關心這些值。


┌──(kali㉿Z3r0)-[/media/sf_Shared_Kali/NCL Doc/scanningrecon]
└─$ tshark -r CanID589.pcap -T fields -e data.data > Data_speed.txt



(-r) 讀取現有的 pcap 文件,而 (-T fields) 指示 Tshark 輸出特定欄位(而不是完整的資料包詳細資料、摘要或原始資料)。這是一種自訂輸出的方法,僅提取所需的信息,而不是轉儲所有資料包資料。 -e 選項用於指定要從資料包中提取哪些欄位。在這種情況下,data.data表示每個封包的資料位元組。 「data.data」指十六進位形式的 CANBUS 訊框的實際內容(有效負載)。我必須嘗試不同的值,直到將正確的數據匯出到文字檔案。

這裡是與 CAN 協定相關的不同欄位的清單。

  • can.id:CAN 標識符欄位(CAN ID)
  • can.dlc:資料長度代碼(存在多少資料位元組)
  • can.data:負載資料
  • can.errorframe:CAN錯誤影格
  • data.data:原始位元組資料(這是該腳本使用的)

這也可以針對每個資料包單獨完成,但我有 352 個不同的 Can.ID =“589”(速度)資料包來迭代


def format_hex_value(hex_value):
    # Tshark exported specific packets to column data.data unformatted.
    return ' '.join(hex_value[i:i+2] for i in range(0, len(hex_value), 2))

def calculate_speed_from_hex_value(hex_value):
    # 5 byte check 
    if len(hex_value) < 10:
        raise ValueError("Hex value must have at least 10 characters for 5 bytes")

    # Extract the relevant bytes from payload (the last two bytes)
    high_byte = int(hex_value[-4:-2], 16)  
    low_byte = int(hex_value[-2:], 16)

    speed = (high_byte << 8) + low_byte  
    # Example: 00 00 00 04 e1 - (04 << 8) + e1 = 1024 + 225 = 1249

    # Convert speed from centi-KPH to KPH then to MPH
    speed_kph = speed / 100.0  # Assuming the value is in centi-KPH
    speed_mph = speed_kph * 0.621371  # Convert KPH to MPH

    return speed_mph

def main():
    speeds = []

    with open('data_speed.txt', 'r') as file:
        for line in file:
            hex_value = line.strip() 

            if hex_value:  

                formatted_hex_value = format_hex_value(hex_value)
                print(f"Formatted Hex Value: {formatted_hex_value}")  

                try:
                    # Calculate speed and store it in the speeds list
                    speed_mph = calculate_speed_from_hex_value(hex_value)
                    speeds.append(speed_mph)
                    print(f"Calculated Speed: {speed_mph:.2f} MPH")
                except ValueError as e:
                    print(f"Error processing value '{hex_value}': {e}")


    speeds.sort() 
    #Sort lowest to highest

    print("\nFinal Sorted Speeds (MPH):")
    for speed in speeds:
        print(f"{speed:.2f} MPH")

if __name__ == "__main__":
    main()




如果有人有任何問題、意見、補充或建設性批評,請隨時與我聯絡。謝謝你

以上是CAN總線速度轉換器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn