Remote control driver что это
В IT-сообществе принято считать безусловным злом любой софт, который крадет персональные данные пользователя и приносит огромную прибыль киберпреступникам. Между тем существуют вполне легальные компании, которые разрабатывают и продают трояны.
Нелегальное легально
Неужели действительно кто-то разрабатывает и продает вредоносное ПО легально? Да, только тот же самый софт, за создание которого еще вчера могли привлечь к ответственности, разрабатывается не со злым умыслом, а для решения вполне легитимных задач. Скажем, спецслужбы могут осуществлять с помощью программ, которые совсем недавно использовались как трояны, сбор оперативной информации — где тут вредоносность? Восьмого октября 2011 года крупнейший европейский хакерский клуб Chaos Computer Club (CCC) опубликовал отчет о реверс-инжиниринге трояна, который немецкая полиция якобы использовала не только для сбора пользовательских данных, но и для скрытой установки программного обеспечения на зараженные компьютеры. Власти официально этот факт подтвердили. А в декабре исследователь и завсегдатай форума XDA-developers Тревор Экхарт обнаружил, что ряд современных смартфонов, в том числе Android и iPhone, скрыто следят за действиями пользователей и передают собранную «статистику» производителям. Подробнее об этих двух инцидентах можешь прочитать во врезке. Сейчас же я предлагаю рассмотреть один из таких «легальных троянов» — Remote Control System, узнать, что о нем говорят разработчики, и разобраться, что он на самом деле собой представляет.
Реквизиты стороны, подписавшей x64-драйвер
Другие статьи в выпуске:
Remote Control System
Восстановленная функция выработки ключа A Реквизиты стороны, подписавшей x64-драйвер ndroid-версии малвари
Carrier IQ: легальный троян в смартфонах
Копаясь в прошивке Android-смартфонов фирмы HTC, Тревор Экхарт обнаружил программу, работающую в скрытом режиме и собирающую информацию о нажатиях клавиш на диалере или клавиатуре, просмотре рекламных объявлений, получении СМС, включении и отключении экрана, получении звонков, местоположении и т. д. Дальнейшие исследования показали, что эта программа является детищем фирмы Carrier IQ, которая активно сотрудничает с производителями как смартфонов, так и простых мобильных телефонов. Производитель оборудования получает исходники программы от CIQ, дорабатывает их и внедряет в прошивку устройства. Кроме того, CIQ предоставляет удобный интерфейс для работы с полученными данными.
Элементы кода программы были найдены в прошивках с Sense UI, а также на аппаратах производства Samsung с интерфейсом Touch Wiz. В результате проделанной работы Тревор написал программу, которая позволяет проверить телефон на наличие этого руткита и, если в смартфоне есть права root, попытаться удалить руткит подробнее читай тут.
Малварь в диспетчере приложений Android
Обнаружение
Как оказалось, обнаружить троян довольно легко, достаточно лишь загрузиться с загрузочной флешки и прошерстить винчестер зараженного компьютера. RCS создает директорию либо в корне диска C, либо в %APPDATA%, а также генерирует ключ реестра со случайным именем в разделе Run, причем при работе зараженной системы директория и ключ не видны для файл-менеджеров и редакторов реестра. Чуть позже я расскажу, почему, а пока остановлюсь на компонентах трояна.
Модная нынче тенденция реализовывать малварь не в виде exe, а в виде библиотеки dll не обошла стороной и разработчиков RCS. Вообще, версия этого трояна для Windows включает в себя следующие компоненты (имена модулей могут отличаться в зависимости от версии/хозяина):
- Основной модуль 7KOmPPPs.TRK (DLL, x86).
- Файл конфигурации a5jt555f.Qu6.
- Кодек для кодирования речи CrThBBBT.7ar (DLL, x86).
- Дополнительный x64-модуль tms5ggg8.T4t (DLL, x64).
- Драйвер x64 0Cfkvvvw.HiO (SYS, x64).
- Драйвер x86 YDxohhhn.pYS (SYS, x86).
Любой здравомыслящий человек сразу задаст вопрос о скрытой установке x64-драйвера в систему. Здесь нет ничего необычного, разработчики пошли по пути наименьшего сопротивления и просто подписали его своей электронной подписью. К слову сказать, это их и палит (смотри первую иллюстрацию), так как Гугл моментально наводит нас на сайт производителя трояна.
Где собака зарыта?
Сразу скажу, что я коснусь в основном только x86-версии RCS. Как уже отмечалось ранее, основной модуль представляет собой динамическую библиотеку для архитектуры x86. Dll экспортирует восемь функций с ничем не примечательными именами: HFF1, HFF2, . HFF8. Значение ключа реестра в разделе Run, запускающее троян, имеет следующий вид:
— и намекает на то, что в первую очередь необходимо изучить восьмую функцию HFF8. Вообще, закидывая dll в IDA, я думал, что нарвусь на какой-нибудь пакер или навороченную защиту, но и с этим разработчики не стали заморачиваться — антиотладочных средств я не обнаружил, программа имела только защиту против статического анализа кода, которая скорее направлена против антивирусов, нежели реверсера. Поэтому разбирать по косточкам эту малварь было легко, удобно и интересно.
Запуск
Работу функции HFF8 можно логически разделить на несколько блоков. Первый — проверка основных модулей трояна: сначала он проверяет, является ли rundll32.exe текущим процессом, далее перебирает все dll, подгруженные в адресное пространство, затем пытается получить в каждом из них адрес функции HFF1 и сравнивает полученный адрес с уже имеющимся значением. Далее при помощи функции GetModuleFileNameExW троян получает имя своей главной dll (с путем), преобразует его в ASCII и оставляет только имя файла. Путь к файлу и имя файла сохраняются в двух разных буферах в shared-сегменте, где выделена память для данных, доступ к которым нужен другим процессам, в чье адресное пространство также подгружена dll с трояном. Затем каждый символ полученного имени заменяется на другой в соответствии с некоторой таблицей, а новое имя файла (если все предыдущие шаги завершились успешно) копируется в shared-сегмент как имя файла с настройками. Каждый символ имени файла с настройками также кодируется при помощи некой таблицы для преобразования в имя еще одной части трояна. Таким образом и создаются все необходимые имена файлов, которые записываются в shared-сегмент динамической библиотеки. После имен файлов в разделяемый сегмент копируются имена объектов FileMapping. Всего таких объектов три, и их названия имеют префиксы KMS1, KMS2, KMS3. После каждого префикса идет еще восемь hex-значений. Троян считает проверку успешной, если найден основной модуль. Наличие остальных модулей на данном этапе не проверяется.
Второй блок — активация системы маскировки трояна. На этом этапе инициализации троян сначала пытается открыть устройство MSH4DEV1, которое создается x86-драйвером (номер 6 в списке файлов). Если все проходит успешно, то handle устройства сохраняется. Далее выполняется поиск антивирусного ПО, установленного на зараженной машине. Для поиска троян всегда использует один алгоритм: перебирает загруженные в систему драйвера и ищет нужный по определенному имени. Список распознаваемых антивирусов довольно внушителен: Avira, Avast, Eyee, ProcGuard, McAfee, Kerio, Comodo, Panda, TrendMicro, Ashampoo, Kaspersky, AVG, BitDefender и еще пара-тройка экзотических для наших широт продуктов. Учитывая особенности каждого антивируса, троян пытается установить в систему драйвер YDxohhhn.pYS (если он до сих пор не установлен), который копируется в системную директорию Windows и переименовывается в ndisk.sys. Установка выполняется при помощи функций ADVAPI32 типа CreateService, StartService и т. д. Затем троян пытается открыть устройство MSH4DEV1 и найти загруженный драйвер ndisk.sys. Отмечу, что драйвер устанавливается только в том случае, если на компьютере имеется любая антивирусная программа.
Осенью крупнейший европейский хакерский клуб Chaos Computer Club (CCC) опубликовал отчет о «полицейском трое», который, как потом признали власти, действительно применялся силовыми ведомствами для сбора пользовательских данных. Из-за того что в основном модуле трояна имеется строка C3PO-r2d2-POE, ему присвоили имя R2D2. Малварь состоит из DLL с именем mfc42ul.dll и драйвера winsys32.sys для архитектуры x86. При заражении DLL прописывается в ветку реестра SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_/DLLs и, следовательно, подгружается в адресное пространство каждого GUI-приложения. Малварь скрыто делает скриншоты экрана, перехватывает нажатия клавиш клавиатуры, записывает звонки, совершаемые при помощи Skype, и передает всю эту информацию на удаленный сервер. Отмечу, что здесь механизм перехвата звонков такой же, как и в RCS. Самый главный фейл, который допустили разработчики, — это использование во всех версиях малвари фиксированных ключей шифрования и алгоритма AES в режиме ECB при полном отсутствии аутентификации, что позволяет практически любому пользователю интернета управлять зараженной машиной.
В четвертом блоке инициализируются агенты-процедуры сбора пользовательских данных. В процессе инициализации заполняется массив пар ключ-значение, где ключом является идентификатор агента, а значением — структура с указателями на функции первоначальной инициализации, функцию, код которой будет выполняться в другом процессе, и процедуру обработки полученных пользовательских данных. При этом для каждого агента также вызывается функция первоначальной инициализации. В ходе инициализации агентов дешифруется файл с настройками и инициализируются только те сборщики данных, которые указаны в конфиге.
В пятом блоке запускаются удаленные потоки, собирающие пользовательские данные. В запуске принимают участие другие экспортируемые функции: HFF1, HFF2, HFF3. После создаются локальные потоки, которые получают собранные пользовательские данные и обрабатывают их. На этом процедура начальной инициализации завершается, и указанный инициализационный поток погружается в бесконечный цикл (while(true)< Sleep(1000); >).
В ходе инициализации троян также проверяет, не заражена ли уже система. Алгоритм проверки на заражение достаточно прост: троян ищет объекты FileMapping с определенными именами (KMS1. KMS2. KMS3. ), и если находит, то система считается зараженной и процесс инициализации прекращается. Следует сказать несколько слов и о вызове системных функций. Все функции WinAPI вызываются по адресам, которые выдает GetProcAddress. Имена всех вызываемых функций зашифрованы шифром простой замены. Эти имена хранятся в сегменте данных и расшифровываются каждый раз непосредственно перед использованием.
Версия трояна для 64-битных систем в принципе ничем не отличается от версии под x86. В ней используется тот же самый основной модуль, однако после запуска троян проверяет, не является ли система 64-битной, и если является, то в игру вступают dll и драйвер, написанные специально под x64.
Рекламная брошюра RCS
Android-версия RCS
Дальнейший анализ показал, что при запуске троян пытается проэксплуатировать какую-нибудь уязвимость в Android и получить права root (на моем кастомном билде ему это сделать не удалось). RCS также собирает пользовательские данные (SMS, MMS, контакты) и информацию о сети сотовой связи, периодически включает микрофон телефона и записывает разговоры вокруг и передает всё это добро на удаленный сервер. В диспетчере приложений малварь пытается замаскироваться под com.android.service, а при работе ест много памяти и сильно расходует батарею. Вообще, здесь следует отдать должное производителям Dr.Web Light — антивируса для Android, так как он спокойно палит этот троян и выдает пользователю соответствующее предупреждение.
Работа агента
В большинстве случаев код, внедренный в удаленный процесс, делает одно и то же: подгружает в адресное пространство своего процесса dll основного модуля. После этого открываются FileMapping'и (функция HFF4), а на определенные функции устанавливаются хуки (функция HFF3). По завершении этих процедур dll выгружается из адресного пространства процесса, а поток впадает в бесконечный цикл (засыпает на одну секунду, просыпается и засыпает вновь).
При установке хуков проверяется имя текущего процесса. Если оно не попадает в определенный список, то устанавливаются только те хуки, которые направлены на маскировку трояна в системе. Вообще, этот зловред распознает следующие процессы:
Распознавание процессов осуществляется только по именам, поэтому, переименовав RootkitRevealer.exe в ololo.exe, мы сможем легко обнаружить троян. 🙂
Отдельный агент, постоянно сканирующий файловую систему компьютера, подготавливает для передачи файлы с определенными расширениями. Следует упомянуть и еще об одном потоке, который постоянно сканирует список текущих процессов, чтобы заражать новые процессы. Троян запускает новые процессы на компьютере от имени explorer.exe за счет инжекции кода в Эксплорер. Зловред использует крайне забавный способ для мониторинга активности Firefox: загружает из интернета библиотеки mozcrt19.dll, softokn3.dll и mozsqlite3.dll, которые просто посылают запросы к SQLite-базам браузера. Подобным образом троян работает и с некоторыми другими программами.
Реакция антивируса
Отчет Dr.Web Light об обнаруженных вирусах
Summary
Вообще, видео на сайте производителя испугало меня больше, чем сам троян. Его несложно обнаружить и нейтрализовать, к тому же после знакомства с современными средствами создания ботнетов от расковырянной коммерческой малвари остаются весьма противоречивые впечатления. Версия для Android вообще не выдерживает критики — она может испортить жизнь только тем пользователям, которые вообще не следят за своим смартфоном, устанавливают приложения из неизвестных источников и безразлично относятся к количеству подтверждений, запрашиваемых приложениями. На примере этого трояна хорошо видно, что технологии коммерсантов отстают от технологий их криминальных коллег — создателей Zeus, TDSS, SpyEye и других подобных вещей.
Люстра перестала слушаться пульта? Даю 90%, что её можно отремонтировать! Сегодня я подробно и всесторонне рассмотрю процесс ремонта контроллера светодиодной люстры. Рассмотрим схему контроллера и всевозможные неисправности и способы их устранения. И напоследок – пример реального ремонта, сделанного моими руками.
Такой контроллер ещё называют в быту пультом дистанционного управления, блоком радиоуправления, либо дистанционным выключателем.
По-английски название звучит “Remote Control Switch”, дистанционно управляемый выключатель. Либо – “Digital Remote Switch”, что сути не меняет. Контроллер люстры на русском языке также называют блоком управления или дистанционным выключателем. Его мы и будем ремонтировать сегодня.
Где в основном применяется блок управления люстрой и как он работает, я очень подробно расписал в других моих статьях:
- Устройство и установка люстры с пультом ,
- Как отремонтировать светодиодную люстру с пультом своими руками .
- Перестали гореть светодиоды в люстре . Ремонт и схема светодиодного драйвера.
Другие ссылки на статьи в Дзене будут в конце статьи.
Важно! Контроллеры люстр имеют бестрансформаторную схему питания, поэтому следует соблюдать осторожность при ремонте!
Всё, хватит вступления. Переходим непосредственно к теме статьи.
Как устроен контроллер с пультом для люстры
Коротко ещё раз, о чём речь.
Этот дистанционный выключатель, как система, физически состоит из двух устройств – из передатчика (Transmitter) , то есть пульта управления, на котором пользователь нажимает кнопки), и приемника (Receiver) , который входит в состав контроллера. Приемник в контроллере распознает сигналы с пульта, и дает сигналы на включение реле того или иного канала. И уже через контакты реле питание поступает на соответствующую группу освещения.
Вся система выглядит таким образом:
Куда подключаются провода контроллера, в этой статье рассматривать не будем. Этому уделено достаточно много внимания в других моих статьях, ссылки выше и ниже.
Инструкция по использованию и подключению блока управления дана на его корпусе:
Вскрываем корпус. Для этого надо открутить один шуруп, остальное – как обычно в таких устройствах, на защелках.
Схема контроллера светодиодной люстры
Напоминаю, что этот дистанционный радиоуправляемый выключатель (блок управления) можно применять не только в люстрах, но и в других электронных устройствах. Можно коммутировать любое напряжение (в разумных пределах, при небольшой доработке печатной платы), и любые токи (ток ограничен током реле, но можно поставить дополнительные контакторы).
Схема контроллера приведена ниже:
Имея эту схему, можно смело браться за ремонт контроллера, и шансы на успех довольно высоки.
Для подробного рассмотрения схемы я её увеличил, и разбил на 6 условных частей:
Рассмотрим каждую часть по отдельности.
1. Силовое питания и коммутация
В эту часть схемы входят входные и выходные цепи, и контакты реле, через которые питается нагрузка.
Катушки реле входят в 3-ю часть схемы.
Ноль и фаза поступают дальше.
2. Схема питания 220 – 12 В
На эту часть приходит напряжение 220В, ноль и фаза. Ноль проходит на диодный мост через дроссель, который в некоторой степени устраняет высокочастотную помеху по питанию, которая может приводить к сбоям. Для этой же цели служит конденсатор С1.
Фаза на диодный мост приходит через гасящий конденсатор С2, который для безопасной работы зашунтирован резистором R1.
Каждый диод диодного моста также зашунтирован конденсатором, для минимизации высокочастотной составляющей питающего напряжения.
Выход диодного моста нагружен на конденсаторы фильтра С3 и С4, которые служат для фильтрации низкочастотной и высокочастотной составляющих выходного напряжения моста. Напряжение стабилизируется цепочкой из последовательно соединенных стабилитрона VD2 на 12В и ограничительного резистора R4.
В результате в точке А образуется напряжение постоянного тока 12,5-15В по отношению к нулевому проводу (минус диодного моста).
3. Ключевые транзисторы
Ключевые транзисторы – это по сути усилители дискретного сигнала, который поступает с декодера. Они включены по классической схеме.
4. Схема питания 12 – 5 В
Далее напряжение 12В поступает на схему стабилизации питания +5В. Напряжение на входе этого стабилизатора понижается и стабилизируется цепочкой из резистора R6 и стабилитрона VD4 на 12В и подается на интегральный стабилизатор 78L05. Далее, стабилизированное напряжение +5В дополнительно фильтруется конденсаторами С5 и С6, поскольку нужно особое качество постоянного напряжения.
5. Радиомодуль
Напряжение питания +5В поступает на питание радиомодуля. Назначение радиомодуля – принять из радиоэфира сигнал от пульта управления, и выдать его в таком виде, чтобы его мог раскодировать декодер.
6. Декодер радиосигнала
Декодер получает сигнал на частотах, каждая из которых соответствует заранее обозначенному сигналу. Что творится в декодере – секрет фирмы, даташит на микросхему HS153SP-J найти не удалось.
“Продукт жизнедеятельности” декодера радиосигнала – дискретные напряжения порядка +5В, которые открывают ключевые транзисторы.
Кому будут интересны аспекты работы схемы, о которых я не сказал, либо есть чем меня дополнить и попрекнуть – пишите в комментарии!
Контроллер, который мы ремонтируем
Теперь самое интересное – я опишу процесс ремонта контроллера Kedsum K-PC803 , фото внешнего вида которого я уже приводил в начале статьи.
В процессе ремонта этого контроллера, как и любой бестрансформаторной электроники, нужно помнить о опасности – схема всегда находится под напряжением сети!
Схема этого контроллера почти полностью совпадает со схемой, приведенной выше. Разница лишь в том, что в этом контроллере не 2 канала, а 3. Но принцип абсолютно тот же. Уделим немного времени, чтобы познакомиться с некоторыми внутренностями и отличиями от приведенной схемы.
Вот как выглядит контроллер для управления люстрой на 3 канала изнутри:
Три реле (черные, слева) соответствуют трем каналам управления.
Справа от верхнего реле видим ряд черных полукруглых деталек. Это три ключевых транзистора и стабилизатор на +5В. Вот как это выглядит в другого ракурса:
На этом фото можно различить транзисторы Q1, Q2, Q3 – ключевые для включения реле (тип – С9013), стабилизатор +5В для питания радиочастотной части – L78L05, и микросхему декодера радиосигнала HS153SP-J.
Обратная сторона схемы (сторона пайки). На фото подписал выводы, чтобы было легче провести рекогнисцировку:
Процесс ремонта блока управления люстрой
Проблема неисправного контроллера была в том, что не включалось более одного реле. Да и одно реле иногда могло не включиться. То есть, если ещё одно какое-то реле удается включить, то второе и тем более третье уже не включаются.
Для ремонта нужно прежде всего убедиться, что пульт работает (батарейки в норме, и при нажатии на любую кнопку на пульте загорается индикатор), и подать питание на контроллер:
Я подключил питание через клеммы Ваго, это очень удобно. Оба провода N (черные) вставил в клеммник, хотя достаточно одного любого. Дело в том, что нагрузку я не подключаю, и провод N, если будет болтаться, может закоротить на выходные фазные провода. Наличие выходных напряжений проверяем можно проверять, подключив 3 нагрузочных лампочки. Но можно поступить проще – проверять наличие/отсутствие фазы на выходах указателем фазы.
Рекомендую для удобства, чтобы не втыкать в розетку, подключить наше устройство не через Ваго, а через двухполюсный автомат, так удобнее его включать/выключать. Номинал – чем меньше, тем лучше.
Ещё лучше, для безопасности, питать устройство через трансформатор 220/220 В, для гальванической развязки от сети. Тогда риск удара током значительно снизится.
Прежде всего, проверяем напряжение питания. Измеряем обычным мультиметром, включенным на режим постоянного напряжения, на электролитическом конденсаторе фильтра С3. По отношению к общему проводу (минус диодного моста и конденсаторов С3, С4, как удобнее).
Напряжение при отключенных реле (почти без нагрузки, вхолостую) на конденсаторе фильтра 11,2В, при включении любого из реле падает до 6В. При таком напряжении, даже если декодер выдаст сигнал на открытие транзистора, и он откроется, реле всё равно не включится.
Естественно, подозрение сразу пало на часть электросхемы, отвечающей за питание. А именно – на ограничительный конденсатор С2 перед диодным мостом.
На нем написано 155J. Это означает 15х10^5 пикоФарад. А так как в 1 микроФараде миллион пикоФарад, значит, емкость конденсатора 1,5 мкФ. С напряжением всё ясно, 250В. Маловато.
Если у него упала емкость, то он сильно ограничивает ток диодного моста, и под нагрузкой напряжение на выходе моста (да и на входе, в первую очередь) сильно просаживается.
Кстати, заметьте, что в контроллере на 2 канала емкость этого конденсатора меньше – 1 мкФ. Ведь мощность источника питания требуется меньше, чем для трех реле.
Другой возможный виновник просадки – электролитический конденсатор на выходе диодного моста 470 мкФ 25В.
Меняем конденсатор 1,5 мкФ.
Теперь измеряем напряжение на выходе диодного моста в четырех рабочих режимах:
- в холостом ходу: 12,9В,
- включение одного реле: 12,2В,
- включение двух реле: 11,7В,
- включение трех реле: 10,5В.
Всё работает нормально!
Следует заметить, что низкое напряжение питания (12…15В) может быть не только из-за неисправности схемы питания, но и из-за аномально высокого потребления тока в нагрузке. В частности, это могут быть стабилитроны, стабилизатор +5В, или нагрузка на выходе стабилизатора +5В.
Другие неисправности контроллеров люстр – ниже:
Типичные неисправности блока управления (контроллера) люстры
Следует помнить, что чаще всего в любых электронных устройствах проблемы возникают с подключением или с питанием.
В схеме контроллера ремонт может идти по таким пунктам:
- Проверка наличия входного напряжения 220В.
- Проверка напряжения холостого хода 12…15В на выходе диодного моста. Если этого напряжения нет, проверить ограничительный конденсатор, диодный мост, конденсаторы фильтра, стабилитрон. Для исключения влияния последующих частей схемы отключить нагрузку схемы питания, перерезав дорожку на плате.
- Проверить напряжение на входе и выходе стабилизатора +5В.
- Проверить работу декодера. При наличии сигналов с пульта на выходах декодера и соответствующих базах транзисторов будет появляться напряжение.
- Проверить ключевые транзисторы. При их открытии должны включаться реле.
- При включении реле фаза должна появляться на соответствующих выходах контроллера.
Если не ремонтировать
Если ремонт зашёл в тупик, и продолжать его уже нет ресурсов (психологических, материальных и временных), то контроллер можно просто купить.
Я полагаю, что эти три контроллера имеют одинаковую начинку, за исключением количества реле с транзисторами, и мощностью внутренней схемы питания.
Всех тонкостей схемотехники и ремонта радиоуправляемых контроллеров люстр тут описать, конечно, не возможно, поэтому – задавайте вопросы в комментариях, будем разбираться вместе.
Вариант контроллера люстры:
Все контроллеры имеют примерно одинаковую схему, разные лишь бренды. Например. Фото блока управления люстрой, присланное читателем:
Использование нативного интерфейса также причиняет набольшое неудобство — любое нажатие клавиши в процессе прохождения может «обрушить» тест.
Как преимуществом, так и недостатком Selenium RC есть использование Selenium Server Standalone. С одной стороны использование сервера упрощает логирование результатов, что существенно упрощает написание автотестов(на Webdriver приходится ставить различные «костыли», чтобы выяснить где именно произошла ошибка потому, как из-за скорости прохождения тестов это не всегда можно определить визуально), но с другой стороны — увеличивается время прохождения теста и невозможность использовать для тестирования страниц на мобильном устройстве.
Недостатком Webdriver по сравнению с класическим RC есть сложность имитирования действий как, например, наведение курсора мыши. С другой стороны Webdriver как и реальный пользователь не может работать со скрытыми элементами или, например, не сможет ввести текст в поле, полностью перекрытое другим элементом.
Отдельно стоит сказать о работе с JavaScript и AJAX. В Webdriver реализованы механизма ожидания завершения AJAX-запросов: Explicit Waits (явные ожидания) и Implicit Waits (неявные ожидания) (Подробнее здесь Ожидания в Webdriver). В RC для ожидания AJAX приходится использовать средства языка программирования. Также стоит отметить, что Remote Control не всегда корректно работает с JS. Например, selenium.click не может вызвать JS-ивент onMouseDown и приходится гадать, «что же там использовал разработчик?» чтобы написать корректную команду. С Webdriver подобные проблеммы не возникают.
В Selenium Remote Control в процессе развития сформировался достаточно широкий набор комманд, в то время как в Webdriver почти всё сводится к .click или .sendKeys (вобшем-то реальный пользователь может сделать не намного больше, однако, например, простая комманда для снятия скриншота или выбора Ok/Cancel в диалоговом окне не помешала бы). Однако в Webdriver реализовано большее количество локаторов для поиска элемента на странице.
By.id — обращается к элементу по ID;
By.name — обращается по имени элемента name:
By.xpath — обращается к элементу по xpath выражению;
By.tagName — поиск по имени HTML тэга;
By.cssSelector — данный тип локаторов основан на описаниях таблиц стилей (CSS);
By.className — поиск по CSS классу элемента;
By.linkTex — поиск ссылки по тексту;
By.partionalLinkText — поиск ссылки по части текста;
Рассмотрим примеры тестов на RC и Webdriver (Java).
Напишем автотесты, которые заходят на Google, вводят в строку поиска zerg rush, нажимают кнопку поиска, затем после небольшего ожидания снимают скриншот окна.
Из всего выше сказанного видно, что и Remote Control и Webdriver имеют как недостатки так и преимущества. В большом количестве случаев удобнее использовать RC, т.к. большой набор комманд и возможность работать со скрытыми элементами, а также возможность получать логи сервера существенно упрошают и ускоряют (время — деньги) процесс написания и последующего адаптирования тестов. Webdriver же уместно использовать там, где не справляется (плохо справляется) RC, например для перегруженых AJAX-запросами веб интерфейсов или в местах где крайне вожно точно симитировать действия пользователя (следует заметить, что Webdriver и был внедрён потому, что с появлением более новых веб-технологий Selenium RC просто исчерпал себя и необходимость в альтернативном подходе стала очевидной).
Также в Selenium 2 реализована возможность перехода с RC на Webdriver. Подробно описан в оф. документации.
У меня нет телевизора. Совсем. На антресолях где-то лежит старый маленький пузатик, но кабель антенны давно свернут, а телевизор этот — скорее издевательство, разве что на кухне поставить и то маловат.
Поэтому в качестве музыкального центра и телевизора я использую свой ПК. И все бы хорошо, но лень — это не только двигатель прогресса, но и фактор, который портит удовольствие, заставляя встать с дивана, на котором уютно устроился с кружкой чая, чтобы запустить программу или выключить колонки после просмотра фильма перед сном.
Существует множество ИК приемников, практически все они могут управлять компьютером и даже могут его выключить, но не могут его включить. И вот в этот момент компьютер перестает быть столь же удобным сколь телевизор или музыкальный центр. Но и проект Igor HID не порадовал своим софтом. Вроде все умеет, а неудобно. И не влезешь в него, исходников нет. Вот поэтому я собрался и сделал свой проект, открытый и доступный всем.
Сделал я его с нуля до законченного комплекта. А поскольку мой опыт в разработке и программировании электронных девайсов до него можно сказать был нулевым, то я считаю, что повторить это сможет каждый, кому это интересно.
Называется он USB-IRPC (USB Infrared Remote Personal Computer Control — «Юэсби-ИРПиСи» или ИРПЦ, кому как больше нравится :). Буква R на самом девайсе — просто сокращение от моего ника.
Важным преимуществом девайса является то, что он программно совместим с Arduino и в случае отсутствия уверенности в своих силах в ЛУТ может быть сделан на основе Arduino на макетной плате. Это, конечно, не так компактно и аккуратно, не так дешево, но зато доступно практически всем, даже навыки пайки особые не потребуются.
Если стремление к комфорту вам не чуждо и идея превратить свой компьютер в медиацентр, а заодно поуправлять электророзетками с пульта вам интересна, тогда вперед.
Просьба, если соберетесь делать устройство после прочтения статьи, задавайте вопросы в комментариях. По опыту предыдущих статей: вас довольно много и вопросы вы задаете одинаковые :)
Я лучше один раз отвечу всем, добавив в статью или в комментариях. Уведомления о комментариях с вопросами я просматриваю и стараюсь отвечать.
Итак, идея устройства
- Включать и выключать компьютер с пульта от телевизора или любого другого ИК пульта.
- Включать и выключать розетки, в которые воткнуты настольная лампа и колонки (две розетки, управляются отдельно).
- Управлять розетками с ПК программно, чтобы не искать пульт, оставленный на диване, когда сидишь перед компом или включать колонки для работы ПК в качестве будильника по расписанию с утра :)
- Запускать программы на ПК по нажатию кнопки на пульте.
- Выполнять custom задачи по нажатию кнопок — какие запрограммирую.
- Устройство не требует драйверов, работает и под Win7 х86, Win7 x64, Win 8 x64.
- Не требует прав администратора при подключении и использовании.
- В системе определяется как HID устройство (USB Input Device).
- Никаких дополнительных .dll типа lubusb тоже не потребуется.
- Под Linux не проверял, но не думаю, что будут проблемы. Правда написать софт я не смогу — под Linux я этого не умею.
Недостатки
- Пока на мой взгляд распознавание нажатий кнопок пультов не идеально. Можно сделать лучше, уверен. Но это исправляется программно.
- Вшитые функции, работающие и без ПК, можно поменять только перекомпилировав прошивку, а для этого придется скачать AVR Toolchain — писать прошивку в Arduino IDE сплошное мучение для меня, поэтому я пользуюсь Code::Blocks. Но залить прошивку в Arduino не составляет никакой проблемы. Даже в консоль лезть не придется. Позже можно будет и программно назначить эти функции любым кнопкам пульта.
- Программа на английском. Я знаю, что у подавляющего большинства проблемы с английским и знаю привычку все и вся русифицировать.
- Русские надписи почти всегда длиннее английских либо имеют уродливые сокращения.
- В русском языке не сложилось однозначной терминологии для ИТ и надписи на элементах интерфейса часто больше путают чем проясняют.
Я расскажу сначала как сделать на основе Arduino, затем расскажу как сделать самому с нуля, а если найдутся желающие, напишу отдельно как с этим устройством работать программно с ПК.
USB-IRPC на основе Arduino
На самом деле я и начинал устройство на основе Arduino. Я использовал дешевую Arduino Pro Mini и кусочек макетной платы:
«IRPC v1»
Эта версия не имела связи с ПК, умела только управлять розетаками и питанием ПК, но проработала у меня больше 9 месяцев — с ноября 2011го.
Как обычно, начинаем с закупки деталей.
Нам понадобится:
1. Arduino (любая с питанием от 5В) — примерно от $7
Модуль управления розетками:
2. Плата с реле на 220В, управляемая сигналом 5В. Если хватает опыта, можете сделать сами. У меня была в хозяйстве вот такая, давно думал, куда ее приспособить:
Да, релешек на ней 4, а используется только 2, потому что во-первых — у меня был только 4проводный кабель под рукой, а для 4 реле жил нужно 6 (+- и 4 сигнальных), а во-вторых под рукой было только 2 одинарные розетки, а удлинителей не на общей шине, а с проводами к каждому гнезду отдельно я не нашел на рынке. Мне она досталась за дикие $17, но купил я ее давно. Сейчас она есть на ebay по $3.82, более того, советую вам взять для этого проекта с двумя реле — дешевле и компактнее:
Недостаток реле в том, что они щелкают при переключении. И если бы у меня не валялись без дела, я бы сделал на симисторах BT138 с гальванической развязкой на MOC3063 примерно вот по такой схеме (не моя, дернул кусок из найденной гуглом картинки):
3. Кабель 4-проводный (можно использовать UTP, если есть, тогда розеток можно сделать больше). Длина — чтобы хватило от ПК до места где будет лежать блок розеток.
4. Коннектор PBS-4 для окончательного варианта или вилка PLS-4, если будете делать на Arduino.
5. Кабель медный для подключения розеток к реле — 2 куска примерно сантиметров по 20.
6. Кабель электрический с вилкой Schuko (CEE 7/4) или любой другой, имеющийся под рукой, который выдержит нагрузку:
7. Две настенные накладные розетки (или больше, если релешек больше и кабель UTP) — примерно 30 рублей штука.
8. Кусок фанеры и коробочка для крепления платы с реле и розеток.
Я смонтировал в обычную картонную коробку, прикрепил к куску пластика болтиками и закрепил кабели стяжками. получилось вот так:
«USB-IRPC 2-sockets 220v module»
Под столом это смотрится довольно аккуратно. Розетки разные, да, других не было :) Одну купил, вторая осталась от апгрейда настенной розетки на двойную.
«RPC-2PWR»
Оформительские изыски оставляю на ваше усмотрение.
Модуль ИК приемника
9. ИК приемник TSOP1738, TSOP1736 или IRM_3638. Найдете аналог — попробуйте его. У меня IRM3638 работает лучше всего.
10. Резистор на 10кОм
11. Светодиод + резистор на 100-390 Ом (какой есть такой и берите), на крайний случай можно обойтись встроенным в Arduino на Pin 13 если под рукой ни резистора ни светодиода нет, будет без выносной индикации.
12. 2 Коннектора PBS-4 для окончательного варианта или вилка PLS-4, если будете делать на Arduino.
13. Четырехпроводный кабель такой длины, чтобы хватило от системного блока ПК (девайс установим внутрь) до места, где приемник удобно закрепить, чтобы он был на прямой видимости с дивана (я закрепил на ножке монитора).
Модуль управления питанием ПК
14. Коннектор PBS-2 для подключения к материнской плате вместо кнопки питания.
15. Коннектор PLS-2, для подключения кнопки питания от корпуса параллельно, чтобы не терять возможность ей пользоваться. (можно просто купить одну линейку пинов PLS-40 и откусить кусачками от нее куски с нужным количеством пинов).
16. Оптопара PC817 или ее аналог. По идее стоит 4-8 рублей, но на Царицынском радионыке барыги за нее потребовали 40 рублей.
Можно и реле использовать, но это совсем изврат получится, хотя работать будет :)
17. Токоограничительный резистор на 100-150 ом любой мощности, что найдется под рукой.
Интерфейс с ПК (V-USB)
18. USB кабель, нас интересует только USB A вилка для подключения к ПК, на другом конце может быть что угодно, мы его все равно отрежем. Так что можно использовать любой ненужный кабель. Лишь бы целый был со стороны компа.
19. 2 стабилитрона на 3.6В желательно 0.25 Вт, но можно больше.
20. 2 резистора на 68 Ом.
21. 1 резистор на 2.2 кОм. К мощности особых требований нет.
Паяльник, припой, флюс (канифоль сойдет), немного монтажного провода (да любые проводки, какие есть под рукой).
Какой-нибудь пульт с кодировкой RC-5 типа такого:
«IR RC»
У меня также отлично работает пульт от AverMedia.
Если будете собирать на макетной плате, то понадобятся она и немного проводов, нечто в этом роде :)
Это только кажется что всего много, но на самом деле затраты невелики. Разве что будете покупать все в Чип и Дипе :)
Разбираемся как собрать и как это работает
Если у вас Arduino Pro Mini или Arduino nano, устанавливаем ее на макетную плату типа Breadboard или как в моем случае на кусочек макетки с пятачками для пайки, припаяв ее туда напрямую или с помощью коннекторов, чтобы можно было снять:
Обычную придется подключать к макетной плате проводками.
Подключаем ИК приемник.
Сигнальную ножку напрямую к пину 8 (D8). Между сигнальной и ножкой питания включаем резистор на 10к, ну и оставшуюся ножку заземляем:
у TSOP 1738 сигнальная ножка на фото справа:
Средняя — питание (+5В), левая — земля (GND).
Это три провода, четвертый — для выносного светодиода, я его поставил рядом с приемником, чтобы показывать, что нажатие кнопки принято. Подключаем его через резистор анодом к пину D9, катодом к земле.
Подключаем плату с реле
- VCC к +5 Arduino
- GND к GND Arduino (земля)
- IN1 к пину 6
- IN2 к пину 5
Подключаем управление питанием ПК
Кнопка питания на корпусе просто замыкает два контакта, мы сделаем то же самое с помощью оптопары PC817.
Когда подаешь 5В на вход светодиода, сопротивление между ножками фотодиода падает почти до нуля (на самом деле не до 0 но для наших целей сойдет). Для того, чтобы выход микроконтроллера не спалить, включаем последовательно токоограничивающий резистор.
Резистор подключаем к выходу А2 Arduino, второй контакт резистора к 1й ножке PC817 (отмечена точкой). Вторую ножку на землю. К 3й и 4й подключаем двумя проводами с двухконтактным разъемом те два пина на материнской плате, что обозначены как PWR + и PWR-, сюда же параллельно подключаем кнопку от корпуса ПК, чтобы она тоже могла замыкать эти контакты.
Подключаем к USB
В моем проекте используется программная реализация USB для AVR известная как V-USB.
Берем USB кабель, отрезаем конец, который подключался к устройству
Красный — VCC (пин 1 на схеме справа)
Черный — GND (пин 5 на схеме справа)
Зеленый — D+ (пин 3 на схеме справа)
Белый — D- (пин 2 на схеме справа)
D+ подключаем к пину 2 через резистор 68 Ом, D- подключаем к пину 4 через резистор 68 Ом.
резистором на 2.2 кОм соединяем ножки D3 и D4 (подтяжка).
Стабилитроны включаются в обратном направлении катоды (сторона с черной полоской на корпусе) к — D2 и D4 соотвественно, аноды — на землю.
VCC и GND подключаем соответственно к таким же пинам Arduino — питаться она будет от USB.
Все, наша схема собрана.
Внимательно проверьте все по шагам, чтобы не спалить при подключении ничего.
Если все проверили — прошиваем с помощью AvrDudeR. Дело в том, что писал я прошивку на С, компилировано с помощью AVRToolchain. Проект в Code::Blocks. Исходники проекта выложу чуть позже на странице проекта
Настройки такие:
COM порт указываем тот, который назначился для Arduino, для Duemillanove скорость 57600, для UNO 115200.
Файл прошивки берем этот.
Если прошилось все успешно, можно отключить Arduino от компа, подключаем теперь нашим USB проводом, который мы развели на плате через стабилитроны и резисторы. Одновременно лучше не подключать и хвостом самой Arduino и коннектором проекта.
Если все сделали правильно, в системе определится USB Input Device.
Управление с помощью плагина к MKey
Плагин позволяет назначать кнопкам пульта любые функции MKey.
Качаем MKey, устанавливаем, мой плагин к нему кладем в папку Plugins.
Запускаем MKey, на вкладке настроек включаем плагин R USB-IRPC.
Настройка простая. Жмем Add, открывается окошко, где предлагают нажать кнопку, жмем ее на пульте, даем ей название как на пульте и назначаем для нее действие.
Для того, чтобы управлять реле программно, понадобится моя программа:
- управлять реле и выносным светодиодом
- программно «нажать» кнопку питания на ПК
- автоматически отключается от устройства при засыпании ПК
- автоматически подключается при пробуждении ПК.
- опрашивает устройство каждые 300 мс по умолчанию (настраивается)
- выводит состояние реле и индиакторного светодиода, код последней нажатой с момента опроса кнопки пульта
- включить/отключить прием нажатий кнопок ИК пульта.
- сохранить в EEPROM состояние реле и считать его оттуда. При включении USB-IRPC считывает из EEPROM состояние реле и устанавливает их.
- соответствие названий кодам кнопок пульта считывается из простого текстового файла, выбранный файл конфигурации пульта загружается при старте программы автоматически.
- запуска программ по нажатию кнопки
- передачи нажатий кнопки в запущенную программу
- назначения устройству самостоятельной реакции на выбранные кнопки пульта одной из встроенных функций: переключение реле, нажатие кнопки питания ПК. (сейчас такая функциональность в прошивке встроена для одного конкретного пульта).
Я постарался рассказать максимально подробно для самых начинающих, потому что постоянно получаю множество простых одинаковых вопросов в почте, поэтому объем статьи получился большой.
Во второй части расскажу как сделать устройство, изображенное на самой первой фотографии самостоятельно с нуля, а не на основе Arduino.
Все исходники я немного причешу и выложу на страницу проекта, чтобы функционал можно было изменить под себя. Если будут желающие, отдельно расскажу что и как работает с программной точки зрения.
Часть 2 — изготовление с нуля и программный интерфейс.
Сегодня расскажу о том, как управлять компьютером с мобильного устройства. Нет, это не очередной аналог radmin'a, и не пример того, как можно поиздеваться над компьютером друга. Речь пойдет об удаленном управлении демоном, а точнее — о создании интерфейса для управления демоном, написанном на Python.
- «Remote control App» — Kivy-приложение, реализующее клиентскую часть для мобильных устройств.
- «Remote control» — Django-приложение, реализующее REST API и взаимодействие с БД;
- IRemoteControl — Класс, реализующий логику обработки поступивших команд (будет использован в демоне);
- создать отдельный Python virtual environment
- создать новый Django-проект (например — web)Все операции с Django будем выполнять относительно этого каталога;
- создать каталог для Android-приложения (например — ui_app). Все операции касательно мобильного приложения будем выполнять относительно этого каталога.
«Remote control»
Начнем с серверной части — Django-приложения. Создадим новое приложение и добавим superuser'а:
Рекомендую сразу же его добавить в используемые Django-проектом приложения (web\settings.py или вместо «web» — имя вашего Djnago-проекта):
Создадим БД и superuser'а:
Настройки завершены, приступаем к реализации приложения.
Модели (remotecontrol\models.py)
- Код команды — будем использовать 4 команды: «Приостановить», «Возобновить», «Перезапуск», «Отключить пульт управления»
- Состояние команды — возможны 4 состояния: «Создана», «В обработке», «Выполнена», «Отклонена».
- IP
- Дата создания объекта
Немного «проапгрейдим» модель:
1. Расширим стандартный менеджер. Добавим методы для получения команд в состоянии «Создана» и в состоянии «В обработке».
И добавим его в модель:
2. Добавим методы проверки состояния и методы установки состояния команды:
Примечание: Конечно, можно обойтись и без этих методов. В таком случае в коде, работающим с Django ORM, потребуется использовать константы и описывать логику (хоть двухстрочную, но все же) обновления команды, что, имхо, не совсем удобно. Намного удобнее дергать необходимые методы. Но если такой подход противоречит концепции — с удовольствием выслушаю аргументы в комментариях.
Админ-панель (remotecontrol\admin.py)
Примечание: Здесь и далее нам понадобится приложение «django-ipware» для определения IP клиента, установим:
Здесь все проходит нативно: регистрируем модель в админ-панели, описываем отображаемые столбцы в таблице и поля на форме. Единственный нюанс — для сохранения IP клиента в объекте необходимо переопределить метод сохранения:
Не забываем применить изменения в моделях к базе данных:
Приступим к реализации логики обработки команд.
Класс IRemoteControl
- «Приостановить» — приостанавливает основной цикл демона и игнорирует все команды, кроме «Возобновить», «Перезапуск» и «Отключить пульт»;
- «Возобновить» — возобновляет основной цикл демона;
- «Перезапуск» — выполняет ре-инициализацию демона, повторное считывание конфигурации итд. Данная команда выполняется и в случае действия команды «Приостановить», но после перезапуска возобновляет основной цикл;
- «Отключить пульт управления» — прекращает обрабатывать поступающие команды (все дальнейшие команды будут игнорироваться). Данная команда выполняется и в случае действия команды «Приостановить».
- За одну итерацию обрабатывается одна команда;
- Получаем самую «старую» команду в состоянии «В обработке». Если таких нет — получаем самую «старую» в состоянии «Создана». Если нет — итерация завершена;
- Если команда получена с недопустимого IP — устанавливаем состояние «Отклонена». Итерация завершена;
- Если пульт управления отключен — устанавливаем команде состояние «Отклонена». Итерация завершена;
- Если команда недопустима для текущего состояния демона — устанавливаем состояние «Отклонена». Итерация завершена;
- Устанавливаем состояние «В обработке» (если требуется), выполняем команду, устанавливаем состояние «Выполнена». Итерация завершена.
Модуль control.py (remotecontrol\control.py)
Модуль, в котором опишем реализацию IRemoteControl, предлагаю разместить в каталоге приложения. Так мы получим удобно транспортируемое Django-app.
Черная магия
Если модель сферического демона в вакууме можно представить в таком виде:
то внедрение интерфейса пульта управления происходит безболезненно:
В результате призванная нечисть управляется, но только с админ-панели.
Поместим данный код в файл, к примеру, daemon.py и пойдем дальше — напишем мобильный клиент.
REST API
Но для начала неплохо было бы реализовать интерфейс для общения мобильного клиента и серверной части. Приступим.
Подготовительный этап
Установим Django REST framework:подключим (web\settings.py):и настроим (там же, добавляем в конец файла):
Сериализаторы (remotecontrol\serializers.py)
Начнем с описания набора возвращаемых данных интерфейсом REST. Здесь нам пригодятся те загадочные методы из описания модели (.status_dsp() и .code_dsp()), которые возвращают текстовое название состояния и кода команды соответственно:
Представления данных (remotecontrol\views.py)
End-point'ы (remotecontrol\urls.py)
Опишем end-point'ы реализованных API-методов.
И подключим их к проекту (web\urls.py):
Интерфейс для общения реализован. Переходим к самому вкусному.
«Remote Control App»
- поддержка асинхронного режима;
- автоматическая конвертация полученного в ответ корректного JSON в Python dict.
Надеюсь, комментариев в коде достаточно для понимания. Если все же недостаточно — сообщайте, буду вносить правки.
На этом баловство с кодом завершается и на сцену выходит
Тяжелая артиллерия
О Buildozer'е можно говорить долго, потому что о нем сказано мало. Есть и статьи на хабре (об установке и настройке и о сборке релиз-версии и публикации на Google Play), конечно же, есть и документация… Но есть и нюансы, о которых можно написать целую статью которые разбросаны по разным источникам. Постараюсь собрать основные моменты здесь.
- Для сборки Android-приложения все же потребуется Linux, можно обойтись и виртуальной машиной. Обусловлено это тем, что python-for-android (необходимый для сборки пакет) в текущей версии использует более свежую версию пакета sh (ранее pbs), в которой отсутствует поддержка Windows;
- На самом деле, процесс сборки затягивается надолго только в первый раз — здесь Buildozer устанавливает и настраивает необходимые Android-dev зависимости. Все последующие сборки (с учетом, что в конфигурации сборки не менялись параметры ndk, sdk или requirements) выполняются за 30-40 секунд;
- Перед установкой Buildozer убедитесь, что корректно установлен Kivy и Kivy-garden (последний должен установится автоматически с Kivy);
- Также, перед установкой Buildozer необходимо установить зависимости (подробнее — здесь). Сам Buildozer их не устанавливает, но могут возникнуть нештатные ситуации при установке или (что хуже) в процессе сборки.
- НИКОГДА не запускайте Buildozer под правами root;
Ну и немного кода в помощь счастливым обладателям Debian и Ubuntu (остальным потребуется «тщательно обработать напильником»)
Теперь, когда Buildozer установлен, инициализируем его:
В результате работы этой команды в каталоге создастся файл конфигурации сборки (buildozer.spec). В нем находим указанные ниже ключи и присваиваем им соответствующие значения:
и на выходе имеем .apk, который можно установить на Android-девайс.
Готово. С чем я вас и поздравляю!
Тестирование
И давайте посмотрим, как все это работает. Не зря же так долго старались :)
Запускаем Django-сервер, параметром указываем IP вашей машины в локальной сети:
Стартуем приложение на Android-девайсе и видим нечто подобное:
Подведем итоги
- Легко встраиваемый класс, реализующий логику реакции на удаленные команды;
- Серверное приложение, позволяющее управлять произвольным скриптом из web-интерфейса, и предоставляющее REST API;
- Android-приложение для управления скриптом посредством REST API.
Может это слишком громко сказано, но… Теперь меня мучает вопрос — а можно ли реализовать аналогичную архитектуру, используя другие языки и технологии (кроме Python), приложив при этом (хотя бы) не больше усилий и написав не больше кода?
Читайте также: