つい出来心で
- ELM327 なデバイス
- OBD2 の分岐ケーブル
を調達してしまうなど。python-OBD という pip な道具があるようなのでそれを使って OBD なナニが ELM327 によってどんな CAN メセジに変換されているのか、が確認できるのかどうか。
obd.commands というオブジェクトがあり、属性として
- name
- description
- cmd
- bytes
- decoder
- ECU
- fast
などの属性を持っており、いくつかの Mode を対象として内部てきに配列で保持している事がソースから判りました。
ただ、Github の README にある Basic Usage だと
cmd = obd.command.SPEED # select an OBD command (sendor)
みたいな形で参照してて何これ? ってなったので確認してみるに Commands のコンストラクタにて以下な記載を発見した次第です。
# allow commands to be accessed by name
for m in self.modes:
for c in m:
if c is not None:
self.__dict__[c.name] = c
for c in __misc__:
self.__dict__[c.name] = c
どうも self.dict というのはオブジェクトのアトリビュート (属性?) を保持する辞書らしく、原則使わない というドキュメントもありました。なるほど、なので python だとオブジェクトの属性って fuga.hoge
みたいな形でアクセスできるのか (違
ちなみにこの方式だと動作速度が getattr()/setattr()
より早い、とのことでした。
connection
コネクションを貼って、コマンド実行するあたりは以下な形とのこと。
import obd
connection = obd.OBD() # auto-connects to USB or RF port
cmd = obd.commands.SPEED # select an OBD command (sensor)
response connection.query(cmd)
query
あたりは別途確認してエントリ投入の方向です。とりあえず connection
という変数に代入されている OBD というクラスのオブジェクトがどうなのか、というあたり。ここでシリアルなデバイスに接続しているはずなので。
OBD のコンストラクタ
属性を設定して
- __connect
- __load_commands
という手続きを呼び出しています。__connect
では scan_serial
という手続きを呼び出して有効とおぼしきシリアルデバイスを列挙して ELM327
クラスのオブジェクトを生成してはそれが有効かどうかを確認しているようです。
utils.py
にて定義されている scan_serial
ではプラットフォーム毎であり得るデバイスファイル名を列挙して serial
なオブジェクトを生成してみて、問題なければデバイス名を配列に append して戻しているようです。
ここで列挙された名前で ELM327 オブジェクトを生成しています。実際にはこのオブジェクトがシリアルポートとのやりとりをしているのかどうか。
__load_command は有効な pid を調べて supported_commands という配列に格納しているのかどうか。このあたりも別途もう少し詳細に確認の方向です。