/var/log/messages

Jan 25, 2018 - 2 minute read - Comments - memo python

メモ

つい出来心で

  • 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 という配列に格納しているのかどうか。このあたりも別途もう少し詳細に確認の方向です。

Pint Tutorial

comments powered by Disqus