본문 바로가기

조금은 전문적인 이야기/자동차 통신

Application Layer #2 - 세션 컨트롤


 자 오늘 다룰 부분은 통신의 시작과 끝인 세션 컨트롤이다. 일반적인 경우 세션은 몇 가지의 등급으로 나누어져 있으며, 각 세션 별로 할 수 있는 일이 정해져 있다. 그럼 늘 그렇듯이 OSI Layer 를 시작으로 알아보도록 하자. 7번에서는 이전에도 이야기를 했지만 프로토콜 별로 대부분 차이가 없어 동시에 다룰 예정이다. 세션 컨트롤에서는 세션을 이동하는 방법과 유지하는 방법, 그리고 세션을 닫는 방법에 대해서 설명할 것이다.  



 자료를 뒤지던 중에 좀더 직관적인 그래프를 찾았다. 같 프로토콜 별로 레이어별 정의되어 있는 문서가 있는 그래프인데, J1850 부터, KWP 2000, 그리고 CAN 과 UDS(Unified Diagnostic Services) 까지 모두 정의가 되어 있다. 관심있는 분들은 각 문서를 구해서 좀더 심화 학습을 할 수 있다. 어플리케이션 레이어를 보면 여지껏 다루었던 문서들의 이름이 있는데, UDS(Unified Diagnostic Services) 의 경우는 14229 로 정의가 되어 있다. 



 일단 세션에 대해 간단하게 설명을 하자면, 그림에서 보여지는 것 처럼 "Default session" 과 "Other session" 으로 나누어져 있으며 대부분 "Other session" 의 경우는 "Extended session" 이나 "Programming/Adjust session" 을 뜻한다. 일반적으로 두개의 세션간의 이동은 "Security control" 에 의해 막혀 있으며, 세션을 올리기 위해서는 "Seed key" 를 풀어야 하는 경우가 대부분 이다. 세션을 올려야 하는 이유는 말했듯이 할 수 있는 기능들이 차이가 나기 때문인데, 전에 포스팅한 부정응답 에서 세션관련 응답이 올 경우에는 세션을 변경해야 한다. 


 일반적으로 KWP2000 이나 ISO 9141 등의 경우에는 통신 시작과 동시에 "Default session" 이 오픈이 되며, CAN 과 J1850 의 경우는 기본적으로 "Default session" 은 오픈이 되어 있는 상태이다. 간혹 그렇지 않은 경우가 있기에 해당 명령에 대해서도 함께 설명을 하도록 하겠다. 


 먼저 사용할 수 있는 SID의 전체 리스트를 살펴보는데, 이는 기본적인 SID의 체계와 UDS 체계로 구분이 되어 진다. 사실 SID의 경우는 크게 차이가 나지는 않으며, UDS 에서 사용할 수 있는 명령의 갯수가 조금 많다. 그리고 가장 큰 차이는 PID 의 구성에 있다. 


일반 SID

일반적인 SID 리스트

UDS SID

UDS SID 리스트

 

 둘의 차이를 보면 UDS에서 약간 더 많은 SID를 사용 할 수 있는데, 각 세션별로 사용 할 수 있는 명령들에 대한 정의가 되어 있다. 저 명령들을 사용 하기 위해서는 세션을 바꿀 수가 있어야 한다. 그렇다면 기본적인 세션 컨트롤의 패턴을 보도록 하자.


 

 생각보다 간단하다. 0x10 이 바로 세션을 컨트롤 하는 SID 인데, 뒤에 붙는 PID 에 따라 열리는 세션이 틀려진다. 하지만 말이 PID 이지, PID 를 넣는다고 바로 열리는 것은 아니다. 대부분 아래 설명할 Security control 이 필요한 부분이 있기 때문이다. 일단 일반적인 경우와 UDS 의 PID 에 대해서 알아보자. 



 일반적인 경우의 세션 PID 리스트 이다. 크게 어려운 부분은 없으며, 열기를 원하는 각 세션에 대해 정의가 되어 있다. 이 리스트의 경우 기본 정의 문서이며, 각 제조사 별로 트윅이 되어 있는 부분이 있는데 다음과 같다. 



 이 자동차 회사에서는 세가지의 모드를 지원하며, 나머지 모드는 지원하지 않는다. Default 인 Standard 세션과 Programming 과 Extended 세션을 지원한다. 그렇다면 UDS 는 어떨까?



 UDS 의 PID 리스트 이다. 일반적인 형식과 아주 많이 차이가 난다. 일반적인 경우 8X 이후의 넘버링이였다면 이 녀석은 7F 이전의 넘버링인 것이다. 사용 할 수 있는 세션의 종류는 엇비슷 하다. 이제 어떤 식으로 세션 컨트롤 명령을 쓰는지 프로토콜 별로 예를 들어보도록 하겠다. 


