OpenWRT: установка ПО и настройка IPTV от Ростелекома

Записки обо всём.

Установка OpenWrt из Trunk

Итак Trunk — это тестовая ветка, в которую практически ежедневно выкладываются самые свежие сборки прошивки (на момент написания статьи — это Barrier Breaker), однако их стабильность и работоспособность не гарантируется.

Сохранение репозиторияПрежде, чем преступить к установке, остановимся подробнее на одной очень важной особенности ветки trunk, которую необходимо иметь ввиду! А заключается она в том, что вместе со сборкой прошивки, которая обновляется едва ли не ежедневно, обновляется и репозиторий пакетов программного обеспечения для неё. Поэтому, установив сборку из trunk, мы рискуем буквально на следующий день остаться без совместимого с ней репозитория. Чтобы этого не произошло, НЕОБХОДИМО ВМЕСТЕ СО СБОРКОЙ САМОЙ ПРОШИВКИ СКАЧИВАТЬ И РЕПОЗИТОРИЙ ПАКЕТОВ К НЕЙ! Репозиторий можно разместить либо на локальном носителе роутера, либо, если есть такая возможность — на удалённом вэб-сервере. Я для этого использовал вэб-сервер, запущенный на другом роутере, тоже под управлением OpenWrt.Чтобы упростить процесс скачивания, я написал небольшой скриптик: nano openwrt-trunk-download

Сохраняем скрипт, делаем его исполняемым и переносим в подходящее место:

Если всё сделали правильно, то теперь мы можем скачать самую свежую сборку из trunk вместе с репозиторием одной командой:

Дожидаемся, пока процесс скачивания завершится и убеждаемся, что всё на своих местах:

ls -l /usr/local/openwrt-repository/snapshots/2013-10-15/ar71xx/

Теперь можем скачивать и прошивать OpenWrt уже со своего собственного хранилища:

в котором указываем путь к нашему репозиторию:

НастройкаДля возможности установки всех необходимых пакетов нам потребуется перенести корень (или /overlay) на внешний usb накопитель.Для этого устанавливаем необходимые пакеты:

Копируем систему (overlay) на флешку:

И настраиваем файлfstab. В версии Barrier Breaker используется новая утилита block, позволяющая создать файл fstab автоматически:

block detect > /etc/config/fstab

Затем открываем файл fstab:

и редактируем его в соответствии со своими потребностями:

Тут мы видим, что вместо опции device используется опция uuid для идентификации нашаго монтируемого раздела на внешнем накопителе. Чтобы узнать значение uuid нашего раздела, используем команду:

Тут /dev/sda1 — единственный раздел, который я создал на флешке. Раздел подкачки (swap) в данном случае я не использую.После перезагрузки проверяем, всё ли правильно примонтировалось:

Устранение проблемПо идее описанных выше действий должно быть достаточно для готовности системы к дальнейшему использованию. Однако, как уже говорилось выше, работоспособность ветки trunk не гарантирована и могут возникнуть некоторые проблемы.Так, например, у меня на момент написания статьи, в ревизии r38261, выявилось следующее:Во-первых, с ошибками устанавливаются модули ядра и не запускаются автоматически. Приходится вручную их запускать командой modprobe. Причём некоторые модули после этого автоматически загружаются после перезагрузки (kmod-usb-storage), а некоторые не хотят (kmod-video-uvc). Приходится прописывать их запуск в файле /etc/rc.local .А во-вторых, раздел на флешке никак не хотел монтироваться в /overlay, то есть не получалось перенести систему на флешку (extroot). Причем, если указать точку монтирования например /mnt/sda1 — то всё нормально монтировалось. Погуглив эту тему, я выяснил, что далеко не один с такой проблемой и что в некоторых ревизиях эта проблема периодически всплывает. На форуме OpenWrt было найдено решение этой проблемы: при запуске системы нужно выполнить:

Читайте также:  Intel xeon d 1531

Файл сохраняем, делаем его исполняемым:

chmod +x /etc/init.d/extroot

И активируем его выполнение при запуске системы:

После перезагрузки получаем систему с полноценным рабочим extroot.

I switched from default firmware to OpenWrt for my: TP-Link TL-WR1043N/ND v1 and have the problem that I am not able to install any new packages.

What I did:

  • Flash OpenWrt
  • Installed Luci (no problem there)

And than when I try to install anything else I get:

The important thing seems to be : * xsystem: wget: vfork: Out of memory. And yep I did try reboot and ‘update’ several times.

But under Luci -> Software I can see:

qHfa9.png

And here is my DF output:

Please does anyone have any idea what could cause the issue? I know the solution could be using an external USB but I want to aviod this at all costs + I cannot imagine that this router would have space just for luci 🙂

