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() |