Я более чем уверен, что многие уже не раз видели подобные заголовки.
Но каждый раз, когда их читаешь, оказывается, что тебе нужно купить одни из самых проверенных модемов в мире, к тому же удача должна быть к тебе благосклонна.
Но самая распространенная проблема заключается в том, что не существует модема, который бы не зависал через определенное время.
Самый длинный интервал, который я видел, составлял 8 (восемь) часов.
В результате многие от такой идеи отказываются и опускают руки, а если не могут обойтись без роутера, то адаптируют для этих целей старый ПК, да еще и устанавливают Windows (обычно XP, или что есть под рукой).
Поскольку ПК, а тем более Windows, для меня не вариант и «того» модема под рукой не было, пришлось искать решение.
Если вы заинтересованы в продолжении, нажмите «Вырезать».
Введение
Как, наверное, многим стало понятно из предисловия, передо мной стояла задача сделать небольшой и очень стабильный 3G-роутер.Что для этого понадобилось:
- Маршрутизатор DIR-320 (был в наличии)
- 3G-модем
- Внешняя антенна
Исследования и постановка целей
Итак, прежде чем делать что-либо самостоятельно, я начал с изучения многочисленных форумов и сообществ.На каждом форуме были темы, описывающие те самые чудо-модемы и бесконечную череду связанных с ними проблем.
Некоторые были мегастабильны, но с недопустимо низкой скоростью, другие радовали своей работой, но через 30 минут замерзали насмерть.
Все это очень расстраивало.
Прежде чем отправиться в «закрома родины» за покупкой старого ПК, я решил проанализировать имеющиеся факты и самостоятельно разобраться в проблеме.
Для первоначальных экспериментов я решил использовать настольный ПК с Linux. Настроив 3G-соединение с помощью имеющегося Huawei E173, я запускал команду ping+wget с интервалом в 10 минут. Соединение длилось около 4 (четырех) часов, после чего модем перестал отвечать на команды PPP, при этом АТ работал.
Тот же эксперимент я провёл с AnyDATA ADU-500A (это модем из списка «тех самых»).
Как ни странно, все закончилось так же, только спустя 5 часов.
Любые попытки возродиться не принесли долгожданного результата; только полное отключение электроэнергии спасло ситуацию.
В очередной раз решил перезагрузить модем и тут меня осенило, а почему бы просто не отключить USB-порт. Сказано - сделано:
- Найдите модем в списке всех USB-устройств:
for f in `ls /sys/bus/usb/devices/*/product`; do echo -e "$f\t`cat $f`"; done
- Выключите порт на 5 секунд, а затем включите его:
echo “suspend” | sudo tee /sys/bus/usb/devices/1-1/power/level sleep 5 echo "on" | sudo tee /sys/bus/usb/devices/1-1/power/level
И соединение можно будет установить снова.
С этого момента стало предельно ясно, что нужно делать.
Взяв четыре прошивки для роутера: D-Link, Asus, OpenWRT или DD-WRT, я стал повторять эксперимент, но вот незадача, на удивление, ни одна из прошивок не имела возможности управлять питанием USB. Сначала я подумал, что это проблема ядра 2.4.x. Но та же проблема и с 2.6. Причём после перезагрузки роутера модем остался инициализированным.
Вывод напрашивался сам собой: нужно разбирать роутер.
Внимательный осмотр и тестирование платы показали, что вывод питания «+5В» подключен напрямую к источнику питания.
Меня это не устраивает и нужно модернизировать плату и блок питания.
Пришло время выбирать дистрибутив.
У этого чудесного роутера очень мало оперативной памяти и мне не хотелось, чтобы ее потребляли ненужные сервисы, будь то httpd, FTP, SAMBA или что-то еще.
Дистрибутив на базе OpenWRT было решено собрать самостоятельно, с минимумом предустановленных пакетов и сервисов.
Но прежде чем приступить к сборке дистрибутива и обновлению роутера, нам пришлось поработать над выбором целевого модема/оператора и внешней антенны.
Посмотрев карту покрытия разных операторов, пришел к выводу, что МТС подходит больше всего.
Помимо карты покрытия, мне очень понравилось то, что всю статистику и управление можно вести из достаточно удобного WEB-интерфейса.
Купив их лучший модем, с обещанным максимумом 14,7 Мбит/с и минимумом 3 Мбит/с, я начал свое приключение.
Возможно, кому-то будет интересно:
- 3G модем (был куплен МТС WeTelecom WM-D300 )
- Направленная антенна CDMA-450 (по словам продавца неплохая, какой-то неизвестный производитель )
И как всегда возник ряд вопросов:
- Он постоянно отображается как компакт-диск.
- В интернете ни слова об этом модеме, максимум что удалось найти это вот этот упоминание предыдущей модели (WM-D200)
Конечно, я сразу же написал собственную программу, которая это делала.
Но назойливая мысль, что это уже кто-то написал и скорее всего это уже есть в портеже или где-то еще, заставила меня поискать.
Первый проход по папке man показал, что там есть замечательный пакет sdparm. После установки и проверки стало понятно, что это то, что нужно.
Поскольку теперь все стало на свои места и вопросов больше не осталось, можно приступать к работе.
Сборка OpenWRT
Все действия выполняются в консоли Linux. Обратите внимание, что версия Backfire была выбрана потому, что это последняя версия с ядром 2.4. Это очень важно, так как само ядро 2.6 очень требовательно как к производительности процессора, так и к системным ресурсам.
- Загрузите исходный код OpenWRT:
svn co svn://svn.openwrt.org/openwrt/branches/backfire openwrt-backfire
- Перейти в исходную папку
cd openwrt-backfire
- Обновляем все пакеты
.
/scripts/feeds update -a
- Добавить из пакетов sdparm
.
/scripts/feeds install sdparm
- Откройте меню настроек
make menuconfig
- Выбор интересующей вас платформы
Target System (Broadcom BCM947xx/953xx [2.4])
- Встраиваем интересующие нас пакеты (по умолчанию они не включаются даже в виде модулей)
<*> sdparm. Read or modify SCSI or USB disk parameters <*> chat. Establish conversation with a modem <*> comgt. Option/Vodafone 3G/GPRS control tool <*> kmod-scsi-generic. Kernel support for SCSI generic <*> kmod-usb-core. Support for USB <*> kmod-usb-ohci. Support for OHCI controllers <*> kmod-usb-serial. Support for USB-to-Serial converters <*> kmod-usb-storage. USB Storage support <*> kmod-usb2. Support for USB2 controllers
- Все остальные пункты оставляем без изменений
- Выйдите из меню конфигуратора и сохраните
- Инструменты для сбора
make tools/install -j`grep -c processor /proc/cpuinfo` make toolchain/install -j`grep -c processor /proc/cpuinfo`
- Откройте меню конфигурации ядра Linux.
make kernel_menuconfig
- Настройка МПД
[*] Support 2-chip flash interleave
- Выйдите из меню конфигуратора и сохраните
- Сборка OpenWRT
make -j`grep -c processor /proc/cpuinfo`
- После того, как прошивка собрана, ее нужно прошить в устройство.
На эту тему есть много инструкций( например, на сайте DD-WRT )
Проверка прошивки
После того, как прошивка «залилась» и роутер перезагрузился, подключите к нему модем и подключите роутер через Ethernet к ПК.
Настройте интерфейс (в моем случае это eth0) вашего ПК с IP-адресом, выполнив команду: ifconfig eth0 inet 192.168.1.2/24
Далее подключаемся к роутеру через Telnet. Для этого выполните следующую команду из консоли: telnet -l root 192.168.1.1
Вход в систему будет выполнен автоматически без запроса пароля.
Это в корне неверно.
Чтобы исправить ситуацию, установите пароль, выполнив в консоли команду: passwd
Запустите команду " Выход ", выйти телнет сеансы.
Войдите, используя сш : ssh [email protected]
Следующий шаг — убедиться, что модем распознан ядром, выполнив в консоли команду: grep "^P\:.
*22de.*6803" /proc/bus/usb/devices
Результатом выполнения этой команды будет строка с VID и PID модема.
В противном случае проверьте, что сделано не по инструкции.
Обновление оборудования маршрутизатора
Для управления питанием USB-порта нужна свободная ножка процессора.Но так как это не инженерная плата, а готовый продукт, то этот вариант не подходит. Как назло, у этого маршрутизатора на передней панели множество светодиодных индикаторов.
Мы можем легко адаптировать один из них под свои нужды.
В моем случае выбор пал на индикатор со значком принтера, так как он соответствовал светодиоду USB на proc-fs (/proc/diag/led/usb).
Управление питанием будет осуществляться дополнительной платой с минимально необходимым набором деталей.
Вот ее схема:
Несколько слов о схеме.
Оба транзистора действуют как переключатели.
При подаче логической единицы на вход «CTRL» транзистор VT1 откроется, что в свою очередь приведет к открытию транзистора VT2 и напряжение питания поступит на порт USB. Как таковых расчетов не производилось, поэтому схему нельзя считать оптимальной.
Например, транзистор VT1 был просто единственным транзистором N-P-N в диапазоне, как и резисторы.
Делать печатную плату у меня не было ни времени, ни желания, поэтому я ограничился небольшим куском платы.
Вот как выглядит финальная версия:
Зелеными надписями отмечены одноименные порты на схемах.
Резистор R4 припаян непосредственно к ножке светодиода.
Пошаговая инструкция модификации:
- Отключите роутер и разберите его.
- Удалите ненужный R48 — этот резистор соединяет светодиод с ножкой процессора.
- Снимите предохранитель F1 — этот предохранитель должен обеспечивать защиту в случае короткого замыкания на линиях питания USB. Не знаю его значение, но я использовал его в своей схеме (R3).
Обратите внимание, что желтыми надписями отмечены места подключения платы управления.
- Снимите защитное покрытие с проводника, подводящего сигнал от процессора к резистору R48. К этому проводнику необходимо припаять порт «CTRL» платы управления.
- Приклейте плату управления в наиболее удобном для вас месте.
Оказалось, что мне понравилась свободная зона, чуть ниже антенного гнезда.
В этом случае длина соединительных проводов будет минимальной.
- Припаяйте резистор R4 непосредственно к аноду светодиода, как показано на фото.
Также обратите внимание на подключение соединительных проводов.
- Завершаем монтаж соединительных проводов
- Конечный результат
- Собираем и включаем роутер
Обновление программного обеспечения роутера
Это последний шаг на пути к «счастью».Нам потребуется написать ряд новых скриптов и внести изменения в существующие.
Итак, все в порядке.
Подключитесь к роутеру по ssh, так как все последующие действия будут выполняться непосредственно на нем.
Создание утилит управления USB
Перейдите в папку /etc/ppp. Многим будет интересно, почему именно эта папка была выбрана в качестве целевой.Ответ прост, так сложилось исторически.
Думаю /usr/local/sbin подойдёт больше, но сути это не меняет cd /etc/ppp
- Создайте usb-up.sh. Этот скрипт включит питание USB-порта.
$ cat usb-up.sh #!/bin/sh logger -t "USB PwrCtrl" "Turn-on USB power" echo 1 > /proc/diag/led/usb
- Создать скрипт для перезагрузки USB-порта
$ cat resetusb.sh #!/bin/sh logger -t "USB PwrCtrl" "Turn-off USB power" echo 0 > /proc/diag/led/usb # Sleep in 3 sec is an optional, but may be useful for some modem types #sleep 3 logger -t "USB PwrCtrl" "Turn-on USB power" echo 1 > /proc/diag/led/usb
- Создайте скрипт для проверки существования процесса pppd.
#!/bin/sh if ps | grep -q /usr/sbin/pppd; then logger -t "PPP watcher" "PPP alive" else logger -t "PPP watcher" "No PPP daemon" /etc/ppp/resetusb.sh fi
- Сделать скрипты исполняемыми
chmod a+x /etc/ppp/*.
sh
- Добавим корректную обработку подключения модема к USB. Обратите внимание, что OpenWRT по умолчанию не имеет udev, а вместо этого использует «демон» горячего подключения.
$ cat /etc/hotplug.d/usb/11-modem #!/bin/sh # Copyright (C) 2013 Sergey Shcherbakov <[email protected]> case "$ACTION" in add) (grep -q "^P\:.
*22de.*6803" /proc/bus/usb/devices) && { logger -t "WM-D300" "Detected ZeroCD of WM-D300 modem" # Checking ZeroCD status while [ "$(sdparm -q --command=ready /dev/scsi/host0/bus0/target0/lun0/generic)" != "Ready" ]; do logger -t "WM-D300" "ZeroCD yet not ready" # Workaround for bug with multiple calls of scripts (/usr/bin/lsusb | grep -q 22de:6801) && { logger -t "WM-D300" "Seems that script called twice and device already initialized" return 0 } sleep 2 done logger -t "WM-D300" "ZeroCD ready and will be ejected" /usr/bin/sdparm --command=eject /dev/scsi/host0/bus0/target0/lun0/generic } (grep -q "^P\:.
*22de.*6801" /proc/bus/usb/devices) && [ ! -c /dev/usb/tts/0 ] && { logger -t "WM-D300" "Updating USB Serial driver with D200/D300 vendor and product ID" rmmod usbserial && insmod usbserial vendor=0x22de product=0x6801 } (grep -q "^P\:.
*22de.*6801" /proc/bus/usb/devices) && [ -c /dev/usb/tts/2 ] && ! (ifconfig 3g-wan 1>/dev/null 2>/dev/null) && { logger -t "WM-D300" "All modem interfaces installed, turning on WAN" ifdown wan && ifup wan } ;; remove) ! (grep -q "^P\:.
*22de.*6801" /proc/bus/usb/devices) && { logger -t "WM-D300" "Modem disconnected, turning off WAN interface" ifdown wan } ;; esac
Внесение изменений в существующие скрипты
- Отключите интерфейс WAN по умолчанию, выполнив команду
sed -i 's/interface\ wan$/interface\ wan_dflt/' /etc/config/network
- Добавьте новый дескриптор интерфейса WAN с помощью настройки для 3G
$ cat /etc/config/network … config interface wan option ifname ppp0 option device /dev/usb/tts/0 option service evdo option proto 3g option username 'mobile' option password 'internet' option pppd_options 'noipdefault maxfail 3' option connect '/etc/ppp/usb-up.sh' option disconnect '/etc/ppp/resetusb.sh' option keepalive 20
- Чтобы добавить автоматическую активацию USB-порта при инициализации роутера, необходимо модифицировать стандартный скрипт /etc/init.d/usb, добавив вызов скрипта /etc/ppp/usb-up.sh по адресу конец функции start()
$ cat /etc/init.d/usb … start() { .
# Turn-on power on USB /etc/ppp/usb-up.sh } …
- Кроме того, вы можете изменить (но не обязательно) сценарий чата (/etc/chatscripts/evdo.chat).
На самом деле должно работать и без доработок, но я предпочёл немного подправить.
Вот мой вариант:
ABORT BUSY ABORT 'NO CARRIER' ABORT ERROR ABORT 'NO DIAL TONE' ABORT 'NO DIALTONE' ABORT 'NO ANSWER' REPORT CONNECT TIMEOUT 10 '' AT OK ATDT#777 CONNECT ''
- Добавьте в Cron задачу, которая будет проверять наличие процесса pppd каждые пять минут. Для этого вызовите команду «crontab -e» и добавьте следующую строку:
*/5 * * * * /etc/ppp/check.sh
- Разрешить запуск Cron и запустить его
/etc/init.d/cron enable && /etc/init.d/cron start
- Настройку Wi-Fi я вам показывать не буду, так как она вполне стандартная и прекрасно описано на официальном сайте OpenWRT
Вместо эпилога
Домашние испытания длились 41 день.В результате за весь период не было ни одного сбоя.
Ожидаемая стабильность достигнута.
Перед отправкой на «поля» были проведены испытания проходимости в киевской квартире.
Разочарование застало меня врасплох; достигнутый максимум не превышал 1Мбит/с и только на больших файлах.
Минимальный пинг был в пределах 220мс.
Решив не прекращать тестирование, я уехал за город. Уровень был на максимуме, а индикатор CDMA Rev.B больше не светился.
На самом деле я не возлагал больших надежд на скорость 14 Мбит/с, но ожидал увидеть уже достигнутую скорость как минимум 1 Мбит/с.
Но не заставило себя ждать еще одно разочарование; достигнутый максимум уже составлял около 350Кбит/с.
На этом все эксперименты с модемом МТС были прекращены.
Вернуть его так и не удалось.
Но продавец обменял антенну на модель, способную работать в связке с модемами Интертелеком и PeopleNET. Чему я был несказанно рад, и пусть модем будет в коллекции, он когда-нибудь пригодится.
Теги: #linux #diy #настройка Linux #сделай сам #OpenWRT #роутер #3g модем
-
Как Загрузить Norton 360 Premier Edition?
19 Oct, 24 -
Windows-Хостинг От Amazon Web Services
19 Oct, 24 -
Проверено Visa И Ssl — Не Панацея
19 Oct, 24 -
Будущее Близко. Нужно Ли Нам Такое Будущее?
19 Oct, 24 -
Монады И Do-Нотация В C++
19 Oct, 24