ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DoIP 메시지 분석
    diagnostic 2025. 4. 29. 00:42

    시작하기 전에 

     

    DoIP (Diagnostic over Internet Protocol) - 하드웨어 설정 :: hsl's tsmaster 사용기 에서 DoIP의 메시지는 TCP 메시지의 페이로드이고, TCP 메시지는 IP 메시지의 페이로드이고, IP 메시지는 이더넷 메시지의 페이로드라는 것을 설명하였다. 그리고 DoIP 메시지의 페이로드는 UDS 메시지이다. 이 UDS 메시지는 CAN의 UDS 메시지와 동일하다.

     

    DoIP (Diagnostic over Internet Protocol) - 메시지 해석 :: hsl's tsmaster 사용기 에서  Ethernet Trace 창에서 이더넷 메시지의 헤더와 페이로드를, 이더넷 메시지의 페이로드인 IP 메시지에서 헤더와 페이로드를, IP 메시지의 페이로드인 TCP 메시지에서 헤더와 페이로드를, TCP 메시지의 페이로드인 DoIP 메시지에서 헤더와 페이로드를, DoIP 메시지의 페이로드인 UDS 메시지를 보는 방법을 설명하였다. 간단하다. 마우스로 데이터를 클릭하면 데이터에 해당하는 메시지 요소가 하이라이트된다. 

     

    이런저런 연유로 DoIP 통신을 측정한 asc 파일을 분석하게 되었다. 앞으로 이런 분석을 여러 차례 더 할 것 같은 예감이다. 이 기회에 DoIP 통신을 측정한 asc 파일을 분석하는 툴을 만들어 두면 앞으로 유용할 것 같은 생각이 들었다. 나는 그런 툴을 만들 프로그래밍 능력이 없다. ai 코딩이 있기에 도전할 생각이 들었다. Claude.ai와 함께 툴을 만들었다. 일요일 저녁에 착수하였다. 월요일 오전에 기본 기능들을 완성하였다. 

     

     

    개요

    • DoIP 통신을 측정한 asc 파일 분석
    • asc 파일을 xlsx로 변환하기
    • DoIP 메시지 분석하기

     

     

    DoIP 통신을 측정한 asc 파일 분석

    • 내가 분석한 파일의 시작 부분은 아래와 같다. 
    date Fri Sep 13 02:57:32.035 pm 2024
    base hex  timestamps absolute
    internal events logged
    // version 16.2.0
    // Measurement UUID: 8f6e9e0a-7641-444b-9606-158020c610f2
    Begin TriggerBlock Fri Sep 13 02:57:32.035 pm 2024
       0.000000 Start of measurement
       0.000184 ETH 1 STAT Link:Link_up Ports:ECU
       0.000464 ETH 1 STAT Link:Link_up LinkSpeed:100Mbit/s Physical:IEEE802.3 Duplex:Full MDI:Crossover Connector:RJ45 Ports:Port5
       0.000559 ETH 1 STAT Link:Link_up LinkSpeed:1000Mbit/s Physical:IEEE802.3 Duplex:Full MDI:Direct Connector:RJ45 BRClockMode:Slave Ports:Port6
       0.089961 ETH 1 BUSSTATISTIC HwRxPkts:0 HwTxPkts:0 HwRxError:0 HwTxError:0 HwRxBytes:0 HwTxBytes:0 HwRxNoBuffer:0 HwSQIValue:6 Ports:ECU
       0.100263 ETH 1 BUSSTATISTIC HwRxPkts:0 HwTxPkts:0 HwRxError:0 HwTxError:0 HwRxBytes:0 HwTxBytes:0 HwRxNoBuffer:0 HwSQIValue:6 Ports:Port5
       0.100373 ETH 1 BUSSTATISTIC HwRxPkts:0 HwTxPkts:0 HwRxError:0 HwTxError:0 HwRxBytes:0 HwTxBytes:0 HwRxNoBuffer:0 HwSQIValue:6 Ports:Port6
       0.189962 ETH 1 BUSSTATISTIC HwRxPkts:0 HwTxPkts:0 HwRxError:0 HwTxError:0 HwRxBytes:0 HwTxBytes:0 HwRxNoBuffer:0 HwSQIValue:6 Ports:ECU
       0.200263 ETH 1 BUSSTATISTIC HwRxPkts:0 HwTxPkts:0 HwRxError:0 HwTxError:0 HwRxBytes:0 HwTxBytes:0 HwRxNoBuffer:0 HwSQIValue:6 Ports:Port5
       0.200374 ETH 1 BUSSTATISTIC HwRxPkts:0 HwTxPkts:0 HwRxError:0 HwTxError:0 HwRxBytes:0 HwTxBytes:0 HwRxNoBuffer:0 HwSQIValue:6 Ports:Port6
       0.257025  ETH 1 Rx     46:333300000002A81374BD389D86DD6000000000103AFFFE800000000000004C705F11449FCF51FF0200000000000000000000000000028500674D000000000101A81374BD389D FCS:734d6816 Ports:Port6 Sim:0
       0.257025  ETH 1 Tx     46:333300000002A81374BD389D86DD6000000000103AFFFE800000000000004C705F11449FCF51FF0200000000000000000000000000028500674D000000000101A81374BD389D Ports:ECU Sim:0
       0.257032  ETH 1 Tx     46:333300000002A81374BD389D86DD6000000000103AFFFE800000000000004C705F11449FCF51FF0200000000000000000000000000028500674D000000000101A81374BD389D FCS:734d6816 Ports:Port5 Sim:0
       0.272157  ETH 1 Rx     9d:333300010002A81374BD389D86DD60054E1700671101FE800000000000004C705F11449FCF51FF0200000000000000000000000100020222022300672D4501D30E160008000202BF0001000E000100012A621DD5A81374BD389D0003000C0DA81374000000000000000000270011000F4445534B544F502D4B524E4E5330370010000E0000013700084D53465420352E30000600080011001700180027 FCS:40a51d09 Ports:Port6 Sim:0
       0.272157  ETH 1 Tx     9d:333300010002A81374BD389D86DD60054E1700671101FE800000000000004C705F11449FCF51FF0200000000000000000000000100020222022300672D4501D30E160008000202BF0001000E000100012A621DD5A81374BD389D0003000C0DA81374000000000000000000270011000F4445534B544F502D4B524E4E5330370010000E0000013700084D53465420352E30000600080011001700180027 Ports:ECU Sim:0
       0.272170  ETH 1 Tx     9d:333300010002A81374BD389D86DD60054E1700671101FE800000000000004C705F11449FCF51FF0200000000000000000000000100020222022300672D4501D30E160008000202BF0001000E000100012A621DD5A81374BD389D0003000C0DA81374000000000000000000270011000F4445534B544F502D4B524E4E5330370010000E0000013700084D53465420352E30000600080011001700180027 FCS:40a51d09 Ports:Port5 Sim:0
       0.289962 ETH 1 BUSSTATISTIC HwRxPkts:0 HwTxPkts:2 HwRxError:0 HwTxError:0 HwRxBytes:0 HwTxBytes:251 HwRxNoBuffer:0 HwSQIValue:6 Ports:ECU
       0.300264 ETH 1 BUSSTATISTIC HwRxPkts:0 HwTxPkts:2 HwRxError:0 HwTxError:0 HwRxBytes:0 HwTxBytes:251 HwRxNoBuffer:0 HwSQIValue:6 Ports:Port5
       0.300375 ETH 1 BUSSTATISTIC HwRxPkts:2 HwTxPkts:0 HwRxError:0 HwTxError:0 HwRxBytes:251 HwTxBytes:0 HwRxNoBuffer:0 HwSQIValue:6 Ports:Port6
       0.389963 ETH 1 BUSSTATISTIC HwRxPkts:0 HwTxPkts:0 HwRxError:0 HwTxError:0 HwRxBytes:0 HwTxBytes:0 HwRxNoBuffer:0 HwSQIValue:6 Ports:ECU
       0.400265 ETH 1 BUSSTATISTIC HwRxPkts:0 HwTxPkts:0 HwRxError:0 HwTxError:0 HwRxBytes:0 HwTxBytes:0 HwRxNoBuffer:0 HwSQIValue:6 Ports:Port5
       0.400375 ETH 1 BUSSTATISTIC HwRxPkts:0 HwTxPkts:0 HwRxError:0 HwTxError:0 HwRxBytes:0 HwTxBytes:0 HwRxNoBuffer:0 HwSQIValue:6 Ports:Port6
       0.468434  ETH 1 Rx     52:FFFFFFFFFFFF0200000010010800450000445756000040116654A9FE1301FFFFFFFF34583458003092C202FD0004000000204B4E4D3233303941523130305650323531100102000000100100000000000100 FCS:7d8d192 Ports:Port5 Sim:0
       0.468435  ETH 1 Tx     52:FFFFFFFFFFFF0200000010010800450000445756000040116654A9FE1301FFFFFFFF34583458003092C202FD0004000000204B4E4D3233303941523130305650323531100102000000100100000000000100 Ports:ECU Sim:0
       0.468435  ETH 1 Tx     52:FFFFFFFFFFFF0200000010010800450000445756000040116654A9FE1301FFFFFFFF34583458003092C202FD0004000000204B4E4D3233303941523130305650323531100102000000100100000000000100 FCS:7d8d192 Ports:Port6 Sim:0
       0.489964 ETH 1 BUSSTATISTIC HwRxPkts:0 HwTxPkts:1 HwRxError:0 HwTxError:0 HwRxBytes:0 HwTxBytes:94 HwRxNoBuffer:0 HwSQIValue:6 Ports:ECU
       0.500265 ETH 1 BUSSTATISTIC HwRxPkts:1 HwTxPkts:0 HwRxError:0 HwTxError:0 HwRxBytes:94 HwTxBytes:0 HwRxNoBuffer:0 HwSQIValue:6 Ports:Port5
       0.500376 ETH 1 BUSSTATISTIC HwRxPkts:0 HwTxPkts:1 HwRxError:0 HwTxError:0 HwRxBytes:0 HwTxBytes:94 HwRxNoBuffer:0 HwSQIValue:6 Ports:Port6
       0.589964 ETH 1 BUSSTATISTIC HwRxPkts:0 HwTxPkts:0 HwRxError:0 HwTxError:0 HwRxBytes:0 HwTxBytes:0 HwRxNoBuffer:0 HwSQIValue:6 Ports:ECU
       0.600266 ETH 1 BUSSTATISTIC HwRxPkts:0 HwTxPkts:0 HwRxError:0 HwTxError:0 HwRxBytes:0 HwTxBytes:0 HwRxNoBuffer:0 HwSQIValue:6 Ports:Port5
       0.600377 ETH 1 BUSSTATISTIC HwRxPkts:0 HwTxPkts:0 HwRxError:0 HwTxError:0 HwRxBytes:0 HwTxBytes:0 HwRxNoBuffer:0 HwSQIValue:6 Ports:Port6
       0.689965 ETH 1 BUSSTATISTIC HwRxPkts:0 HwTxPkts:0 HwRxError:0 HwTxError:0 HwRxBytes:0 HwTxBytes:0 HwRxNoBuffer:0 HwSQIValue:6 Ports:ECU
       0.700267 ETH 1 BUSSTATISTIC HwRxPkts:0 HwTxPkts:0 HwRxError:0 HwTxError:0 HwRxBytes:0 HwTxBytes:0 HwRxNoBuffer:0 HwSQIValue:6 Ports:Port5
       0.700378 ETH 1 BUSSTATISTIC HwRxPkts:0 HwTxPkts:0 HwRxError:0 HwTxError:0 HwRxBytes:0 HwTxBytes:0 HwRxNoBuffer:0 HwSQIValue:6 Ports:Port6

     

    • 초기 몇 줄은 메타 데이터이다. DoIP 분석과 무관하다. 
    • 이더넷 메시지는 한 줄에 표시된다. 그리고 타임스탬프로 시작한다.
    • Start, STAT, BUSSTATISTIC 등의 단어가 포함된 줄은 이더넷 메시지가 아니다. 
    • 이더넷 메시지의 구조는 아래와 같다.
      • 0.257025: 타임 스탬프
      • ETH: Ethernet 메시지라는 표시라고 짐작한다. CAN 등 다른 타입과 구분하기 위한 용도로 생각한다.
      • 1: 채널일 것으로 짐작한다.
      • Rx: 수신 메시지 표시이다. 송신 메시지 표시는 Tx이다.
      • 46:333300000002A81374BD389D86DD6000000000103AFFFE800000000000004C705F11449FCF51FF0200000000000000000000000000028500674D000000000101A81374BD389D: 이더넷 메시지. 맨 앞에 46:는 무엇인지 모르겠다.
      • FCS:734d6816: Frame Check Sequence
      • Ports:Port6: Port
      • Sim:0: 무엇인지 모르겠다. 
       0.257025  ETH 1 Rx     46:333300000002A81374BD389D86DD6000000000103AFFFE800000000000004C705F11449FCF51FF0200000000000000000000000000028500674D000000000101A81374BD389D FCS:734d6816 Ports:Port6 Sim:0
    • 먼저, asc 파일에서 이더넷 메시지들만 추리고, 이더넷 메시지를 ts, type, ch, tx_rx, data, fcs, port, sim 으로 분해하여 xlsx 파일로 저장하는 프로그램을 작성하고, xlsx를 읽어서 data(이더넷 메시지)를  파싱(parsing)하는 프로그램을 작성하기로 한다.

     

    asc 파일을 xlsx로 변환하기

     

     

    DoIP 메시지 분석하기

    • xlsx를 읽어서 행 번호를 선택하면, 그 행의 data(이더넷 메시지)를 Ethernet, IP, TCP/UDP, DoIP, UDS로 분해하고, 각 부분의 상세 내용을 표시하는 웹앱을 작성하였다. 메시지의 각 부분의 색깔을 달리하여 쉽게 찾아볼 수 있도록 하였다. 
    • 아래 링크에서 doip_analyzer.py를 직접 사용해볼 수 있다.

    • 웹앱은 claude.ai와 협업하여 개발하였다. 

    doip_analyzer.py
    0.08MB
    obd_ethernet_log.new.xlsx
    0.05MB

     

    • 사용 방법은 아래와 같다.
      • doip_analyzer.py를 하드디스크에 저장한다.
      • doip_analyzer.py가 저장된 디렉토리 아래에 asc 디렉토리를 만든다.
      • asc 디렉토리에 obd_ethernet_log.new.xlsx를 저장한다.
      • doip_analyzer.py가 있는 디렉토리에서 커맨드라인 창을 연다. 
      • 커맨드라인 창에 아래와 같이 입력하여 실행한다.
    streamlit run doip_analyzer.py
    • 프로그램이 실행되면 Raw Packet Data 영역의 숫자 입력창에 숫자를 입력하거나, +, - 기호를 클릭하여 분석할 이더넷 메시지의 행 번호를 입력한다.

    분석할 이더넷 메시지의 행 번호를 입력한다.

    • 분석할 이더넷 메시지가 표시되고, 상세 정보가 Packet Analysis 영역에 표시된다. 

     

    결론

    • 통신 메시지는 헤더와 페이로드로 구성된다는 것을, 이더넷 메시지의 페이로드가 IP 메시지인 것을, IP 메시지의 페이로드가 TCP/UDP 메시지인 것을, TCP 메시지의 페이로드가 DoIP 메시지인 것을, DoIP 메시지의 페이로드가 UDS 메시지인 것을 기억하면 이더넷 메시지들에서 DoIP 메시지를 구분해내고, DoIP 메시지가 UDS의 무슨 서비스를 요청 혹은 응답하는지 어렵지 않게 알 수 있다. 
    • 통신은 많은 데이터를 분석해야 하기에 별것 아닌 툴도 큰 도움이 된다. 
    • ai 코딩 지원으로 엔지니어들은 자기 업무에 적합한 툴을 어렵지 않게 자작할 수 있게 되었다. 그렇다고 상용 툴이 자작 툴로 전부 대체될 것이라고 생각하지는 않는다.
    • ai 코딩의 영향으로 api를 충실하게 제공하는 상용 툴이 주목 받지 않을까? 어떤 툴이 얼마나 개방적인지는 그 툴의 미래를 결정하는 중요한 요소가 될 것이라고 생각한다.   

     

     

    목차 :: hsl's tsmaster 사용기