You can dump CAN data by using ELM327 or STN1100 device.
atl1
ath1
atd1
ats0
atma
41183000000000000000
43681001800000000001
0788DF90FF6000009000
5513030200
05083200000000000000
...
#!/usr/bin/env python | |
#coding: UTF-8 | |
import string | |
import sys | |
import time | |
# コマンドライン引数で指定されたファイルをオープン | |
argv = sys.argv | |
argc = len( argv ) | |
if argc <= 1: | |
print 'Usage: canplayer.py filename' | |
sys.exit() | |
f = open( argv[1], 'r' ) | |
diff_list = dict() | |
global_time_stamp = 0 | |
print_line = 0 | |
# TODO: 表示したくないヘッダのリストを設定する | |
filter_list = [ '091', '09F', '217' ,'43E' ] | |
# ターミナルをクリアする | |
sys.stderr.write( "\x1b[2J\x1b[H" ) | |
# ファイルから1行ごと読み込み差分データを表示する | |
for line in f: | |
# ターミナルのカーソルをロールバックする | |
sys.stderr.write( "\x1b[%dA" % print_line ) | |
# 画面表示間隔分スリープする | |
time.sleep( 20 / 1000.0 ) | |
# タイムスタンプをインクリメント | |
global_time_stamp += 1; | |
# ファイルからヘッダとデータを取得する | |
current_header = line[:3] | |
current_data = line[4:].strip() | |
# 不正なヘッダを除外する | |
if not all( c in string.hexdigits for c in current_header ): | |
continue | |
# ヘッダをフィルタリング | |
if current_header in filter_list: | |
continue | |
# 全ヘッダの年齢をインクリメント | |
for header in diff_list: | |
diff_list[header]['age'] += 1 | |
# 既にヘッダが存在する場合 | |
if current_header in diff_list: | |
# タイムスタンプを更新 | |
diff_list[current_header]['time_stamp'] = global_time_stamp | |
# カウンタをインクリメント | |
diff_list[current_header]['count'] += 1 | |
# 差分データを生成する | |
data = diff_list[current_header]['data'] | |
if current_data != data: | |
diff_data = '' | |
data_len = min( len( current_data ), len( data ) ) | |
# 1文字ずつ差分データを生成する | |
for i in range( data_len ): | |
if current_data[i] == data[i]: | |
diff_data = diff_data + '_' | |
else: | |
diff_data = diff_data + data[i] | |
# 差分データリストを更新する | |
diff_list[current_header]['age'] = 0 | |
diff_list[current_header]['data'] = current_data | |
diff_list[current_header]['diff_data'] = diff_data | |
else: | |
# ヘッダが存在しない場合は差分データリストに追加する | |
diff_list[current_header] = { 'time_stamp': global_time_stamp, | |
'count': 1, | |
'age': 0, | |
'data': current_data, | |
'diff_data': '' } | |
# 差分データリストを表示する | |
print 'TIME AGE COUNT ID DATA DIFF' | |
for header in sorted( diff_list.keys() ): | |
# 年齢が古いデータは除外する | |
age = diff_list[header]['age'] | |
if age >= 256: | |
continue | |
# 差分データを表示する | |
time_stamp = diff_list[header]['time_stamp'] | |
count = diff_list[header]['count'] | |
data = diff_list[header]['data'] | |
diff_data = diff_list[header]['diff_data'] | |
# sys.stderr.write( "\x1b[38;5;%dm" % ( age & 0xff >> 4 | 0xf0 ) ) | |
print '%04d %03d %05d %3s %16s %16s' \ | |
%( time_stamp, age, count, header, data, diff_data ) | |
# sys.stderr.write( "\x1b[0m" ) | |
# 表示した行数を計算する | |
print_line = len( diff_list ) + 2 | |
# ターミナルのカーソル以降をクリアする | |
sys.stderr.write( "\x1b[J" ) | |
f.close() |