В этой статье я попытаюсь рассказать, как прошить на роутер OpenWrt и установить туда cjdns. По правде говоря, изучение тонкостей этого дела отняло у меня много времени и нервов. В основном потому, что многое в OpenWrt недодокументировано, и приходилось многое искать по форумам и додумывать. Думаю, это как раз тот случай, когда лучшей документацией являются исходники. Так что эту статью я попытаюсь написать такой, какую я хотел бы прочитать в самом начале этого пути.

Среду для сборки OpenWRT можно скачать в 4-х вариантах.

  • OpenWrt Image Builder — то же самое, но грузит уже откомпиленые пакеты и собирает из них образ.
  • OpenWrt SDK — то же самое, но набор програм для кросскомпиляции уже собран и собирать образы оно уже не может. Предназначено для сборки отдельных пакетов.
  • OpenWrt based Toolchain — уже откомпиленый набор програм для кросскомпиляции, выдраный из Openwrt Buildroot.

Последние три могут быть собраны из OpenWrt Buildroot.

Как уже было сказано выше, в SquashFS сжатие лучше, так что у нас есть больше шансов уместить все, что нужно, собрав прошивку самостоятельно, чем скачав готовый образ и доставив нужный пакет. Для тех, кто собирается ставить готовую минимальную прошивку, вот сборки от разработчиков. Они рассортированы по архитектурам (колонка target в списке поддерживаемого оборудования) и по типу памяти (nand и все остальные), названия файлов включают в себя название роутера. Прошивки, содержащие в названии «sysupgrade» предназначены для перепрошивки средствами уже установленной OpenWrt. Содержащие «factory» можно скормить вебформе заводской прошивки. Не перепутайте.

Приступим к сборке.

Внимание! Сборка не должна проводится от суперпользователя или в fakeroot.

Для начала загрузим buildroot. Здесь есть список веток и команд для их загрузки. Мы же будем собирать Attitude Adjustment stable:

Репозиториев с beta, beta2, rc1 и rc2, видимо, нету, а жаль, потому что пакет, собраный для stable на beta не стал, только ругнулся, что git commit id ядра не тот, который нужен (хотя верси совпадали).

Далее, следуя инструкции, добавляем в список мест, откуда будут грузится исходники «репозиторий» с cjdns.

Добавляем в файл feeds.conf строку

Далее, грузим исходники всех пакетов:

и настраиваем все, что нужно. 923bf4c461e0a9cbc467607f51b57323.png

Выбираем «Target System» (ту, которая указана в списке поддерживаемых устройств возле названия вашего роутера), Subtarget (если в роутере постоянная память не NAND, смело выбираем Generic), «Target Profile» (ищем название роутера, под который будем собирать). В «Target Images» обычно ничего менять не надо. Выбираем пробелом.

На данном этапе все нужные драйверы уже отмечены (благодаря «Target Profile»). Далее ходим по остальным веткам и выбираем нужные нам пекеты (Именно нам. По идее, и так работать будет). Поиска здесь не предусмотрено, так что искать будем так:

Благо, большинство пакетов рассортировано по разделам. Хотя они могут находится и в ./package и тогда вы их таким образом не найдете. В выводе видим ./feeds/packages/utils/nano, что значит, что nano нам нужно искать в разделе «Utilities». Для полной уверенности можно почитать makefile пакта. Для nano это ./feeds/packages/utils/nano/Makefile. В нем мы видим такой фрагмент:

Читайте также:  Android ошибка при получении данных с сервера

«CATEGORY» — название раздела, «SUBMENU» — название подраздела. Кстати, такая запись может быть не одна. Дело в том, что из одного набора исходников может собиратся несколько разных пакетов.

UPD: Хабрапользователь klirichek подсказал, что поиск здесь таки есть. Чтобы войти в него, нужно в menuconfig нажать «/».

Получаем списочек объектов, название которых включает в себя введенный запрос, с полным описанием и расположением в меню.

Итак, пакеты, которые нам могут понадобится.

  • nano — чтобы не пришлось править конфиги с помощью vi или cat/echo
  • htop — просмотрщик процесов
  • iftop — програмка для отслеживания сетевой активности (кто, с кем, на какой порт, с какой скоростью)
  • tcpdump — ну куда ж без него?
  • kmod-usb-storage — модуль ядра для подключения внешних носителей памяти по usb
  • kmod-usb-storage-extras — модуль ядра для подключения некоторых экзотических внешних носителей памяти по usb (например, кардридера)
  • block-mount — набор скриптов для автоматического монтирования по /etc/fstab. Для автомонтирования файловых систем по конфигам в формате uci (об этом позже) хватит и mount из busybox, но swap автоматически без них не монтируется.
  • swap-utils — необходим для монтирования swap
  • Всевозможные драйверы файловых систем. Найти можно в «Kernel modules»->«Filesystems»
  • shadow-groopadd, shadow-groupdel, shadow-groupmod, shadow-groups, shadow-passwd, shadow-su, shadow-useradd, shadow-userdel, shadow-usermod — набор утилит для управления пользователями и группами. Обычно можно обойтись и без них.
  • ip,iw,iptables,ip6tables — для ручной настройки сети
  • bind-dig — dns-клиент

