Июль 17

Arduino. Отвисатор роутеров с 3g/4g usb-модемом.

Универсальное устройство для тех, кто использует популярное для дач, сельских домов и маленьких офисов решение: раздавать мобильный интернет от usb-модема с симкой через бытовой wi-fi-роутер. Парк таких роутеров сейчас обширен, мобильный интернет достаточно доступен, вот и трудятся по дачам Асусы, Зикселы и прочие тп-линки с воткнутыми в них Хуавеями и ЗТЕ.
Одна проблема — всё это периодически подвисает.

оно бы и не беда: казалось бы, ну что тут такого, — зависло, — современная прошивка любого роутера имеет различные ватчдоги. И в dd-wrt, и в open-wrt, да и в стоковых прошивках есть различные keep-alive инструменты: ребут по отсутствию пингов до указанного ресурса, ребут по расписанию, разрыв сессии модема и т.д.Но на практике всё оказывается гораздо неприятнее. Зависают, чаще всего, именно сами usb-модемы. А программная перезагрузка роутера никак не спасает ситуацию: напряжение с usb-порта роутера при таком ребуте не снимается. Т.е. роутер честно обнаруживает зависание, честно перезагружается, но сам модем так и остаётся зависшим. Помогает только физическое обесточивание системы «роутер-модем».Столкнувшись со всем вышеописанным, решил сделать универсальный отвисатор бытовых роутеров, который поможет в подобных ситуациях. Нисколько не претендую на оригинальность идеи. Более того, я даже уверен, что такое уже есть. Наверняка такое реализовывалось многими людьми и многими способами. Но, потратив полдня, вот так «слёту» найти готовое решение я не сумел. Понял, что самому сделать проще и сподручнее.
Обозреваемый девайс включается в разрыв линии питания роутера, между низковольтным штекером блока питания и гнездом питания самого роутера. Также отвисатору потребуется от роутера один lan-порт. Смысл прост. Девайс раз в несколько минут пингует последовательно несколько заведомо живых ресурсов (в моём случае это публичные DNS-серверы Яндекса и Гугля). И, если с нескольких попыток не допингуется ни до одного, он разрывает линию питания роутера на несколько секунд, физически перезагружая всю систему.
К конструкции. Главным узлом является сетевой модуль. У меня в тумбочке нашёлся модуль на W5500 от RobotDyn, поэтому он и вынесен в заголовок. Но модули на этом чипе делают все, кому не лень (и, уж конечно, дешевле, чем $5). Так что воспользовавшись поиском по Aliexpress, каждый найдёт лот, подходящий именно ему. Справедливости ради, отмечу, что вся продукция RobotDyn, которую я держал в руках, оставляла самые приятные впечатления — качественный монтаж, отличное качество изготовления плат, продуманность конструкции. Я не рекламирую, — думаю, многие подтвердят мои слова.
Мозгом отвисатора выступает ардуина, — работа как раз для неё. У меня нашлась Pro Mini. Но подойдёт любая, хоть Nano, хоть Uno. Я люблю ProMini за то, что их не жалко оставлять в готовых конструкциях, это самая бюджетная модель из линейки ардуино. Покупаю их сразу пригоршню и всегда имею запас «в тумбочке». Новичкам же, наверное, больше подойдёт упомянутые выше Nano или Uno, потому что они сразу, без переходников и сложностей, умеют подключаться к USB «большого брата».
Ещё конструкция должна содержать ключевой элемент, чтобы разрывать питание роутера. Я, каюсь, применилмодуль реле, но это исключительно от лени. n-канальный MOSFET был бы и дешевле, и надёжнее. Можно и твердотельное реле (хоть то же Омроновское), но это уже если шиковать.
Для того, чтобы схема успешно работала в широком диапазоне питающих напряжений (наш отвисатор универсален), используется миниатюрный dc-dc преобразователь, настроенный на выходные 5 вольт.
Вот всё, что потребуется для постройки девайса:

