シリアル通信デバイスモックツール - 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など(マルチプラットフォーム対応)
- Windows:
--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: ...
新しいプロトコルの追加方法
src/serdevmock/protocols/<protocol_name>/ディレクトリを作成config.pyで設定クラスを実装emulator.pyでProtocolEmulatorを継承したエミュレータクラスを実装src/serdevmock/cli/main.pyにプロトコル選択ロジックを追加
この設計により、各プロトコルの実装は互いに独立しており、メンテナンスコストを低く保つことができます。
ライセンス
MIT License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
637ffb8773e52c3a3ed0e6d3c92a28d41670649eee8343bf4a7aceb19827d831
|
|
| MD5 |
b9eabae3e746eb5359ad78c1313c7ed3
|
|
| BLAKE2b-256 |
acb70394f494cc8aeeec61d6fc071211aed02f78d92207a36ba629a7963b6f67
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0515132c3e16eb9b5756984ee930f474ab09d3671cd8f7a9b30a34754b19fdb7
|
|
| MD5 |
54c0ad56c8c265e1eaeba86aedd731fb
|
|
| BLAKE2b-256 |
521940643bd25c1a98decaf3880c889623c84ccbeb8c100cb66ff67c9e03d35c
|