Следует отметить, что все может и не поместится. В таком случае образ для роутера собран не будет, но пакеты соберутся. Пакет можно отметить и так, чтобы он собрался, но в образ не включался. Для этого нужно нажать клавишу m.

А теперь расскажу об одном баге, который мешает установке cjdns. В зависимостях cjdns есть пакет с чудным названием nacl. Он используется при сборке других пакетов, но при этом бинарный пакет из него не собирается. В то же время, он появляется и в зависимостях бинарного пакета cjdns. В результате, чтобы установить уже собранный пакет с cjdns, нужно перед этим установить не существующий в собранном виде пакет nacl.

Теперь, как его обойти. Открываем ./openwrt/feeds/cjdns/cjdns/Makefile в текстовом редакторе, находим этот фрагмент:

и убераем из «DEPENDS» «+nacl». Должно получится так:

Еще один нюанс. Чтобы после прошивки поднялась сеть, в прошивке должны быть конфиги настройки сети. Однако, для некоторых роутеров при сборке прошивки соответствующий конфиг не генерируется. В результате, роутер вроде-бы работает, но сеть не поднялась и мы получаем прекрасно работающий кирпич. Я, когда в первый раз собирал прошивку под свой tl-mr3220, столкнулся с этим и потом довольно долго искал нужный кабель и паял так называемый serial hack adapter, чтобы достучатся до железки. Теперь о формате конфигов. В OpenWrt используется самопальный собственный формат конфигов UCI, общий для всего. Насколько я понял, они потом преобразуются в нормальные. Он, как мне кажется, достаточно хорошо документирован, так что останавливатся на нем не буду. Скажу только, что хранятся они в папке /etc/config/. Чтобы добавить какие-то свои файлы, в том числе и конфиги, в прошивку, в папке с Buildroot нужно создать папку files и положить в нее нужные файлы. Например, тот же конфиг сети я положил в файл ./files/etc/config/network . Вот и сам конфиг для tl-mr3220 v1.2:

Его я извлек из прошивки, взятой с сайта OpenWrt и немножко подправил. Что значат поля _orig_ifname и _orig_bridge не спрашивайте, сам не знаю. Отмечу, что этот конфиг предусматривает, что роутер торчит в одну и ту же сеть всеми своими портами, а не, например, каким-то одним в интернет.

Теперь вернемся к cjdns. Чтобы пакет таки собрался, нужно его отметить в menuconfig: «Network»->»Routing and Redirection»->»cjdns».

Итак, настал торжественный момент:

После сборки файлы должны оказатся в ./bin, рассортированые по target-ам (пока он у нас один). К примеру, у меня собраные образы лежат в ./bin/ar71xx, а пакеты в ./bin/ar71xx/packages/. Теперь открываем архив ./bin/ar71xx/openwrt-ar71xx-generic-rootfs.tar.gz (или аналогичный для вашего target) и проверяем, действительно ли там есть конфиг сети.

Теперь можно прошивать. Как уже говорилось выше, openwrt-ar71xx-generic-tl-mr3220-v1-squashfs-factory.bin можно скормить вебморде заводской прошивки. Еще раз повторю уже стандартное предупреждение, встречаемое чуть ли не везде, где пишут о процесе прошивки: ни в коем случае не прошивайте по wi-fi!

Заходим по ssh, проверяем, сколько оперативной памяти свободно:

Проверяем целостность образа. На роутере считаем хеш файла образа:

и сверяем с хешем файла на компьютере.

Скрещиваем пальцы и прошиваем:

Если все прошло хорошо, роутер должен перезапустится. Заходим по ssh и с помощью passwd устанавливаем пароль root.

Существуют так же и другие способы прошивки, которые вариируются в зависимости от модели роутера. На части роутеров возможна прошивка с помощью загрузчика, есть и более хардкорные методы, предпологающие работу с паяльником.

Пакетный менеджер.

В OpenWrt в качестве пакетного менеджера используется opkg. Опции:

  • update — Загрузить список пакетов в репозитории. Загружается он в /tmp/opkg-lists/snapshots, а в /tmp примонтирована tmpfs. Так что, после прерзагрузки для каких-либо действий с пакетами прийдется опять грузить список пакетов.
  • upgrade — Начнем с того, что эта опция вам, скорей всего, не понадобится. Пакеты в репозиториях разработчиков меняются только в trunc. Если прописать другой репозиторий от другой версии, возможны казусы. Крайне не рекомендуется обновлять таким образом модули ядра (названия их пакетов начинаются на kmod-). Действия «обновить все под ряд» opkg не умеет вообще.
  • install принимает название пакета, имя файла или url для скачивания:
  • configure — Не совсем понятно, что делает. По видимому, еще раз выполняет конфигурационные скрипты пакета.
  • remove — Удалить пакет.
  • list — список пакетов.
  • list-installed — список установленніх пакетов.

Читайте также:  Cms для доски объявлений

