Skip to main content

シリアル通信デバイスモックツール - UART/SPI/I2C対応の軽量エミュレータ

Project description

serdevmock

シリアル通信デバイスのモックツールです。 実際のハードウェアデバイスがなくても、UART/SPI/I2C等のシリアル通信を行うライブラリやアプリケーションの開発および自動テストを可能にします。

目次

特徴

  • プロトコル別のモジュール設計(現在はUARTに対応、将来的にSPI/I2Cに対応予定)
  • JSONベースの設定ファイルで柔軟な応答ルールを定義
  • エコーモード(受信データをそのまま返送)
  • リクエストパターンに応じた自動応答
  • 応答遅延のシミュレーション
  • クロスプラットフォーム対応(Windows, Linux, macOS)
  • 軽量で高速な動作

動作環境

  • Python 3.11以上
  • pyserial 3.5以上

インストール

pipからインストール(推奨)

pip install serdevmock

開発版インストール

git clone https://github.com/tomio2480/serdevmock.git
cd serdevmock
pip install -e ".[dev]"

使い方

仮想COMポートの準備

serdevmockを使用するには、仮想COMポートペアを作成するか、TCPソケットモードを使用します。

詳細は docs/VIRTUAL_PORTS.md を参照してください。

方法1: TCPソケットモード(pyserial対応アプリケーション向け)

外部ツール不要で、すべてのOSで動作します。

注意: 一部のシリアル通信ライブラリはsocket://プロトコルに対応していません。その場合は方法2を使用してください。

# serdevmockをソケットモードで起動
serdevmock --protocol uart --port socket://0.0.0.0:5000 --config examples/echo_mode_socket.json

# 別のターミナルでテスト
python examples/test_socket_client.py

詳細は docs/SOCKET_MODE.md を参照してください。

方法2: 仮想COMポートペア(推奨・すべてのアプリケーション対応)

実際のCOMポート名を使用したい場合や、既存のシリアル通信ライブラリをそのまま使いたい場合はこの方法を推奨します。

Windows: com0com

# 仮想ポートペアを作成(初回のみ)
install PortName=COM10 PortName=COM11

Linux/macOS: socat

# 仮想シリアルポートペアを作成
socat -d -d pty,raw,echo=0 pty,raw,echo=0
# 出力例:
# 2024/12/02 10:00:00 socat[12345] N PTY is /dev/pts/2
# 2024/12/02 10:00:00 socat[12345] N PTY is /dev/pts/3

各OSでの詳細な手順、トラブルシューティング、自動起動設定は docs/VIRTUAL_PORTS.md を参照してください。

基本的な使用方法

# UARTエミュレータを起動
serdevmock --protocol uart --port COM10 --config examples/at_command.json