KWP 2000/ISO 9141


81 10 F1 81 CS

83 F1 10 C1 8F EF CS         -> Communication open : Default session


82 10 F1 10 90 CS

81 F1 10 50 CS                  -> Session control : Extended session


82 10 F1 10 81 CS

81 F1 10 50 CS                   -> Session control : Default session


J1850


C4 10 F1 10 90                   -> Session control : Extended session

C4 F1 10 7F 10 90 00


C4 10 F1 10 81

C4 F1 10 7F 10 81 00           -> Session control : Default session


CAN


07E0 02 10 90                     -> Session control : Extended session

07E8 01 50


07E0 02 10 81

07E8 01 50                          -> Session control : Default session


UDS


07E0 02 10 03                      -> Session control : Extended session

07E8 01 50


07E0 02 10 01

07E8 01 50                          -> Session control : Default session


 자 생각보다 어렵지 않다. 일단 KWP 2000/ISO 9141 과 같이 Initialization 이 필요한 경우는 통신 오픈과 함께 Default session 이 오픈이 된다. 그리고 그 외의 경우는 대부분 Default session 은 오픈이 되어 있는 상태이며, 특정 기능을 위해서는 Extended session 을 오픈해 줘야 하는 것이다. 보안상의 이유로 상위 세션과 하위 세션을 나누어 놓은 것인데, 상위 세션의 기능이 필요 없을 경우 다시 Default session 으로 내려 주는 것이 옳바른 선택이다. 이유는 상위세션에서 다루는 명령들은 Adjustment 나 Calibration 등의 조금은 위험한(차량을 손상시킬 수 있는) 명령어들이 많기 떄문에, 실수로 명령을 쏘거나 잘 모르는 상태에서 사용을 하게 되면 차량이 고장나는 골치 아픈 경우가 생길 수 있기 때문이다. 


 여기서 저렇게 간단하면 얼마나 좋겠냐 만은...실제의 통신에서는 저런식으로 쉽게 이루어 지지 않는다. 대부분 세션 관련 부정응답을 보게 되는데, 사유는 상위 세션으로 가기 위해서는 Security control 을 사용해야 하기 때문이다. 



이런 식으로 시큐리티를 통과를 해야 세션의 이동이 되는 경우가 대부분이다. 시큐리티의 방식은 제조사 별로 다양하며, Seed key 를 이용한 Calculation 방식과 차량과 함께 제공이 되는 PIN 을 이용한 방식이 있다. 



 일반적인 시큐리티의 패턴이다. 27 로 시작하는 이 명령어는 뒤에 붙는 PID 에 따라 열리는 세션이 틀려진다. Security control 을 사용해서 세션을 바꿀 경우 대부분은 별도의 Session control 명령은 필요 하지 않다.


일반 PID

일반적인 PID 리스트

UDS PID

UDS PID 리스트


 PID를 보면 알 수 있듯이 일반적인 경우와 UDS 의 경우로 나누어 지는데, UDS 가 좀더 사용 할 수 있는 범위가 크다. 하지만 대부분 01, 03 번을 사용하기 때문에, 시큐리티의 경우는 두 프로토콜이 동일하다고 볼 수도 있다. 사용 되는 방식은 홀수번호(01, 03, 05) 로 Seed key 를 요청하고 짝수번호(02, 04, 06)으로 Send key 를 보내는 방식이다. 이 경우는 Seed Calculation 방식이며, PIN 방식의 경우는 홀수번호로 시드키를 요청할 필요가 없다. 