Чтобы добавить репозиторий, находящийся в папке, нужно дописать

Отмечу, что подписывание пакетов, как в apt-get, не предусмотрено, как и забирание их по https. Насчет https, конечно, можно извернутся, но все упирается в неправильно подписаный сертификат на downloads.openwrt.org. Хотя, он не самоподписный, а значит, что, извернувшись вдвойне, может что-то получится.

Монтируем дополнителную память с флешки (если нужно).

Если не получилось, опять же, ставим нужные пакеты. Далее

Чтобы изменения вступили в силу, делаем

Монтируем swap.

Для этого нужно, чтобы в конфиге было нечто вроде этого:

Здесь все аналогично. По поводу выбора размера swap. Для linux на десктопах часто советуют делать swap немного больше, чем размер оперативной памяти, чтобы при переходе в «спящий режим» (или как там оно называется?) все, что есть в оперативной памяти, поместилось в swap. Согласитесь, для роутера «спящий режим» — это бред. Так что для них действует другое правило — выделяйте побольше. 512 MiB, думаю, хватит всегда и всем! Просмотреть обьем оперативной памяти и swap можно с помощью команды free. И не забываем про uci commit.

Cтавим cjdns (если он не поместился в squashfs).

Копируем пакет с помощью scp в /tmp на роутере и устанавливаем с помощью opkg. Далее создаем конфиг cjdns. На некоторых роутерах это может длится долго. Далее добавляем в конфиг ноды, раскомментирываем раздел ETHInterface и прописываем интерфейс br-lan вместо eth0.

Настраиваем wi-fi в режиме ad-hoc.

Открываем /etc/config/wireless и добамляем секцию вроде этой:

Опция «device» должна содержать название «устройства», обозначеного в секции «wifi-device». У меня она выглядит так:

Тут есть один нюанс. Не все роутеры умеют поднимать несколько беспроводных сетей с одного физического устройства. Так что если после uci commit wireless ; /etc/init.d/wireless restart одна из сетей не поднялась, то прийдется обойтись одной. Чтобы отключить одну из сетей, достаточно установить опцию disabled в 1. Теперь проверяем, не попала ли новосозданная сеть в bridge с нашей локальной сетью. Сначала определяем, какому интерфейсу какая сеть соответствует:

Если наш ad-hoc таки слинковался с локальной сетью, идем править /etc/config/network. Ищем секцию interface с опцией «type» установленой в «bridge» вроде этой:

Для этого случая нужно убрать из «_orig_ifname» «radio0.network1», а из «ifname» — «wlan0»

Теперь прописываем нужный интерфейс в конфиге cjdns. Секция ETHInterface, кстати, может выглядеть и так:

На десктопе такое работает, но на роутере, почему-то, с таким конфигом cjdroute падает. Так что, если у вас тоже это не работает, то прописываем что-то одно.

Создаем скрипт автозапуска.

Скрипты запуска должны лежать в папке /etc/init.d/ . Создаем файл /etc/init.d/cjdns :

Подробнее о стартовых скриптах в OpenWrt можно почитать здесь: wiki.openwrt.org/doc/techref/initscripts

Фух, вроде, все. Удачной прошивки, и да не прийдется вам после нее работать паяльником!

UPD: Разработчики cjdns в последнем коммите в сборочные скрипты потерли все файлы и в README.md оставили сообщение, что отныне надо пользоваться сборочными скриптами от сиэтловцев.

UPD2: Сиэтлский вариант пакета у меня не заработал.

  1. Они решили сделать конфиг в формате uci. Это, конечно, хорошо, но ихний конвертер конфигов json-uci, написанный на LUA, не находит всех нужных библиотек, при том, что они-то как раз имелись, но немного в другом месте. Их копирование и создание линков не помогло — теперь ругается на ошибки в библиотеках.
  2. Запустить cjdroute вручную тоже не удалось. Как потом оказалось, он собирался из ветки crashey.
  3. В ихнем init-скрипте вовсю используются фичи, которые пока есть только в trunc.
  4. Все это вместе занимает много памяти. Впрочем, уменьшение занимаемого объема памяти есть в их todo.

А дальше все так же, как было описано выше.

OpenWrt
Экран входа в OpenWrt 18.06.1
Разработчик OpenWrt Project
Семейство ОС Unix-подобный
Рабочее состояние Текущий
Исходная модель Открытый источник
Первый выпуск Январь 2004 г .  ( 2004-01 )
Последний релиз 19.07.7 / 18 февраля 2021  ( 2021-02-18 )
Репозиторий 10px-OOjs_UI_icon_edit-ltr-progressive.svg.png
Доступно в 26 языков
Метод обновления opkg
Менеджер пакетов opkg
Платформы 23 платформы, использующие следующие наборы инструкций : AVR32 , ARM , CRIS , m68k , MIPS , PowerPC , SPARC , SuperH , Ubicom 32, x86 , x86-64
Тип

ядра