Немного о сетевом модуле, как о центральном в этой конструкции.
Человеку, который впервые выбирает сетевой модуль для своей ардуино-самоделки, приходится делать нелёгкий выбор. Даже если за скобками оставить Wi-Fi, и предположить, что требуется именно коммуникация витой парой, то спектр таких модулей весьма широк. С одной стороны, это семейство шилдов на различных вариациях ENC28J60 и CP2200. Главное, что в них подкупает новичка — это стоимость таких модулей. Они действительно довольно дёшевы. А вот дальше начинаются трудности. Ведь это, в прямом смысле, контролеры Ethernet, которые работают на довольно низком уровне ОСИ. Они работают с Ethernet-фреймами, и не более того. Это значит, что весь стек TCP/IP и всё, что выше, придётся делать ручками и программно. А для новичка, даже при наличии готовых библиотек, это, зачастую, является довольно сложной задачей.
А далее, всем известный визнетовский чип W5100. Готовых модулей на клонах этого чипа — превеликое множество. W5100 — это уже настоящий TCP/IP сопроцессор. Т.е. от низкоуровневой рутины пользователь становится освобождён. Чип стал очень популярен. Но он не лишён кучи недостатков. Главные: работа на скорости 10 Mbit/s, жуткий нагрев, ряд глюков (документированных). Но, W5100 — до сих пор стандарт для официальной ардуины, и все версии библиотеки Ethernet поддерживают именно его.
Последующая эволюция — это появление чипа W5200 (это уже 10/100 Mbit/s, это более стабильная работа). И, наконец, дальнейшее развитие — чип W5500 (от 5200 он отличается меньшим энергопотреблением, (из-за улучшения технологического процесса, 0.13µm против 0.18µm), меньшим допустимым порогом питающего напряжения (1,2V-3.3V против 1,8V-3.3V), изменением формата SPI-фрейма, способностью программно уходить в сон, умением WOL от UDP-пакета и рядом других улучшений).
Многие ардуинщики недолюбливают W5500. Главным образом потому, что официальной поддержки этого чипа стандартной библиотекой Ethernet всё ещё до сих порт нет. А почти четыре года прошло. По ардуиноориентированным форумам полно сообщений, типа «купил модуль на W5500, открыл стандартный пример, ничего не заработало, модуль плохой, буду возвращать». Да, всё это печально, но официальным релизерам библиотек должно икаться по многим поводам, не только по этому. Увы.
Путей решения проблемы несколько.
Во-первых, можно использовать стороннюю библиотеку Ethernet2. Способ хорош, если в вашем проекте не будет использоваться других библиотек, ссылающихся на оригинальную Ethernet. В одном проекте совместить обе библиотеки не получится.
Во-вторых, написать всё самому. Если задачи просты, то вполне возможно.
В-третьих, можно модифицировать стандартную библиотеку Ethernet, чтобы она научилась работать с чипом W5500. Минус в том, что при смене IDE на новую версию, библиотеку придётся модифицировать заново. Или носить модифицированную библиотеку вместе со своим проектом.
Я пошёл по третьему пути. Всё подробно вот тут. Ничего сложного, надо просто по шагам сделать то, что там расписано. Скачиваем архив, заменяем им стандартную библиотеку, раскомментируем ту строку, которая соответствует нашему чипу, наслаждаемся.

Для тех, кто решит повторить описанную тут конструкцию, я приготовил архив с исходником и всеми необходимыми библиотеками, включая уже модифицированную и настроенную библиотеку Ethernet. Её остаётся лишь перенести в папку «libraries» туда, где установлено ArduinoIDE, заменив стандартную библиотеку Ethernet.

В константах, при необходимости, нужно установить IP-адрес отвисатора, соответствующий диапазону контролируемой сети.

Схема устройства предельно проста и очевидна:

Перед началом сборки, надо не забыть выставить выходное напряжение на преобразователе, равное пяти вольтам. Это единственная регулировка в устройстве. Движок подстроечного резистора после этого целесообразно зафиксировать капелькой подходящего лака. У кого нет цапона, подойдёт лак для ногтей, отобранный у жены.

Собираем всю конструкцию в подходящем корпусе:

Вливаем в ардуину код.
Проверяем работоспособность отвисатора.
Окончательно крепим плату ардуины (на двусторонний скотч или капельками термоклея по углам), но, желательно, так, чтобы при необходимости было возможно подключиться TTL-конвертером для перепрограммирования.
Закрываем корпус.

