Требуется написать управляемый по сети фонарь. Команды управления фонарь принимает от сервера фонаря. Предполагается, что реализация сервера уже существует (однако недоступен вам в процессе разработки клиента фонаря). Фонарь и сервер общаются по Протоколу Управления Фонарем, работающему поверх соединения TCP.
Протокол Управления Фонарем (ПУФ) устроен следующим образом. Для изменения состояния фонаря сервер передает ему команду управления. Все команды кодируются в виде TLV (http://en.wikipedia.org/wiki/Type-length-value), при этом поле type имеет размер 1 байт, поле length — 2 байта и поле value — length байт. Все данные передаются по сети в Big Endian.
ПУФ версии 1 описывает три команды: ON (включить фонарь): type = 0x12, length = 0 OFF (выключить фонарь): type = 0x13, length = 0 COLOR (сменить цвет): type = 0x20, length = 3, value интерпретируется как новый цвет фонаря в RGB.
Предполагается, что в будущих версиях ПУФ могут появляться новые команды, однако структура TLV останется неизменной.
Реализация фонаря должна удовлетворять следующим требованиям:
- При запуске фонарь должен запрашивать хост:порт (по умолчанию 127.0.0.1:9999), подсоединяться по TCP и после этого начать отрабатывать протокол управления.
- При получении данных от сервера фонарь собирает целые команды (type + length + value) и, если type известен, обрабатывает команду, иначе молча ее игнорирует.
- При получении команды ON фонарь включается (отрисовку фонаря оставляем на ваше усмотрение).
- При получении команды OFF фонарь выключается.
- При получении команды COLOR фонарь меняет цвет.
- При завершении работы фонарь корректно закрывает соединение с сервером.
- Реализация фонаря позволяет легко добавлять любые новые команды.
- Pyton >= 3.3.6
- Tornado >= 4.3
Задание было оформлено в виде python пакета, поэтому его установка крайне проста:
$ git clone https://github.com/droppoint/ivideon-demo-task.git $ cd ivideon-demo-task $ python setup.py install
Проект оснащен интерфейсом командной строки. Для получения справки достаточно выполнить команду:
$ idt --help
Интерфейс командной строки поддерживает только одну команду: runserver. Справку по команде можно получить следующим образом:
$ idt runserver --help
Проект содержит в себе тесты и поддерживает фреймворк тестирования tox. Для запуска тестирования и синтаксической проверки достаточно выполнить команду:
$ tox