protocols_dispatcher
Гибкая асинхронная библиотека для диспетчеризации бинарных протоколов
protocols_dispatcher упрощает жизнь, когда нужно:
- принять поток байтов → превратить в «пакеты» (словарь Python);
- выбрать обработчик по произвольным фильтрам;
- отправить ответ тем же транспортом или другим;
- легко добавлять свои протоколы и транспорты (TCP, serial, файлы — любые).
Библиотека уже используется в производственном проекте для работы с наборами микроконтроллеров и бинарных команд.
📦 Установка
# минимальный набор
pip install protocols_dispatcher
# + поддержка работы по последовательному порту через aioserial
pip install protocols_dispatcher[serial]
| extra | что подтягивает | |
|---|---|---|
serial |
aioserial |
🚀 Быстрый старт
import asyncio
from protocols_dispatcher import Dispatcher, AbstractProtocol, AbstractTransport
from protocols_dispatcher.transports.serial import SerialTransport
class EchoProtocol(AbstractProtocol):
async def matches(self, raw: bytes) -> bool:
# «Принимаем» любой кадр
return True
async def deserialize(self, data: bytes):
# Каждый пришедший фрейм — отдельный «пакет»
return [dict(raw=data)]
async def serialize(self, packet: dict):
# Просто оборачиваем в префикс
return b"ACK:" + packet["raw"]
async def main():
proto = EchoProtocol()
transport = SerialTransport(port="/dev/ttyUSB0", baudrate=115200)
dsp = Dispatcher(proto, transport)
@dsp.handler() # без фильтров — ловим всё
async def handle(pkt):
print("RX:", pkt["raw"].hex())
# сформируем и отправим ответ
return dict(raw=pkt["raw"])
# транспорт запускается отдельной корутиной
await transport.run()
asyncio.run(main())
🔍 Основные возможности
-
Асинхронность на всех уровнях — от транспорта до callback-ов.
-
Паттерн «декоратор‑фильтр»
@dispatcher.handler(MyFilter()) def on_custom(pkt): ...
либо через
router.handler(filter=..., protocol=...), если протоколов несколько. -
ProtocolRouter — маршрутизация, когда по одному каналу идёт несколько независимых бинарных протоколов.
-
Тестирование из коробки — примерные
DummyProtocol/DummyTransportи фикстуры дляpytest. -
Extras‑dependencies — лишние зависимости ставятся только при необходимости.
🗂️ Структура проекта
📦 protocols_dispatcher
├─ __init__.py
├─ dispatcher.py # ядро: AbstractProtocol / AbstractTransport / Dispatcher / ProtocolRouter
├─ transports/
│ ├─ __init__.py
│ └─ serial.py # SerialTransport (опция [serial])
└─ tests/
├─ helpers.py # заглушки для юнит‑тестов
├─ conftest.py
└─ ...
🧪 Запуск тестов
git clone https://github.com/your-github/protocols_dispatcher.git
cd protocols_dispatcher
pip install -e .[dev] # dev‑зависимости: pytest, pytest-asyncio, ruff, mypy ...
pytest -q
🤝 Контрибьюция
- Сделайте форк, создайте ветку
feature/whatever. pre-commit install— сразу проверит code‑style.- Напишите тесты к новому коду.
- Отправьте PR и опишите, зачем change полезен.
📄 Лицензия
Проект распространяется под лицензией MIT — см. файл LICENSE.
🙌 Авторы и благодарности
- Игорь Супрядкин — архитектура и основная реализация
- ChatGPT — помощь в проработке решений и написаний документации
Если библиотека помогла вам — поставьте ⭐️ в GitHub и расскажите о ней коллегам!
Metadata
Release files for protocols-dispatcher 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| protocols_dispatcher-0.2.0.tar.gz | 10.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| protocols_dispatcher-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 20.7 kB
Release files / protocols_dispatcher-0.2.0.tar.gz
| Download URL | protocols_dispatcher-0.2.0.tar.gz |
|---|---|
| Size | 10.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7831397f312d4efaa9423bd142ab1ee393cc96c9466d679bd874aa67371fc154
|
|
BLAKE2b-256 checksum How to use checksums |
eef132472178871e0551e0b60fe375ea6e38fb8da8745c7bccb6ed58ec7a6a9e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.2
|
Release files / protocols_dispatcher-0.2.0-py3-none-any.whl
| Download URL | protocols_dispatcher-0.2.0-py3-none-any.whl |
|---|---|
| Size | 9.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
94062962cc8457c3d3bc0db2922c7a203a159fbbe3289aaf546df9cb5bd05a70
|
|
BLAKE2b-256 checksum How to use checksums |
2ebbdb518be179ba76e22cb7c584968b7b0ed33a8c649fd9ef3b38e6e0b735e3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.2
|