Готово.

Плюсы конструкции:
— Универсальность алгоритма. Конструкция пингует по нескольку раз и сразу несколько ресурсов. И только в случае полной неудачи перезагружает нагрузку.
— Универсальность адресов и протоколов. Можно пинговать любые ресурсы. Например, мониторить собственный сайт на собственном веб-сервере. Можно заменить ICMP-пинги на что-то другое. Например, на подключение к контрольным ресурсам в качестве web-клиента или, скажем, по ftp-протоколу. Аппаратно конструкция никак не изменится.
— Развязанность контролируемой сети и контролируемого устройства. Отвисатор может сидеть во внутренней офисной сети за офисным прокси-сервером или НАТом и, при этом, допустим, перезагружать какой-нибудь старенький аппаратный файервол, который стоит намного раньше и, соответственно, в другой сети.
— Универсальность подконтрольной нагрузки. Уже в существующем виде конструкция будет работать с любой низковольтной DC-нагрузкой, оснащённой разъёмом 5,5×2.1, в широком диапазоне питающих напряжений. Но заменив ключевой элемент на хорошее реле или каскад из оптосимистора (желательно с контролем перехода нуля) и силового симистора, мы без проблем сможем управлять любой рабочей станцией, сервером или фермой. А хороший электромагнитный пускатель сможет обеспечивать аппаратную перезагрузку целой вычислительной стойки или небольшого машинного зала 🙂

Минусы конструкции:
— DIY. Надо найти время, силы и желание, чтобы сесть и это сделать.
— Аскетичность конструкции. И внешне, и внутренне, отвисатор суров, аскетичен и неаляпист. Нет собственного веб-интрфейса, нет рюшечек, нет модного управления от смартфона, нет блестящих элементов, обтекаемого корпуса, китайского облака, нет логотипов «Mi», «зелёного робота» или «яблока», даже нет никаких мигающих лампочек. Чёрная коробочка, которая молча делает свою работу. Мной подразумевается, что на эту коробочку годами никто не будет смотреть и она явно будет не на виду, — скорее всего, где-то на пыльном чердаке или на дальней антресоли.

На самом деле описанная в обзоре про-мини прошивается optiboot-загрузчиком и тогда внутренняя собака не окирпичивает ардуину. А далее в скетче работает собака. Которая и следит.
И даже более того. Когда обнаруживается отвал интернета, то сначала реле щёлкает и перезагружает нагрузку, потом сознательно собака не дёргается дольше положенного срока и ардуина сама аппаратно также перезагружается, вместе с подконтрольной нагрузкой. Реальный аппаратный ресет всей системы, и подконтрольной и следящей.

а если уж припёрло, то можно через лампочку сделать — поставить ssr реле в разрыв usb питания, наверное даже в корпус роутера всё уместится…

За ардуину-то как раз можно быть спокойным — в отличие от сетевухи. А ее аппаратнвя перезагрузка у вас не предусмотрена…

Нет-нет. Посмотрите схему и скетч. Я задействовал ногу RST сетевухи, она на 9 пине. И при отрабатывании процедуры Setup, сетевой модуль перезагружается. Так что у меня происходит реальная аппаратная перезагрузка действительно всего.

 


Готовое решение — Zyxel Keenetic 4G — аппаратное отключение модема от питания с последующим включением, если модем не отвечает.

zyxle keenetic III — 2200р.

С ней тоже вполне неплохо, и если уж чувства к продукции zyxel так глубоки то ничего не мешает поставить их прошивку на это идентичное (soc) железо +))) или любую другую 😉 в нем openwrt из коробки uart и 4 gpio распаянных +2 на переключателе сейчас задействованны в прошивке вкл/выкл tor или vpn но можно использовать иначе

Собрал аналогичное устройство на ESP8266. Работает уже месяца три, ни разу не подводило. Из плюсов — цена, простота и отслеживание зависания wifi в роутере.

Все давно придумали за нас — sonoff itead на esp8266 — и реле, и блок питания, и низкая цена.