Монолитный ( Linux )
Userland BusyBox , GNU

Пользовательский интерфейс по умолчанию

CLI , веб-интерфейсы
Лицензия Бесплатное программное обеспечение ( GPL и другие лицензии)
Официальный веб-сайт lede-project .org </wbr>

Linux Embedded Development Environment ( Lede проект) был вилка проекта OpenWRT и разделяет многие из тех же целей. Он был создан в мае 2016 года группой основных участников OpenWrt из-за разногласий по внутренним процессам OpenWrt. Номинально раскол был урегулирован год спустя, в мае 2017 года, в ожидании одобрения разработчиков LEDE. Повторное объединение сохраняет брендинг OpenWrt, но использует многие процессы и правила LEDE. Голосование за предложение о повторном объединении было проведено разработчиками LEDE в июне 2017 года и официально объявлено в январе 2018 года. Процесс объединения был завершен до выпуска OpenWRT 18.06.

Версия Дата выпуска Номер ревизии Заметки
17.01.0 22 февраля 2017 г. r3205 Первый стабильный выпуск
17.01.1 19 Апрель 2017 г. r3316 Ядро 4.4.61, исправления ошибок и улучшения
17.01.2 12 июн 2017 секретные разделы r3435 Ядро 4.4.71, исправления безопасности
17.01.3 3 октября 2017 г. r3534 Ядро 4.4.89, исправления безопасности
17.01.4 18 октября 2017 г. r3560 Ядро 4.4.92, исправления безопасности ( KRACK , насколько это возможно исправлениями на стороне сервера)
17.01.5 18 июля 2018 г. r3919 Ядро 4.4.140, исправления безопасности
17.01.6 3 сентября 2018 г. r3979 Ядро 4.4.153, исправления безопасности

Функции

OpenWrt имеет корневую файловую систему с возможностью записи, что позволяет пользователям изменять любой файл и легко устанавливать дополнительное программное обеспечение. Это отличается от других прошивок, основанных на файловых системах только для чтения, которые не позволяют изменять установленное программное обеспечение без перекомпоновки и прошивки полного образа прошивки. Это достигается путем наложения файловой системы SquashFS, сжатой только для чтения, на файловую систему JFFS2 с возможностью записи с помощью overlayfs . Дополнительное программное обеспечение можно установить с помощью диспетчера пакетов

opkg

, а репозиторий пакетов содержит около 6000 пакетов.

220px-Openwrt-luci-firewall.png

OpenWrt можно настроить через интерфейс командной строки или веб-интерфейс под названием LuCI. OpenWrt предоставляет набор скриптов, называемых UCI (унифицированный интерфейс конфигурации), для унификации и упрощения настройки через интерфейс командной строки. Также доступны дополнительные веб-интерфейсы, такие как Gargoyle .

OpenWrt предоставляет регулярные исправления ошибок и обновления безопасности даже для устройств, которые больше не поддерживаются их производителями.

OpenWrt предоставляет исчерпывающие возможности для настройки общих сетевых функций, таких как IPv4 , IPv6 , DNS , DHCP , маршрутизация , брандмауэр , NAT , переадресация портов и WPA .

Другие функции включают:

  • Расширяемая конфигурация всех драйверов оборудования, например встроенных сетевых коммутаторов и их возможностей VLAN , WNIC , модемов DSL , FX , доступных аппаратных кнопок и т. Д.
  • Ячеистая сеть через BATMAN , OLSR и IEEE 802.11s — возможности драйверов WNIC и других специальных протоколов ячеистой маршрутизации, реализованных в Linux.
  • Беспроводная функциональность, например, заставить устройство работать как беспроводной ретранслятор , точка беспроводного доступа , беспроводной мост ,

    перехватывающий

    портал или их комбинация, например, с ChilliSpot , WiFiDog Captive Portal и т. Д.

  • Безопасность беспроводной сети: внедрение пакетов , например, Airpwn , lorcon , ea.
  • Динамически настраиваемые протоколы переадресации портов UPnP и NAT-PMP через upnpd и т. Д.
  • Стук порта
  • Клиент

    TR-069

    (CWMP)

  • IPS через Snort
  • Активное управление очередью (AQM) через сетевой планировщик ядра Linux с множеством доступных дисциплин организации очередей . CoDel был

    перенесен

    на ядро ​​3.3. Это инкапсулирует формирование трафика, чтобы обеспечить справедливое распределение полосы пропускания между несколькими пользователями и качество обслуживания (QoS) для одновременного использования таких приложений, как VoIP , онлайн-игры и потоковая передача мультимедиа, без негативного воздействия насыщения каналов.

  • Балансировка нагрузки для использования с несколькими интернет-провайдерами с использованием

    маршрутизации,

    зависящей от

    источника

  • IP-туннелирование ( GRE , OpenVPN, псевдопровод и т. Д.)
  • Расширяемый мониторинг сети и статистика в реальном времени с помощью, например, RRDtool , Collectd , Nagios , Munin lite , Zabbix и т. Д.
  • Службы

    динамического DNS

    для поддержки фиксированного доменного имени с провайдером , который не предоставляет статический IP-адрес.

  • OpenWrt поддерживает любое оборудование с поддержкой Linux; устройства, которые могут быть подключены (например, через USB ), включают

    Рекомендации

    Внешние ссылки

    30px-Commons-logo.svg.png Викискладе есть медиафайлы по теме OpenWrt .
    • Загрузки OpenWrt
    • Списки рассылки OpenWrt
    • Проект LuCI
    • Саммит OpenWrt
    • prpl Foundation (некоммерческий фонд, основанный Imagination Technologies для поддержки платформы MIPS)
    • Центр кода GPL в Linksys

