위 네 파일들이 내가 진단 요청과 응답 메시지들의 m_id 쌍을 찾기 위해서 베뉴에서 측정한 데이터 파일들이다.
defshow_diag_msgs_in_blf(blf) -> (list, list):'''
blf 파일을 읽어서 진단 통신 메시지의 아이디들을 추출한다.
요청과 응답 메시지들의 m_id 쌍을 리스트로 반환한다.
펑셔널 요청에 응답하는 m_id들을 리스트로 반환한다.
처리 결과를 파일에 저장한다. 파일 이름은 blf 파일 이름에 _diag_msgs.txt를 붙인다.
'''# blf 파일을 읽는다.
log = can.io.BLFReader(blf)
i_msg = 0
i_diag = 0# 진단 요청 m_id와 응답 m_id 쌍을 저장할 리스트
m_id_req_resp_pairs = []
# 펑셔널 요청의 m_id는 0x7DF이다. 스캐닝을 통해서 찾았다.
m_id_func = 0x7DF# 펑셔널 요청에 응답하는 m_id를 저장할 리스트
m_ids_responding_to_functional_request = []
# 결과를 저장할 파일 이름
output_file = blf.stem + '_diag_msgs.txt'withopen(output_file, 'w') as f:
# blf 파일의 정보를 출력한다.print(f'blf: {blf.name:60}{blf.stat().st_size:12,} bytes\n', file=f)
for msg in log:
# 진단 통신 메시지만 처리한다.# 진단 통신 메시지의 m_id는 0x700 이상이다.# 요청 메시지는 Tx, 응답 메시지는 Rx이다.# Read Data By Identifier (ECU ID, Software Version), Read DTC, Tester Present 요청으로 스캐닝을 하였다. # 요청 메시지를 찾는다.if (msg.arbitration_id >= 0x700) and (not msg.is_rx):
i_diag += 1if (msg.data[1] == 0x22): # Read Data By Identifierif (msg.data[2] == 0xF1) and (msg.data[3] == 0x00): # Read ECU ID
diag_req = 'Read ECU ID'elif (msg.data[2] == 0x10) and (msg.data[3] == 0x00): # Read Sotware Version
diag_req = 'Read Software Version'elif (msg.data[1] == 0x19): # Read DTC
diag_req = 'Read DTC'elif (msg.data[1] == 0x3E): # Tester Present
diag_req = 'Tester Present'else: # Unknown
diag_req = 'Unknown'
i_msg_prev = i_msg
msg_prev = msg
# 응답 메시지를 찾는다.if (msg.arbitration_id >= 0x700) and (msg.is_rx):
# TP (Transport Protocol)의 PCI (Protocol Control Information)를 확인한다.
pci = msg.data[0] & 0xF0if pci == 0x20: # Consecutive Frameif msg_prev.arbitration_id == m_id_func:
m_ids_responding_to_functional_request.append(msg.arbitration_id)
else:
m_id_req_resp_pairs.append((msg_prev.arbitration_id, msg.arbitration_id))
print(f'{i_msg:10,}{msg.timestamp:12.6f}{msg.arbitration_id:4X}{msg.dlc:2}{"R"if msg.is_rx else"T":2}{msg.data.hex()}', file=f)
else: # Single Frame 혹은 First Frameif msg_prev.arbitration_id == m_id_func:
m_ids_responding_to_functional_request.append(msg.arbitration_id)
else:
m_id_req_resp_pairs.append((msg_prev.arbitration_id, msg.arbitration_id))
print('', file=f)
print(f'{i_diag = :,}', file=f)
print(f'{diag_req = }', file=f)
print(f'{i_msg_prev:10,}{msg_prev.timestamp:12.6f}{msg_prev.arbitration_id:4X}{msg_prev.dlc:2}{"R"if msg_prev.is_rx else"T":2}{msg_prev.data.hex()}', file=f)
print(f'{i_msg:10,}{msg.timestamp:12.6f}{msg.arbitration_id:4X}{msg.dlc:2}{"R"if msg.is_rx else"T":2}{msg.data.hex()}', file=f)
i_msg += 1print('', file=f)
m_id_req_resp_pairs = list(set(m_id_req_resp_pairs))
print(f'{len(m_id_req_resp_pairs) = }', file=f)
for req_resp_pair in m_id_req_resp_pairs:
print(f'{req_resp_pair[0]:X}{req_resp_pair[1]:X}', file=f)
print('', file=f)
# m_id_func에 대한 응답을 하는 m_id를 표시한다.
m_ids_responding_to_functional_request = list(set(m_ids_responding_to_functional_request))
m_ids_responding_to_functional_request.sort()
print(f'{len(m_ids_responding_to_functional_request) = }', file=f)
for i_resp_m_id, resp_m_id inenumerate(m_ids_responding_to_functional_request):
print(f'{resp_m_id:X}', end=' ', file=f)
if i_resp_m_id % 10 == 9:
print('', file=f)
print('', file=f)
return m_id_req_resp_pairs, m_ids_responding_to_functional_request
Read ECU ID 요청으로 스캐닝한 결과
# Read ECU ID 요청으로 스캐닝한 결과
i = 7
blf = blfs[i]
m_id_req_resp_pairs, m_ids_responding_to_functional_request = show_diag_msgs_in_blf(blf)
output_file = blf.stem + '_diag_msgs.txt'
os.system(f'code {output_file}')
blf: uds_vehicle_config_2025_01_22_17_00_19_ecu_id.blf 3,032,788 bytes
i_diag = 113diag_req = 'Read ECU ID'
158,7021737532878.5368687708 T 0322f100aaaaaaaa
158,7191737532878.5419457788 R 0562f1003139aaaa
i_diag = 151diag_req = 'Read ECU ID'
209,8131737532897.5370857968 T 0322f100aaaaaaaa
209,8441737532897.54677079E 8 R 100f62f100302e33209,8711737532897.55701779E 8 R 2100000000000000209,8951737532897.56624679E 8 R 220000aaaaaaaaaa
i_diag = 162diag_req = 'Read ECU ID'
223,2651737532902.5372197A08 T 0322f100aaaaaaaa
223,3121737532902.5526537A88 R 0662f100323230aa
i_diag = 181diag_req = 'Read ECU ID'
248,8231737532912.0374127B38 T 0322f100aaaaaaaa
248,8811737532912.0595557BB 8 R 103462f100515820248,9321737532912.0784677BB 8 R 2120202039373235248,9871737532912.0993397BB 8 R 22302d4b32333030249,0471737532912.1183397BB 8 R 234845415445522d
249,0981737532912.1383377BB 8 R 24434f4e54524f4c
249,1531737532912.1583537BB 8 R 2520464154432056249,2031737532912.1783427BB 8 R 26312d30322d3930249,2591737532912.1984367BB 8 R 27332d3030000000i_diag = 198diag_req = 'Read ECU ID'
270,3521737532920.0381247C38 T 0322f100aaaaaaaa
270,3691737532920.0435797CB 8 R 037f2231aaaaaaaa
i_diag = 199diag_req = 'Read ECU ID'
271,6961737532920.5376197C48 T 0322f100aaaaaaaa
271,7531737532920.5573467CC 8 R 103362f100515820271,8301737532920.5875277CC 8 R 21204d4643202041271,8501737532920.5950737CC 8 R 2254204b4f52204c
271,8781737532920.6052567CC 8 R 23484420312e3030271,9241737532920.6185457CC 8 R 2420312e30312039271,9501737532920.6275707CC 8 R 25393231312d4b32271,9661737532920.6350877CC 8 R 2631303020323130272,0061737532920.6473487CC 8 R 27333239aaaaaaaa
i_diag = 202diag_req = 'Read ECU ID'
274,3951737532921.5375637C68 T 0322f100aaaaaaaa
274,4661737532921.5635817CE 8 R 0662f10039343100i_diag = 213diag_req = 'Read ECU ID'
289,1931737532927.0378447D18 T 0322f100aaaaaaaa
289,1961737532927.0401937D98 R 101e62f100515820289,2151737532927.0451487D98 R 2145534320052031289,2251737532927.0474937D98 R 2230301904012035289,2301737532927.0485697D98 R 23383931302d4b32289,2311737532927.0491167D98 R 24353030aaaaaaaa
i_diag = 215diag_req = 'Read ECU ID'
290,5411737532927.5376097D28 T 0322f100aaaaaaaa
290,5711737532927.5474207DA 8 R 037f2211aaaaaaaa
i_diag = 217diag_req = 'Read ECU ID'
293,2321737532928.5376027D48 T 0322f100aaaaaaaa
293,2501737532928.5440537DC 8 R 102862f100515820293,2811737532928.5533497DC 8 R 21204d4450532043293,3081737532928.5637187DC 8 R 2220312e30302031293,3331737532928.5733337DC 8 R 232e303620353633293,3591737532928.5837417DC 8 R 2434302d4b323030293,3891737532928.5943537DC 8 R 25302030423036aa
i_diag = 229diag_req = 'Read ECU ID'
308,0361737532934.0378067DF 8 T 0322f100aaaaaaaa
308,0401737532934.0405067D98 R 101e62f100515820i_diag = 229diag_req = 'Read ECU ID'
308,0361737532934.0378067DF 8 T 0322f100aaaaaaaa
308,0551737532934.04431779E 8 R 100f62f100302e33i_diag = 229diag_req = 'Read ECU ID'
308,0361737532934.0378067DF 8 T 0322f100aaaaaaaa
308,0571737532934.0447277DC 8 R 102862f100515820i_diag = 232diag_req = 'Unknown'
308,0711737532934.0480397DF 8 T 300000aaaaaaaaaa
308,0731737532934.0485097E98 R 102562f100505342i_diag = 233diag_req = 'Unknown'
308,0761737532934.0496797DF 8 T 300000aaaaaaaaaa
308,0911737532934.0537987A88 R 0662f100323230aa
i_diag = 233diag_req = 'Unknown'
308,0761737532934.0496797DF 8 T 300000aaaaaaaaaa
308,0921737532934.0540347CC 8 R 103362f100515820i_diag = 235diag_req = 'Read ECU ID'
309,3901737532934.5378187E08 T 0322f100aaaaaaaa
309,4371737532934.5540557E88 R 037f2231aaaaaaaa
i_diag = 252diag_req = 'Read ECU ID'
332,2591737532943.0381657F18 T 0322f100aaaaaaaa
332,2761737532943.0445827F98 R 037f2222aaaaaaaa
len(m_id_req_resp_pairs) = 127C47CC
7707787F17F97D47DC
79679E
7D17D97E07E87C37CB
7B37BB
7C67CE
7A07A87D27DA
len(m_ids_responding_to_functional_request) = 679E7A87CC 7D97DC 7E9
노트
진단 요청과 응답 m_id 짝을 12개 찾았다.
Read ECU ID 펑셔널 진단 요청에 응답하는 제어기가 6개 있다.
진단 통신 스펙이 있다면 스캐닝을 할 필요가 없었을까? 남의 진단 요청에 응답을 하는 제어기는 없다는 것을 확인하기 위한 목적으로 스캐닝 검증을 할 필요가 있다고 생각한다.
Read DTC 요청으로 스캐닝한 결과
# Read DTC 요청으로 스캐닝한 결과
i = 8
blf = blfs[i]
m_id_req_resp_pairs, m_ids_responding_to_functional_request = show_diag_msgs_in_blf(blf)
output_file = blf.stem + '_diag_msgs.txt'
os.system(f'code {output_file}')
blf: uds_vehicle_config_2025_01_22_17_03_05_dtc.blf 3,032,318 bytes
i_diag = 113diag_req = 'Read DTC'
159,7601737533045.3791907708 T 03190209aaaaaaaa
159,7851737533045.3885317788 R 03590209aaaaaaaa
i_diag = 151diag_req = 'Read DTC'
210,8691737533064.3793177968 T 03190209aaaaaaaa
210,8841737533064.38513979E 8 R 03590208aaaaaaaa
i_diag = 161diag_req = 'Read DTC'
224,3201737533069.3795547A08 T 03190209aaaaaaaa
224,4111737533069.4122437A88 R 037f1978aaaaaaaa
i_diag = 161diag_req = 'Read DTC'
224,3201737533069.3795547A08 T 03190209aaaaaaaa
225,0691737533069.6522537A88 R 03590209aaaaaaaa
i_diag = 180diag_req = 'Read DTC'
249,8831737533078.8807597B38 T 03190209aaaaaaaa
249,9211737533078.8935327BB 8 R 0359020900000000i_diag = 196diag_req = 'Read DTC'
271,4041737533086.8810767C38 T 03190209aaaaaaaa
271,4301737533086.8912067CB 8 R 03590289aaaaaaaa
i_diag = 197diag_req = 'Read DTC'
272,7451737533087.3807287C48 T 03190209aaaaaaaa
272,7831737533087.3941947CC 8 R 03590209aaaaaaaa
i_diag = 199diag_req = 'Read DTC'
275,4361737533088.3807757C68 T 03190209aaaaaaaa
275,4621737533088.3907947CE 8 R 0359020800000000i_diag = 210diag_req = 'Read DTC'
290,2371737533093.8810687D18 T 03190209aaaaaaaa
290,2441737533093.8831217D98 R 03590289aaaaaaaa
i_diag = 211diag_req = 'Read DTC'
291,5781737533094.3808367D28 T 03190209aaaaaaaa
291,6041737533094.3915977DA 8 R 037f1911aaaaaaaa
i_diag = 213diag_req = 'Read DTC'
294,2691737533095.3808407D48 T 03190209aaaaaaaa
294,2761737533095.3831537DC 8 R 03590289aaaaaaaa
i_diag = 224diag_req = 'Read DTC'
309,0701737533100.8818057DF 8 T 03190209aaaaaaaa
309,0771737533100.8834927DC 8 R 03590289aaaaaaaa
i_diag = 224diag_req = 'Read DTC'
309,0701737533100.8818057DF 8 T 03190209aaaaaaaa
309,0811737533100.88458479E 8 R 03590208aaaaaaaa
i_diag = 224diag_req = 'Read DTC'
309,0701737533100.8818057DF 8 T 03190209aaaaaaaa
309,0831737533100.8879057E88 R 035902ffaaaaaaaa
i_diag = 224diag_req = 'Read DTC'
309,0701737533100.8818057DF 8 T 03190209aaaaaaaa
309,0991737533100.8916447788 R 03590209aaaaaaaa
i_diag = 224diag_req = 'Read DTC'
309,0701737533100.8818057DF 8 T 03190209aaaaaaaa
309,1001737533100.8918727CB 8 R 03590289aaaaaaaa
i_diag = 224diag_req = 'Read DTC'
309,0701737533100.8818057DF 8 T 03190209aaaaaaaa
309,1111737533100.8943687DA 8 R 03590289aaaaaaaa
i_diag = 224diag_req = 'Read DTC'
309,0701737533100.8818057DF 8 T 03190209aaaaaaaa
309,1121737533100.8946037E98 R 035902ffaaaaaaaa
i_diag = 224diag_req = 'Read DTC'
309,0701737533100.8818057DF 8 T 03190209aaaaaaaa
309,1371737533100.9034557CC 8 R 03590209aaaaaaaa
i_diag = 224diag_req = 'Read DTC'
309,0701737533100.8818057DF 8 T 03190209aaaaaaaa
309,1821737533100.9216607A88 R 037f1978aaaaaaaa
i_diag = 224diag_req = 'Read DTC'
309,0701737533100.8818057DF 8 T 03190209aaaaaaaa
309,8151737533101.1538167A88 R 03590209aaaaaaaa
i_diag = 225diag_req = 'Read DTC'
310,4051737533101.3781147E08 T 03190209aaaaaaaa
310,4311737533101.3879077E88 R 035902ffaaaaaaaa
i_diag = 226diag_req = 'Read DTC'
311,7771737533101.8836647E18 T 03190209aaaaaaaa
311,7971737533101.8915377E98 R 035902ffaaaaaaaa
i_diag = 242diag_req = 'Read DTC'
333,2761737533109.8781727F18 T 03190209aaaaaaaa
333,3031737533109.8864277F98 R 037f1911aaaaaaaa
len(m_id_req_resp_pairs) = 137C47CC
7707787F17F97D47DC
79679E
7D17D97E07E87C37CB
7B37BB
7C67CE
7A07A87E17E97D27DA
len(m_ids_responding_to_functional_request) = 977879E 7A87CB 7CC 7DA 7DC 7E87E9
Tester Present 요청으로 스캐닝한 결과
# Tester Present 요청으로 스캐닝한 결과
i = 9
blf = blfs[i]
m_id_req_resp_pairs, m_ids_responding_to_functional_request = show_diag_msgs_in_blf(blf)
output_file = blf.stem + '_diag_msgs.txt'
os.system(f'code {output_file}')
blf: uds_vehicle_config_2025_01_22_17_05_54_testerPresent.blf 3,271,184 bytes
i_diag = 113diag_req = 'Tester Present'
164,8801737533215.9914287708 T 023e00aaaaaaaaaa
164,8951737533215.9960527788 R 027e00aaaaaaaaaa
i_diag = 151diag_req = 'Tester Present'
215,9901737533234.9915627968 T 023e00aaaaaaaaaa
216,0051737533234.99661779E 8 R 027e00aaaaaaaaaa
i_diag = 161diag_req = 'Tester Present'
229,4411737533239.9919097A08 T 023e00aaaaaaaaaa
229,4671737533240.0002137A88 R 037f3e7faaaaaaaa
i_diag = 180diag_req = 'Tester Present'
254,9981737533249.4918427B38 T 023e00aaaaaaaaaa
255,0251737533249.5025617BB 8 R 027e001200000000i_diag = 196diag_req = 'Tester Present'
276,5201737533257.4924007C38 T 023e00aaaaaaaaaa
276,5411737533257.5005177CB 8 R 027e00aaaaaaaaaa
i_diag = 197diag_req = 'Tester Present'
277,8651737533257.9921387C48 T 023e00aaaaaaaaaa
277,9201737533258.0121367CC 8 R 037f3e7faaaaaaaa
i_diag = 199diag_req = 'Tester Present'
280,5561737533258.9921647C68 T 023e00aaaaaaaaaa
280,6301737533259.0193287CE 8 R 027e000000000000i_diag = 210diag_req = 'Tester Present'
295,3511737533264.4921607D18 T 023e00aaaaaaaaaa
295,3741737533264.5001667D98 R 037f3e7faaaaaaaa
i_diag = 211diag_req = 'Tester Present'
296,6971737533264.9921847D28 T 023e00aaaaaaaaaa
296,7211737533265.0005227DA 8 R 037f3e11aaaaaaaa
i_diag = 213diag_req = 'Tester Present'
299,3881737533265.9922297D48 T 023e00aaaaaaaaaa
299,3891737533265.9939697DC 8 R 027e00aaaaaaaaaa
i_diag = 224diag_req = 'Tester Present'
314,1841737533271.4924917DF 8 T 023e00aaaaaaaaaa
314,1851737533271.4939777DC 8 R 027e00aaaaaaaaaa
i_diag = 224diag_req = 'Tester Present'
314,1841737533271.4924917DF 8 T 023e00aaaaaaaaaa
314,1861737533271.4952877788 R 027e00aaaaaaaaaa
i_diag = 224diag_req = 'Tester Present'
314,1841737533271.4924917DF 8 T 023e00aaaaaaaaaa
314,2101737533271.5012187CB 8 R 027e00aaaaaaaaaa
i_diag = 224diag_req = 'Tester Present'
314,1841737533271.4924917DF 8 T 023e00aaaaaaaaaa
314,2111737533271.5014527D98 R 037f3e7faaaaaaaa
i_diag = 224diag_req = 'Tester Present'
314,1841737533271.4924917DF 8 T 023e00aaaaaaaaaa
314,2121737533271.5016827E98 R 027e00aaaaaaaaaa
i_diag = 224diag_req = 'Tester Present'
314,1841737533271.4924917DF 8 T 023e00aaaaaaaaaa
314,2151737533271.50232379E 8 R 027e00aaaaaaaaaa
i_diag = 224diag_req = 'Tester Present'
314,1841737533271.4924917DF 8 T 023e00aaaaaaaaaa
314,2201737533271.5052837E88 R 027e00aaaaaaaaaa
i_diag = 224diag_req = 'Tester Present'
314,1841737533271.4924917DF 8 T 023e00aaaaaaaaaa
314,2431737533271.5106787CC 8 R 037f3e7faaaaaaaa
i_diag = 225diag_req = 'Tester Present'
315,5371737533271.9924997E08 T 023e00aaaaaaaaaa
315,5651737533272.0052917E88 R 027e00aaaaaaaaaa
i_diag = 226diag_req = 'Tester Present'
316,8831737533272.4925277E18 T 023e00aaaaaaaaaa
316,9061737533272.5006537E98 R 027e00aaaaaaaaaa
i_diag = 242diag_req = 'Tester Present'
338,4011737533280.4921857F18 T 023e00aaaaaaaaaa
338,4341737533280.5030097F98 R 027e00aaaaaaaaaa
len(m_id_req_resp_pairs) = 137C47CC
7707787F17F97D47DC
79679E
7D17D97E07E87C37CB
7B37BB
7C67CE
7A07A87E17E97D27DA
len(m_ids_responding_to_functional_request) = 877879E 7CB 7CC 7D97DC 7E87E9
Read Software Version 요청으로 스캐닝한 결과
# Read Software Version 요청으로 스캐닝한 결과
i = 10
blf = blfs[i]
m_id_req_resp_pairs, m_ids_responding_to_functional_request = show_diag_msgs_in_blf(blf)
output_file = blf.stem + '_diag_msgs.txt'
os.system(f'code {output_file}')
blf: uds_vehicle_config_2025_01_22_17_08_52_sw_ver.blf 3,024,556 bytes
i_diag = 113diag_req = 'Read Software Version'
160,0311737533391.7757097708 T 03221000aaaaaaaa
160,0361737533391.7803127788 R 037f2231aaaaaaaa
i_diag = 151diag_req = 'Read Software Version'
211,1411737533410.7762577968 T 03221000aaaaaaaa
211,1421737533410.77833279E 8 R 037f2231aaaaaaaa
i_diag = 161diag_req = 'Read Software Version'
224,5921737533415.7763547A08 T 03221000aaaaaaaa
224,6201737533415.7890107A88 R 037f2231aaaaaaaa
i_diag = 180diag_req = 'Read Software Version'
250,1451737533425.2762587B38 T 03221000aaaaaaaa
250,1701737533425.2881357BB 8 R 037f221200000000i_diag = 196diag_req = 'Read Software Version'
271,6671737533433.2769187C38 T 03221000aaaaaaaa
271,6911737533433.2865787CB 8 R 037f2231aaaaaaaa
i_diag = 197diag_req = 'Read Software Version'
273,0151737533433.7772237C48 T 03221000aaaaaaaa
273,0661737533433.7971577CC 8 R 037f2231aaaaaaaa
i_diag = 199diag_req = 'Read Software Version'
275,7061737533434.7773617C68 T 03221000aaaaaaaa
275,7571737533434.7973217CE 8 R 037f222200000000i_diag = 210diag_req = 'Read Software Version'
290,5001737533440.2774297D18 T 03221000aaaaaaaa
290,5011737533440.2788677D98 R 037f2231aaaaaaaa
i_diag = 211diag_req = 'Read Software Version'
291,8471737533440.7773927D28 T 03221000aaaaaaaa
291,8721737533440.7883887DA 8 R 037f2211aaaaaaaa
i_diag = 213diag_req = 'Read Software Version'
294,5381737533441.7774357D48 T 03221000aaaaaaaa
294,5631737533441.7871727DC 8 R 037f2231aaaaaaaa
i_diag = 224diag_req = 'Read Software Version'
309,3311737533447.2772167DF 8 T 03221000aaaaaaaa
309,3341737533447.2791997D98 R 037f2222aaaaaaaa
i_diag = 224diag_req = 'Read Software Version'
309,3311737533447.2772167DF 8 T 03221000aaaaaaaa
309,3581737533447.2878537CC 8 R 037f2231aaaaaaaa
i_diag = 225diag_req = 'Read Software Version'
310,6791737533447.7772257E08 T 03221000aaaaaaaa
310,6871737533447.7830247E88 R 037f2231aaaaaaaa
i_diag = 226diag_req = 'Read Software Version'
312,0241737533448.2772367E18 T 03221000aaaaaaaa
312,0491737533448.2873977E98 R 037f2231aaaaaaaa
i_diag = 242diag_req = 'Read Software Version'
333,5451737533456.2775987F18 T 03221000aaaaaaaa
333,5711737533456.2878447F98 R 037f2222aaaaaaaa
len(m_id_req_resp_pairs) = 137C47CC
7707787F17F97D47DC
79679E
7D17D97E07E87C37CB
7B37BB
7C67CE
7A07A87E17E97D27DA
len(m_ids_responding_to_functional_request) = 27CC7D9
노트
Read Software Version 요청의 응답은 모두 부정 응답이다.
나는 표준(Standard)/기본(Default) 모드(세션이라고도 한다. 모드와 세션의 정의에 차이가 있는 것 같은데 나는 모른다.)에서 Read Software Version 요청을 하였다. 모드가 맞지 않아서 부정 응답을 했을 수도 있고, 지원하지 않는 서비스라서 부정 응답을 했을 수도 있다. (전자의 가능성이 더 높다고 생각한다.)
부정 응답의 이유 코드가 0x12, 0x31, 0x22, 0x11로 다양하다.
부정 응답이어도 요청 메시지의 m_id와 응답 메시지의 m_id 짝을 찾기 위한 목적에는 충분하다.
결론
진단 요청 스캐닝으로 진단 요청 m_id와 응답 m_id 짝을 찾을 수 있다.
진단 요청 스캐닝을 통해서 남의 요청에 응답하는 제어기가 없음을 검증한다.
나는 단지 4개 진단 명령들을 대상으로 스캐닝을 했다. (진단 통신 사양서가 있었다면 전체 진단 명령들을 대상으로 스캐닝을 시도해봤을 ... 이건 내 본업이 아니다. ^^)