Записки обо всём.
Установка 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:
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 строку
Далее, грузим исходники всех пакетов:
и настраиваем все, что нужно.
Выбираем «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: Сиэтлский вариант пакета у меня не заработал.
- Они решили сделать конфиг в формате uci. Это, конечно, хорошо, но ихний конвертер конфигов json-uci, написанный на LUA, не находит всех нужных библиотек, при том, что они-то как раз имелись, но немного в другом месте. Их копирование и создание линков не помогло — теперь ругается на ошибки в библиотеках.
- Запустить cjdroute вручную тоже не удалось. Как потом оказалось, он собирался из ветки crashey.
- В ихнем init-скрипте вовсю используются фичи, которые пока есть только в trunc.
- Все это вместе занимает много памяти. Впрочем, уменьшение занимаемого объема памяти есть в их todo.
А дальше все так же, как было описано выше.
Экран входа в OpenWrt 18.06.1 | |
Разработчик | OpenWrt Project |
---|---|
Семейство ОС | Unix-подобный |
Рабочее состояние | Текущий |
Исходная модель | Открытый источник |
Первый выпуск | Январь 2004 г . ( 2004-01 ) |
Последний релиз | 19.07.7 / 18 февраля 2021 ( 2021-02-18 ) |
Репозиторий | |
Доступно в | 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 пакетов.
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 ), включают
Рекомендации
Внешние ссылки
Викискладе есть медиафайлы по теме OpenWrt . - Загрузки OpenWrt
- Списки рассылки OpenWrt
- Проект LuCI
- Саммит OpenWrt
- prpl Foundation (некоммерческий фонд, основанный Imagination Technologies для поддержки платформы MIPS)
- Центр кода GPL в Linksys
Электроника для начинающих*, DIY или Сделай СамВ комментариях к статье об опыте изготовления «интернет розетки» мое внимание привлекли два комментария. Один, в котором утверждалось, что такая штука, по сути, бесполезна, показался мне несправедливым — хорошо помню, как мне однажды понадобилось, например, дистанционно «ресетить» одну хитрую штучку и думаю, что я не одинок. А вот идея о том, что можно решить подобный вопрос проще и дешевле, использовав, например, 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
Ссылку на скачивание этой странички, немного измененной, можно найти почти в самом в конце статьи. Теперь можно мигать светодиодами клавиатуры, тыкая в чекбоксы. Но, даже не учитывая того, что мигающим светодиодом сейчас никого не удивить, придется согласиться с тем, что это абсолютно бесполезно с практической точки зрения. Поэтому примемся за железо!
Схема
Уже можно разобрать клавиатуру и вытащить из нее плату:Схему включения светодиодов клавиатуры представим следующей (весьма упрощенной) моделью (для включенного состояния):Схема 1. Включение светодиода клавиатурыТри проверенных «клавы» из «помоечного» сегмента имели именно такое включение светодиодов, отличаются только их токи — обычно около 18мА, но бывает и 3мА. Надо иметь ввиду, что возможны и другие схемы.Самое простое — если необходимо коммутировать небольшое напряжение и ток (дистанционный «Reset» какого — либо устройства или эмуляция других кнопок/логических сигналов). Можно обойтись обычной оптопарой:Схема 2. Формирование логического сигналаДля управления устройством с питанием от сети берем твердотельное реле:Схема 3. Управление твердотельным релеЯ использовал отечественнное реле К293КП13П из-за цены в 170 рублей. Максимальный ток в нагрузке, на которое оно рассчитано — 1А. Ток через управляющий светодиод не должен быть ниже минимального (в документации он обозначается IFmin) для используемого типа реле. Если плата клавиатуры дает меньший ток (отпаяйте один вывод светодиода и измерьте ток в разрыве) — поможет дополнительный транзисторный ключ:Схема 4. Подключение твердотельного реле через ключОн же спасет, если используется твердотельное реле, управляемое напряжением или «классическое» электромеханическое реле:Схема 5. Управление электромеханическим релеТвердотельное реле — штука достаточно дорогая, и чем мощнее — тем дороже. Обычное реле дает больше «ампер на рубль», но имеет свои минусы. Среди них — большой потребляемый ток во включенном состоянии. Если одновременно включить три реле такой же модели, как на схеме — потребляемый от USB ток будет составлять почти 300 мА. Если не хотите так сильно «доить» порт — подключайте эмиттер не к нему (пунктирная линия на схеме), а к независимому источнику.Схемы 4 и 5, само собой, работают только на клавиатурах где СД включены именно по схеме с «общим анодом» (проверьте сопротивление между анодами диодов и «плюсом» платы — должно быть 0 Ом). Если неохота с этим заморачиваться — можно использовать вместо ключа маломощное оптореле. Включается вместо штатного светодиода и работает при токе на светодиод от 5 до 25 мА, то есть подойдет для всех вариантов клавиатур с вероятностью 99%. Если вам надо коммутировать напряжение до 60 в и ток до 300 мА — можно убрать реле и пользоваться оптореле напрямую.Схема 6. Управление электромеханическим реле при помощи опторелеВ схеме и ее реализации много упрощений: Что всегда стоит принимать в расчет — это элементарая электробезопасность. Даже тестовое устройство — особеннотестовое устройство, которое наверняка будет болтаться где-нибудь на проводках или будет забыто включенным среди прочего хлама на столе — надо защитить от случайного касания токоведущих частей, если оно предусматривает подключение к сети. Иначе по вам может потечь абсолютно реальный электрический ток.Я собрал варианты 3 и 6 на макетке, получилось так:Несмотря на то, что это не более чем «proof of concept», мне захотелось хоть немного «навести красоту», пускай и в собственной извращенной трактовке. Такие уж нынче времена: внешний вид ценится не меньше, а порой и беспричинно больше функциональной нагрузки. Что и приводит нас к следующему этапу.
Косметика и демонстрация
От HTML — интерфейса за километр несет ботанщиной, байковыми рубашками с катышками и макаронами из стеклянной банки:Попытаемся это хоть как-то скрасить.
- Так как художественные способности у меня на нуле, а вкус где то рядом с ними —
идею я стырил отсюдая почерпнул вдохновение (и немного css) здесь: http://www.seanslinsky.com/demo/ios-toggle-switches/. - С помощью генератора градиентов mudcu.be/bg сделал
нескучные обоизадник. - Генератор «клевых тумблерков» proto.io/freebies/onoff/ создает кнопки, которые работают почти во всех браузерах — даже в Опере, если сделать их квадратными, и даже в IE, если он >=9.
- Так как на разных системах по разному работает увеличение — делаем кнопки масштаба внутри страницы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