У меня роутер TP-Link MR3220 перепрошит в Open-WRT. Самописный скрипт пингует яндекс и гугл раз в минуту, если пинг не проходит 3 раза, сначала перегружает роутер, затем меняет конфиг с проводного интернета на 3G.
И имеется возможность управлять пинанием УСБ свистка:
echo 0 > /sys/class/gpio/gpio8/value # Отключить питание USB
echo 1 > /sys/class/gpio/gpio8/value # Включить питание USB

С микротиком все гораздо проще: он умеет делать power cycle не только на PoE, но и на USB.
Так что — «просто микротик», и задача уже сразу решена. mikrotik, poe, реле.

А ещё есть мега зверёк mikrotik sxt lte там вообще: вставляешь внутрь симку, крепишь к штанге, ставишь по выше и все — антена сразу с усилением, питание по Poe, корпус герметичный. Все здорово кроме одного — чем думали латвийские разработчики выпуская это решение непонятно: работает эта крутейшая штука только в сетях лте. Там где есть сети 4г особо нужды в таком решении нет, а там где нужно бы ее поставить она работать не будет. Видно о вся Латвия покрыта 4г на 100%

На некоторых роутерах есть возможность программно, через обращение к пинам выведенным в OS как GPIO, отключать и включать питание на USB-порту. Пример — TP-Link WR703N (да и наверное многие другие TP-Link’и, железо у них всех похожее). Таким образом перезагружал виснущий 3G-модем, работало на ура.

 


Нужно в ProMini влить загрузчик OptiBoot, взамен стандартному. Для начала ознакомиться вот с этим.

На практике.
1. Вливать надо программатором. Из Уны программатор мне оказался без надобности, программатор мне нужен постоянно зачем-нибудь. Поэтому я себе давно купил AVRASP. Чуть больше доллара — не те деньги. Обзор вот тут, читать надо, там много полезных ссылок. Его самого не прошивал, всё осталось так, как прислал китаец, — меня устраивает.
2. Драйвера к нему поставит Zadig. Запустить; в опциях поставить галку, чтобы отображал все девайсы; из выпадающего списка найти наш USBASP; Поставить ему драйвера WinUSB.
Для сомневающихся. Всё от начала и до конца работает на Windows 10 x64. Лично проверено.
3. Заливать загрузчик будем AVR-дудкой. Скачиваем и пользуемся. Дуду из стандартной поставки ArduinoIDE лучше не использовать, с ней что-то не так.
4. Распаиваем нашу ProMini по всем известной схеме. 🙂 Только убедиться, что ноги программатора соответсвуют рисунку. Разные китайцы могут делать разную распайку колодки программатора, но на странице товара (или на самой плате программатора) написано точно.
5. Запускаем AVRDUDEPROG.exe, выбираем мегу328p, пробуем что-нибудь скачать из неё. Убеждаемся, что всё работает.
6. Что заливать? Заливаем только flash. Фьюзы не надо даже трогать, если нет уверенности и точных знаний. Указываем hex-файл.
Если будем лить optiboot загрузчик, то он находится в установленной ArduinoIDE в папке \hardware\arduino\avr\bootloaders\optiboot\optiboot_atmega328.hex
если нужен оригинальный загрузчик от ProMini, то он лежит \hardware\arduino\avr\bootloaders\atmega\ATmegaBOOT_168_atmega328.hex
Берём оттуда нужный hex и указываем нашей дуде. Прошиваем, верифицируем. Всё. Наша ардуина готова.
6. Допиливаем свой ArduinoIDE, чтобы он умел заливать скетчи в новые ардуины с оптибут -загрузчиками. Без этого будет Can’t resync.
Идём сюда, берём файл «boards-1.6.txt» и его содержимое дописываем в конец файла \hardware\arduino\avr\boards.txt вашего IDE. Теперь в список добавятся [optiboot] платы. Выбирайте 32-ногую мегу, скорость соответствующую — и всё прошьётся.
7. В своё удовольствие используем собаку в собственных проектах.

 

 

 

 

 

По мотивам — линк


Метки: ,
Copyright 2019. All rights reserved.

Опубликовано 17.07.2017 admin в категории "Железо", "Сети. LAN. Wi-Fi.

Добавить комментарий