Электроника для начинающих*, DIY или Сделай Самc26eb72da051dc970a3d9bba79262374.jpgВ комментариях к статье об опыте изготовления «интернет розетки» мое внимание привлекли два комментария. Один, в котором утверждалось, что такая штука, по сути, бесполезна, показался мне несправедливым — хорошо помню, как мне однажды понадобилось, например, дистанционно «ресетить» одну хитрую штучку и думаю, что я не одинок. А вот идея о том, что можно решить подобный вопрос проще и дешевле, использовав, например, TP-LINK TL-MR3020 + OpenWRT показалась мне дельной. Я решил к тому же обойтись без разборки устройства, программирования и микроконтроллеров — короче, сделать решение как можно доступнее. И у меня это почти получилось!В качестве устройства вывода используем обычную клавиатуру USB. Встречая в супермаркетах клавиатуры отвратительного качества по смешным ценам, я всегда удивлялся — для чего же она может понадобиться? Да вот же для чего! В клавиатуре три светодиода, которыми можно программно управлять с любого устройства, эту клавиатуру поддерживающего. Заменив светодиоды цепью управления — получаем управление тремя нагрузками. В качестве бонуса – возможность дальнейшей доводки устройства для использования как устройства ввода. Конечно, можно не стрелять из пушки по воробьям, собрать (или приобрести) простейшее устройство на микроконтроллере, у которого будут неосопоримые преимущества (большее количество входов/выходов, нормальные логические уровни и т.п.). Но у «клавиатурного» подхода тоже есть плюсы — он доступен людям, незнакомым с МК, не имеющим программатора. Можно просто взять и сделать работающее устройство сегодня, сейчас. Кроме этого, среди плюсов:

  • решение легко переносимо на другие платформы: я не проверял, но в теории это можно воткнуть в любой «ASUS» или «D-Link», мирно раздающий инет из своего угла (если у него есть USB) — и будет работать;
  • роутер при этом можно использовать по прямому назначению;
  • не требуется разборки роутера и вмешательства в его схему (а TL-MR3020, кстати, нелегко разобрать);
  • не тебуется программирования (если не считать программой небольшой шелл-скрипт) и компиляции;
  • все компоненты можно приобрести в компьютерном магазине (это если просто «помигать светодиодом», для реального управления придется купить пару доступных радиокомпонентов), при этом общие затраты составят менее 1500 рублей.
Ставим OpenWRT и настраиваем сетевой интерфейс

Для этого шага понадобится, собственно, роутер. Мой мне обошелся в 850р.Страница модели на openwrt.org дает исчерпывающие инструкции по перепрошивке и разрешает нам пользоваться снэпшотом транка. Сам же робко предложу взять бету Attitude Adjustment 12.09. Тем более, что на момент публикации снэпшоты недоступны на сайте openwrt, а A.A.12.09 наконец-то выложили.Установка состоит из нескольких элементарных операций:Для установки дополнительных пакетов нужен доступ к репозиторию через интернет, что требует его конфигурации как клиента локальной сети.Например:

Подключение клавиатуры и проверка управления светодиодами

Сайт H-WRT информирует нас, что для установки клавиатуры нужен лишь модуль kmod-usb-hid.Установим его:

opkg update opkg install kmod-usb-hid 

Самое время подключить клавиатуру и посмотреть, опозналась ли она:

root@OpenWrt:~# dmesg | tail [   66.380000] hub 1-0:1.0: connect-debounce failed, port 1 disabled [   68.780000] hub 1-0:1.0: connect-debounce failed, port 1 disabled [   71.180000] hub 1-0:1.0: connect-debounce failed, port 1 disabled root@OpenWrt:~#  

Облом! это совсем не то, что я ожидал. В чем же дело?Схожий багрепорт быстро находится — разработчики объясняют такое поведение аппаратными ограничениями примененного чипсета. Похоже, находящийся «на борту» USB-хаб не жалует low-speed устройства. Хотя на этом моменте дух Дзен бесследно испарился — не будем опускать руки и попробуем решить проблему подключением клавиатуры через внешний USB-хаб:

