Признаться, настоящий обзор не вполне соответствует профилю нашего ресурса. И все же два обстоятельства заставили поместить его на наш ресурс. Первое – ранее выложенная новость вызвала довольно большой читательский интерес. Второе – мы понимаем насколько не просто довести любой проект до стадии готового изделия. Поэтому всегда охотно идем навстречу отечественным компаниям-производителям и разработчикам, размещая информацию об их продукции и сервисах.
Автор Игорь Марков, Auriga
Сейчас беспроводное подключение периферийных устройств – в англоязычной транскрипции Human Interface Devices (HID) – скорее, правило, чем исключение. Иногда использование этих устройств не вполне удобно, из-за их больших размеров, ограниченной дистанции приёма, недостатка функциональности. Пример: управление программным видеопроигрывателем на ПК, показ презентаций. В этих ситуациях используются специализированные пульты. Но есть ли смысл приобретать их, когда существует более универсальное устройство – мобильный телефон.
В современном мобильном телефон (смартфоне), обычно, присутствуют аппаратные клавиши, сенсорный экран, акселерометр, гироскоп, а также WiFi или Bluetooth. Этого достаточно, чтобы создать универсальный пульт управления компьютером.
Существует множество специализированных мобильных программ для управления определёнными приложениями на ПК, но они не универсальны, т. е. позволяют управлять только определёнными приложениями на ПК.
Предлагаемое компанией Auriga решение более универсально, так как оно передаёт управляющие события с мобильного телефона прямо в операционную систему: для запущенных программ эти события выглядят как нажатия кнопок на клавиатуре, движения мыши, или наклон джойстика. Соответственно, такой подход работает для всех существующих программ на ПК, которые считывают данные с клавиатуры, мыши или джойстика. Под ПК здесь имеется в виду любой компьютер/ноутбук общего типа, под управлением ОС Windows, Mac OS X, Linux, и т.п.
Универсальность управления достигается настройками.
- Тип управления: клавиатура, мышь или джойстик.
- Конфигурация клавиш, осей (как управляются, сенсорным экраном или наклоном устройства относительно гравитационного поля), чувствительности, и т. п.
- Беспроводной протокол: TCP/IP (как правило WiFi) или Bluetooth
На данный момент клиентская (мобильная) часть реализована для платформы Android на языке Java. В дальнейшем планируется такая же реализация для таких мобильных платформ как iOS, Symbian(Qt), J2ME.
Тип и особенности управления обуславливаются конкретной конфигурацией, записанной в xml-файле. Конфигурация определяет:
1. Тип управления: клавиатура, мышь или джойстик
2. Привязка элементов управления (клавиш, осей) к физическим сенсорам: сенсорный экран, акселерометр, аппаратные клавиши. Например, кнопка «Page Down» может быть привязана к аппаратной кнопке «Вызов» на телефоне. По нажатию кнопки вызов, на ПК произойдёт «нажатие» кнопки «Page Down». Как вариант, Page Down может быть отображена как программная кнопка на сенсорном экране. Нажатие в эту область приведёт к «нажатию» «Page Down» на ПК. Также оси джойстика могут быть привязаны к наклону вправо-влево и/или вперёд назад телефона (задействуется акселерометр или гироскоп), либо как ползунок на сенсорном экране.
При первом запуске программы пользователь выбирает конфигурацию. В будущем он может изменить её в настройках программы. Пример конфигурации HID-устройства типа джойстик: «джойстик, оси X и Y — соотв. оси акселерометра, ось Z — ползунок на сенсорном экране, ещё одна ось — руль поворота, 4 кнопки «джойстика» отображены на аппаратные кнопки телефона «поиск», «назад», «ув. Громкости», «ум. Громкости»». Такой конфигурации уже достаточно чтобы играть, например, в авиасимулятор Flight Gear.
Также при запуске пользователь выбирает протокол передачи Bluetooth или TCP/IP. Если выбран Bluetooth, то далее он выбирает свой компьютер и списка доступных Bluetooth-устройств. Если выбран TCP/IP, то вводится IP адрес компьютера. В будущем планируется использовать Zeroconf(Avahi/Bonjour) для удобного выбора имени компьютера.
После соединения с компьютером (серверной частью), начинается процесс передачи HID-событий. Для кодирования событий используется сериализация в Google Protocol Bufffers (в некотором роде это «бинарный XML»). Сериализованные таким образом данные передаются по транспортному протоколу UDP либо RFCOMM. Изначально планировалось использовать L2CAP вместо RFCOMM, но в Android API не включена работа с L2CAP.
Для удобства дальнейшего преобразования, HID-события кодируются в виде, как это определено в классе HID для USB-устройств. А именно, каждое событие кодируется тройкой целых чисел: тип, код и значение. Тип определяет что это за событие: клавиша, относительное перемещение (как правило мыши), абсолютное перемещение (как правило, джойстика), и т. п. Код определяет, что именно было нажато (код клавиши) или по какой оси перемещено. Значение определяет: для клавиши, нажата она была или отпущена; для перемещений/смещений, насколько большим было перемещение (или абсолютное смещение от центра).
Серверная часть реализована как драйвер операционной системы. Рассмотрим реализацию для ОС Linux. В этой ОС существует возможность «вставлять» HID-события в систему из обычной программы, таким образом, нет необходимости реализовывать драйвер в пространстве ядра. Такой механизм называется uevent (user event). Таким образом, драйвер реализован как обычная C++ программа, которая считывает события из UDP или RFCOMM сокета, десериализует их из структур Protocol Buffers и записывает их в файл символьного устройства /dev/input/uinput. Далее, операционная система получает эти события из системного драйвера uinput, ставит их в очередь входящих HID-событий (наравне с подобными событиями от мыши и клавиатуры) и передаёт их интерактивным программам.
В момент инициализации, когда мобильное устройство впервые соединяется с компьютером, проходит этап регистрации нового HID-устройства в ядре. Конфигурация передаётся с мобильно устройства и представляет собой тип устройства, количество клавиш, какие это клавиши, количество осей, тип этих осей (мышь или джойстик). Полученная конфигурация устанавливается на устройство /dev/input/uinput с помощью специального ioctl-вызова. После этого начинается описанный выше основной цикл работы.
В дальнейшем планируется расширение проекта, в частности поддержка ОС iOS, J2ME и Symbian(Qt) на управляющей стороне, и ОС Windows и Mac OS X на управляемой стороне.
Основное тестирование проводилось с использование авиасимулятора FlightGear. Одна из целей тестирования была убедиться, что беспроводное управление настолько же удобно, как управление обычным джойстиком. Цель была полностью достигнута. Конфигурация HID была простая: наклон телефона вправо должен был управлять наклоном элеронов, на и от себя — наклоном руля высоты, и два «слайдера» на экране телефона позволяли выбирать силу «газа» и угол руля поворота. Также на аппаратную кнопку были вынесены переключатель тормозов. Наиболее используемые элементы управления — первые 2, поэтому управление самолётом Cessna-172 и другими было очень лёгким. Таким же лёгким и удобным было управление в играх типа «закати мяч в лунку» NeverBall и NeverPutt.
Таким образом, в результате работы над проектом было создано универсальное приложение для управления компьютером с мобильного устройства.