シリアル通信デバイスのモックツールです。 実際のハードウェアデバイスがなくても、UART/SPI/I2C等のシリアル通信を行うライブラリやアプリケーションの開発および自動テストを可能にします。
- プロトコル別のモジュール設計(現在はUARTに対応、将来的にSPI/I2Cに対応予定)
- JSONベースの設定ファイルで柔軟な応答ルールを定義
- エコーモード(受信データをそのまま返送)
- リクエストパターンに応じた自動応答
- 応答遅延のシミュレーション
- クロスプラットフォーム対応(Windows, Linux, macOS)
- 軽量で高速な動作
- Python 3.11以上
- pyserial 3.5以上
pip install serdevmockgit clone https://github.com/tomio2480/serdevmock.git
cd serdevmock
pip install -e ".[dev]"serdevmockを使用するには、仮想COMポートペアを作成するか、TCPソケットモードを使用します。
詳細は docs/VIRTUAL_PORTS.md を参照してください。
外部ツール不要で、すべての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 を参照してください。
実際のCOMポート名を使用したい場合や、既存のシリアル通信ライブラリをそのまま使いたい場合はこの方法を推奨します。
Windows: com0com
# 仮想ポートペアを作成(初回のみ)
install PortName=COM10 PortName=COM11Linux/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形式で応答ルールを定義します。
{
"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": []
}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=htmlGitHub 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 && pytestserdevmock/
├── 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