root@OpenWrt:~# dmesg | tail [  143.120000] usb 1-1: new high-speed USB device number 2 using ehci-platform [  143.270000] hub 1-1:1.0: USB hub found [  143.270000] hub 1-1:1.0: 4 ports detected [  143.580000] usb 1-1.2: new low-speed USB device number 3 using ehci-platform [  143.730000] input: Generic USB Keyboard as /devices/platform/ehci-platform/usb1/1-1/1-1.2/1-1.2:1.0/input/input0 [  143.730000] generic-usb 0003:040B:2000.0001: input: USB HID v1.10 Keyboard [Generic USB Keyboard] on usb-ehci-platform-1.2/input0 [  143.770000] input: Generic USB Keyboard as /devices/platform/ehci-platform/usb1/1-1/1-1.2/1-1.2:1.1/input/input1 [  143.780000] generic-usb 0003:040B:2000.0002: input: USB HID v1.10 Mouse [Generic USB Keyboard] on usb-ehci-platform-1.2/input1 root@OpenWrt 

Гораздо лучше. Пускай из-за этого пришлось написать «почти получилось» в начале статьи и «способ сервировки» на фото, но так наша «Generic USB Keyboard» опозналась. На клавиатуру всегда создается два «устройства», но даже и не спрашивайте, почему эта конкретная клавиатура назвалась еще и мышью… Так или иначе — мы готовы к «аппаратному хеллоуворлду» — включить светодиод.

cat /dev/input/event0 > /dev/null & printf "x00x00x00x00x00x00x00x00x00x11x00x01x00x00x00x01" > /dev/input/event0 

Здесь должен торжественно зажечься светодиод «Caps Lock». Те, кого просто радует этот факт — могут переходить к следующему шагу. Те, кто не может двинуться дальше, не узнав, что за бредовое заклинание приведено выше — заглядывают всумбурные пояснения:

Скрипт

Чтобы автоматизировать управление светодиодами нам нужен скрипт. Для того, чтобы на следующем шаге мигать ими по HTTP — сразу положим его в папку /www/cgi-bin:

cd /www mkdir cgi-bin cd cgi-bin wget http://etherelay.googlecode.com/files/ctlrelay chmod +x ctlrelay 

Вот его текст и описание:Теперь управлять светодиодами легко. Чтобы включить, скажем, светодиод «Scroll Lock», пишем:

./ctlrelay scroll_on 

Выключаем:

./ctlrelay scroll_off 

Можно еще «мигнуть» (scroll_pulse). Как говорит уже многими здесь уважаемый Anant Agarwal: «I could do this all day. This is so much fun!». Но все же, перейдем к следующему этапу и создадим…

Веб-интерфейс

Какой же веб-интерфейс без веб-сервера? Проверим его наличие:

opkg status uhttpd 

Если в выводе есть строка Status: install user installed (а это будет так, если вы используете Attitude Adjustment 12.09 beta) то сервер уже установлен. Иначе установим его и настроим его запуск:

opkg update opkg install uhttpd /etc/init.d/uhttpd enable /etc/init.d/uhttpd start 

Дальше нам нужна веб-страница:Маленький нюанс — браузер, конечно, не имеет доступа к папке /var на сервере, поэтому предоставим ему возможность прочитать файл ledstate оттуда, куда он «дотягивается», с помощью симлинка:

ln -s /var/ledstate /www/ledstate 

Ссылку на скачивание этой странички, немного измененной, можно найти почти в самом в конце статьи. Теперь можно мигать светодиодами клавиатуры, тыкая в чекбоксы. Но, даже не учитывая того, что мигающим светодиодом сейчас никого не удивить, придется согласиться с тем, что это абсолютно бесполезно с практической точки зрения. Поэтому примемся за железо!

Схема

