Требуется написать управляемый по сети фонарь. Команды управления фонарь принимает от сервера фонаря. Предполагается, что реализация сервера уже существует (однако недоступен вам в процессе разработки клиента фонаря). Фонарь и сервер общаются по Протоколу Управления Фонарем (ПУФ), работающему поверх соединения TCP.
ПУФ устроен следующим образом. Для изменения состояния фонаря сервер передает ему команду управления. Все команды передаются в формате json вида:
{
"command" = text,
"metadata" = double
}
ПУФ версии 1 описывает три команды:
- ON (включить фонарь),
- OFF (выключить фонарь)
- COLOR (сменить цвет)
Цвет (при необходимости) кладется в поле метадата.
Реализация фонаря должна удовлетворять следующим требованиям:
- При запуске фонарь должен запрашивать хост:порт (по умолчанию 127.0.0.1:9999), подсоединяться по TCP и после этого начать отрабатывать протокол управления.
- При получении данных от сервера фонарь проверяет команду, и, если она известна, обрабатывает команду, иначе молча ее игнорирует.
- При получении команды ON фонарь включается (отрисовку фонаря оставляем на ваше усмотрение).
- При получении команды OFF фонарь выключается.
- При получении команды COLOR фонарь меняет цвет.
- При завершении работы фонарь корректно закрывает соединение с сервером.
- Реализация фонаря позволяет легко добавлять любые новые команды. Проработанность обработки исключительных ситуаций (ошибки установления соединения, обрывы соединения) — на ваше усмотрение.
Технологические требования:
- Задание принимается в виде готового к выполнению Python-пакета. Обязательно наличие инструкции по запуску.
- Версия Python — 3.7+.
- Реализация сетевого протокола может быть на aiohttp, tornado или fastAPI.
- Репозиторий с исходниками должен быть доступен на GitHub или GitLab.
Решение данного задания оформлено в виде python-пакета. Установка происходит следующим образом:
$ git clone https://github.com/DeapHy/tz-flashlight
$ cd tz-flashlight
$ python setup.py install
После установки управление происходит следующим образом:
- Запуск клиента:
$ tzf runclient -h [HOST] -p [PORT]
Если хост или порт не указаны, используются стандартные параметры: localhost:9999
- Запуск сервера:
$ tzf runserver -h [HOST] -p [PORT]
Если хост или порт не указаны, используются стандартные параметры: localhost:9999
Для начала работы необходимо сначала включить сервер, потом клиент.
После подключения клиента к серверу необходимо передать команду клиенту. Для этого необходимо отправить POST-запрос по URL [HOST]:[PORT]/execute с телом формата, указанного в задании.
Например, при стандартных параметрах, для включения фонаря необходимо отправить POST-запрос на http://localhost:9999/execute со следующим телом:
{
"command": "ON"
}
или
{
"command": "ON",
"metadata": null
}