Seed calculation 방식


82 10 F1 27 01 CS

84 F1 10 67 12 34 CS       -> Seed : 12 34


84 10 F1 27 02 56 78 CS

83 F1 10 67 02 34 CS       -> Security pass


PIN 방식


84 10 F1 27 02 AB CD CS     -> PIN : AB CD

83 F1 10 67 02 34 CS


 Seed 방식의 경우 바이트의 길이는 2 바이트로 정해져 있는 것은 아니며, 6개 바이트 까지 사용하는 경우를 봤다. 게다가 각 제조사 별로 변환식이 모두 다르기 때문에, 해당 변환식은 모두 분석을 통해 찾아내야 한다. PIN 방식의 경우또한 4~6 자리의 숫자 혹은 문자로 이루어 져 있으며, 대부분 자동차와 함께 제공이 되는 Security card 에 적혀 있다. 만일 Security card 를 잃어 버리거나 제공이 되지 않은 경우 각 제조사의 딜러쉽에 VIN 번호와 함께 약간의 금액을 지불하면 받을 수 있다. 


 자 그렇다면 이런식으로 세션이 오픈이 된다고 하면, 그냥 유지가 되는 것은 아니다. KWP2000/ISO 9141 의 경우 Default session 의 유지를 위해서도 "Tester present" 라는 세션 유지 명령을 보내줘야 하는데, 확장세션의 경우도 마찬가지이다. CAN/J1850 의 경우 Default session 은 유지가 되지만 확장세션 유지를 위해서는 마찬가지로 해당 명령어를 보내줘야 한다.


일반 Tester present

일반적인 Tester present


UDS Tester present

UDS Tester present


 자 테스터 Present 의 경우 일반적인 경우와 UDS 의 차이가 있다. 일반적인 경우 PID 가 없이 3E 의 명령만 보내는 형식으로 되어 있는 반면, UDS 의 경우는 PID 가 붙는다. 



 PID 는 이렇게 정의가 된다. 주로 사용되는 PID 는 0x00 과 0x80 인데, 나머지의 경우는 제조사 맘대로 이다. 간혹 특이한 케이스로 Security control 을 위한 특이한 형태의 Tester present 도 있는데, 흔하지 않다. 일반적으로 쓰이는 두가지 PID 의 차이는 0x00 의 경우는 응답을 요구하는 코드이고 0x80 은 응답을 요구하지 않는 코드라는 점이다. 


일반적인 Tester present


07E0 01 3E 

07E8 01 7E


UDS Tester present


07E0 02 3E 00                -> 응답 요구

07E8 01 7E


07E0 02 3E 80                -> 응답 없음

...

07E0 02 3E 80


 이제 마지막으로 일괄적으로 세션을 닫아 버리는 명령을 설명하도록 하겠다. 이 명령의 경우 통신을 종료하거나 강제로 세션을 닫아야 할 경우 필요한 명령인데, 강제구동이나 부정응답 펜딩등의 사유로 통신이 꼬여버렸을 경우 유용하게 사용이 된다. 



 이 명령을 사용하게 되면 열려있던 상위 세션이 모두 닫히며, Default session 으로 초기화가 된다. 다만 이 명령은 ECU 의 SW 나 HW 의 리셋을 해주는 명령이 아니며, 통신 라인을 닫아버리는 명령이다. 이후에 Reset 명령들에 대해 설명을 하겠지만, 그 명령들과는 사용법 자체가 틀리다. 


 오늘은 통신 시작과 명령어의 사용을 위한 세션 컨트롤을 살펴 봤다. 사실 이 부분은 2번에서 연계가 되는 부분이기도 한데, 부가적으로 설명할 부분들도 있고 이에 대한 개념이 제대로 잡히지 않으면, 실제 차량 테스트에서 큰 혼동을 일으킬 수가 있어서 많이 풀어서 설명을 했다. 이제까지 포스팅을 제대로 읽고 따라왔다면 그리 어렵지 않게 이해를 할 수 있을 것이라 생각 한다.