Уже можно разобрать клавиатуру и вытащить из нее плату:81dbc6d319c3cb6f4fc4dc48ef2ebe08.jpgСхему включения светодиодов клавиатуры представим следующей (весьма упрощенной) моделью (для включенного состояния):35f9d8ca8875644665e487f33a9f5b5f.pngСхема 1. Включение светодиода клавиатурыТри проверенных «клавы» из «помоечного» сегмента имели именно такое включение светодиодов, отличаются только их токи — обычно около 18мА, но бывает и 3мА. Надо иметь ввиду, что возможны и другие схемы.Самое простое — если необходимо коммутировать небольшое напряжение и ток (дистанционный «Reset» какого — либо устройства или эмуляция других кнопок/логических сигналов). Можно обойтись обычной оптопарой:1dad28a2308b864e5ec110a3d9870f5d.pngСхема 2. Формирование логического сигналаДля управления устройством с питанием от сети берем твердотельное реле:eedc3bd189f703a69655c7ce946d2d69.pngСхема 3. Управление твердотельным релеЯ использовал отечественнное реле К293КП13П из-за цены в 170 рублей. Максимальный ток в нагрузке, на которое оно рассчитано — 1А. Ток через управляющий светодиод не должен быть ниже минимального (в документации он обозначается IFmin) для используемого типа реле. Если плата клавиатуры дает меньший ток (отпаяйте один вывод светодиода и измерьте ток в разрыве) — поможет дополнительный транзисторный ключ:4d197b4a7bb0885d2242cedcaac884e8.pngСхема 4. Подключение твердотельного реле через ключОн же спасет, если используется твердотельное реле, управляемое напряжением или «классическое» электромеханическое реле:f9e8503c633e5460f2cf2b9920a8dc91.pngСхема 5. Управление электромеханическим релеТвердотельное реле — штука достаточно дорогая, и чем мощнее — тем дороже. Обычное реле дает больше «ампер на рубль», но имеет свои минусы. Среди них — большой потребляемый ток во включенном состоянии. Если одновременно включить три реле такой же модели, как на схеме — потребляемый от USB ток будет составлять почти 300 мА. Если не хотите так сильно «доить» порт — подключайте эмиттер не к нему (пунктирная линия на схеме), а к независимому источнику.Схемы 4 и 5, само собой, работают только на клавиатурах где СД включены именно по схеме с «общим анодом» (проверьте сопротивление между анодами диодов и «плюсом» платы — должно быть 0 Ом). Если неохота с этим заморачиваться — можно использовать вместо ключа маломощное оптореле. Включается вместо штатного светодиода и работает при токе на светодиод от 5 до 25 мА, то есть подойдет для всех вариантов клавиатур с вероятностью 99%. Если вам надо коммутировать напряжение до 60 в и ток до 300 мА — можно убрать реле и пользоваться оптореле напрямую.4057791b3c5b85d8d8f24b814b39a3da.pngСхема 6. Управление электромеханическим реле при помощи опторелеВ схеме и ее реализации много упрощений: Что всегда стоит принимать в расчет — это элементарая электробезопасность. Даже тестовое устройство — особеннотестовое устройство, которое наверняка будет болтаться где-нибудь на проводках или будет забыто включенным среди прочего хлама на столе — надо защитить от случайного касания токоведущих частей, если оно предусматривает подключение к сети. Иначе по вам может потечь абсолютно реальный электрический ток.Я собрал варианты 3 и 6 на макетке, получилось так:f0460d1704785e6d66cac63197d0da2f.jpgНесмотря на то, что это не более чем «proof of concept», мне захотелось хоть немного «навести красоту», пускай и в собственной извращенной трактовке. Такие уж нынче времена: внешний вид ценится не меньше, а порой и беспричинно больше функциональной нагрузки. Что и приводит нас к следующему этапу.

Косметика и демонстрация

От HTML — интерфейса за километр несет ботанщиной, байковыми рубашками с катышками и макаронами из стеклянной банки:a99150204883da808dde867f9f883879.pngПопытаемся это хоть как-то скрасить.

  1. Так как художественные способности у меня на нуле, а вкус где то рядом с ними — идею я стырил отсюда я почерпнул вдохновение (и немного css) здесь: http://www.seanslinsky.com/demo/ios-toggle-switches/.
  2. С помощью генератора градиентов mudcu.be/bg сделал нескучные обои задник.
  3. Генератор «клевых тумблерков» proto.io/freebies/onoff/ создает кнопки, которые работают почти во всех браузерах — даже в Опере, если сделать их квадратными, и даже в IE, если он >=9.
  4. Так как на разных системах по разному работает увеличение — делаем кнопки масштаба внутри страницыdavidwalsh.name/change-text-size-onclick-with-javascript

CSS не имеет смысла приводить, потому что на 90% сгенерирован автоматически, а HTML — на 90% повтор вышеприведенного. Поэтому просто пишу как из скачать:

cd /www mkdir luci mv index.html luci wget http://etherelay.googlecode.com/files/index.html wget http://etherelay.googlecode.com/files/style.css 

Вторая и третья строчка «перепрятывают» файл веб-интерфейса роутера (если он установлен) в отдельную папку, теперь он доступен по адресу _адрес_роутера_/luci. А «главной» страничкой, доступной по адресу сервера, становится наша.Ну и, напоследок — говорят, что картинка стоит тысячи слов. В этом видео почти тысяча картинок. Надеюсь, оно хоть как-то уравновесит мою многословность.Update:  подсказал, как добавить авторизацию на веб-сервер (например, с логином wizard и паролем lumos ):

uci set uhttpd.main.config=/etc/httpd.conf uci commit uhttpd echo "/:wizard:lumos" > $(uci get uhttpd.main.config) /etc/init.d/uhttpd restart 

Взято: http://habrahabr.ru/post/151982/Используемые источники:

  • https://web-shpargalka.ru/http-downloads-openwrt-org-snapshots-trunk.php
  • https://ru.xcv.wiki/wiki/openwrt
  • http://blog.ritm18.ru/2013/08/http-c-openwrt.html

Рейтинг автора
5
Подборку подготовил
Андрей Ульянов
Наш эксперт
Написано статей
168
Ссылка на основную публикацию
Похожие публикации