オプション

  • --protocol: プロトコル種別(現在はuartのみ対応、デフォルト: uart
  • --port: シリアルポート名(必須)
    • Windows: COM3, COM4 など
    • Linux/macOS: /dev/ttyS0, /dev/ttyUSB0, /dev/pts/N など
    • TCPソケット: socket://0.0.0.0:5000 など(マルチプラットフォーム対応)
  • --config: 設定ファイルのパス(必須)
  • --log-file: ログファイルのパス(省略時は標準出力)

停止方法

Ctrl+C を押してエミュレータを停止します。

設定ファイル

JSON形式で応答ルールを定義します。

ATコマンドエミュレータの例

{
  "port": "COM3",
  "baudrate": 9600,
  "data_bits": 8,
  "parity": "N",
  "stop_bits": 1,
  "echo_mode": false,
  "response_rules": [
    {
      "request_pattern": "AT",
      "response_data": "OK",
      "delay_ms": 100
    },
    {
      "request_pattern": "ATI",
      "response_data": "serdevmock v1.0",
      "delay_ms": 50
    }
  ]
}

エコーモードの例

{
  "port": "COM3",
  "baudrate": 9600,
  "data_bits": 8,
  "parity": "N",
  "stop_bits": 1,
  "echo_mode": true,
  "response_rules": []
}

パラメータ説明

UART設定

  • port: シリアルポート名
  • baudrate: ボーレート(例: 9600, 115200)
  • data_bits: データビット数(通常8)
  • parity: パリティ("N": なし, "E": 偶数, "O": 奇数)
  • stop_bits: ストップビット数(通常1または2)
  • echo_mode: エコーモード(true: 受信データをそのまま返送、false: 応答ルールを使用)

応答ルール

  • request_pattern: 受信待機するデータパターン(文字列)
  • response_data: パターン一致時に送信する応答データ(文字列)
  • delay_ms: リクエスト受信から応答送信までの遅延時間(ミリ秒)

開発

開発環境のセットアップ

# リポジトリのクローン
git clone <repository-url>
cd serdevmock

# 開発依存パッケージのインストール
pip install -e ".[dev]"

テストの実行

# 全テスト実行
pytest

# カバレッジ付きテスト実行
pytest --cov=src/serdevmock --cov-report=html

コード品質チェック

ローカルでの CI チェック(推奨)

GitHub Actions で実行される品質チェックをローカルで実行できます。

# すべてのチェックを一括実行
.\check.ps1 all

# 個別のチェック実行
.\check.ps1 black   # コードフォーマットチェック
.\check.ps1 flake8  # コードスタイルチェック
.\check.ps1 mypy    # 型チェック
.\check.ps1 pytest  # テスト実行

手動での品質チェック

# コードフォーマット
black src tests

# リンター
flake8 src tests

# 型チェック
mypy src

# 全品質チェック実行
black src tests && flake8 src tests && mypy src && pytest

ディレクトリ構造

serdevmock/
├── src/
│   └── serdevmock/
│       ├── __init__.py
│       ├── cli/                # CLIインターフェース
│       └── protocols/          # プロトコル実装
│           ├── common/         # 共通インターフェース
│           ├── uart/           # UART実装
│           ├── spi/            # SPI実装(将来対応予定)
│           └── i2c/            # I2C実装(将来対応予定)
├── tests/                      # テストコード
├── examples/                   # サンプル設定ファイル
├── pyproject.toml              # プロジェクト設定
└── README.md

アーキテクチャ

プロトコル別モジュール設計

serdevmockは、異なる通信プロトコル(UART、SPI、I2C等)を独立したモジュールとして実装する設計になっています。

共通インターフェース

すべてのプロトコルエミュレータは共通インターフェース(ProtocolEmulator)を実装します。

from serdevmock.protocols.common.interface import ProtocolEmulator

class UARTEmulator(ProtocolEmulator):
    def start(self) -> None: ...
    def stop(self) -> None: ...
    def is_running(self) -> bool: ...

新しいプロトコルの追加方法

  1. src/serdevmock/protocols/<protocol_name>/ ディレクトリを作成
  2. config.py で設定クラスを実装
  3. emulator.pyProtocolEmulator を継承したエミュレータクラスを実装
  4. src/serdevmock/cli/main.py にプロトコル選択ロジックを追加

この設計により、各プロトコルの実装は互いに独立しており、メンテナンスコストを低く保つことができます。

ライセンス

MIT License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

serdevmock-0.1.0.tar.gz (20.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

serdevmock-0.1.0-py3-none-any.whl (13.6 kB view details)

Uploaded Python 3

File details

Details for the file serdevmock-0.1.0.tar.gz.

File metadata

  • Download URL: serdevmock-0.1.0.tar.gz
  • Upload date:
  • Size: 20.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for serdevmock-0.1.0.tar.gz
Algorithm Hash digest
SHA256 637ffb8773e52c3a3ed0e6d3c92a28d41670649eee8343bf4a7aceb19827d831
MD5 b9eabae3e746eb5359ad78c1313c7ed3
BLAKE2b-256 acb70394f494cc8aeeec61d6fc071211aed02f78d92207a36ba629a7963b6f67

See more details on using hashes here.

File details

Details for the file serdevmock-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: serdevmock-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 13.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for serdevmock-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0515132c3e16eb9b5756984ee930f474ab09d3671cd8f7a9b30a34754b19fdb7
MD5 54c0ad56c8c265e1eaeba86aedd731fb
BLAKE2b-256 521940643bd25c1a98decaf3880c889623c84ccbeb8c100cb66ff67c9e03d35c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page