Превращаем D-Link Dir-320 В 3G-Роутер

Я более чем уверен, что многие уже не раз видели подобные заголовки.

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

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

Самый длинный интервал, который я видел, составлял 8 (восемь) часов.

В результате многие от такой идеи отказываются и опускают руки, а если не могут обойтись без роутера, то адаптируют для этих целей старый ПК, да еще и устанавливают Windows (обычно XP, или что есть под рукой).

Поскольку ПК, а тем более Windows, для меня не вариант и «того» модема под рукой не было, пришлось искать решение.

Если вы заинтересованы в продолжении, нажмите «Вырезать».



Введение

Как, наверное, многим стало понятно из предисловия, передо мной стояла задача сделать небольшой и очень стабильный 3G-роутер.

Что для этого понадобилось:

  • Маршрутизатор DIR-320 (был в наличии)
  • 3G-модем
  • Внешняя антенна


Исследования и постановка целей

Итак, прежде чем делать что-либо самостоятельно, я начал с изучения многочисленных форумов и сообществ.

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

Некоторые были мегастабильны, но с недопустимо низкой скоростью, другие радовали своей работой, но через 30 минут замерзали насмерть.

Все это очень расстраивало.

Прежде чем отправиться в «закрома родины» за покупкой старого ПК, я решил проанализировать имеющиеся факты и самостоятельно разобраться в проблеме.

Для первоначальных экспериментов я решил использовать настольный ПК с Linux. Настроив 3G-соединение с помощью имеющегося Huawei E173, я запускал команду ping+wget с интервалом в 10 минут. Соединение длилось около 4 (четырех) часов, после чего модем перестал отвечать на команды PPP, при этом АТ работал.

Тот же эксперимент я провёл с AnyDATA ADU-500A (это модем из списка «тех самых»).

Как ни странно, все закончилось так же, только спустя 5 часов.

Любые попытки возродиться не принесли долгожданного результата; только полное отключение электроэнергии спасло ситуацию.

В очередной раз решил перезагрузить модем и тут меня осенило, а почему бы просто не отключить USB-порт. Сказано - сделано:

  1. Найдите модем в списке всех USB-устройств:
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
       

    for f in `ls /sys/bus/usb/devices/*/product`; do echo -e "$f\t`cat $f`"; done

  2. Выключите порт на 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 Мбит/с, я начал свое приключение.

Возможно, кому-то будет интересно:

После покупки начал пытаться подключиться к этому модему.

И как всегда возник ряд вопросов:

  1. Он постоянно отображается как компакт-диск.

  2. В интернете ни слова об этом модеме, максимум что удалось найти это вот этот упоминание предыдущей модели (WM-D200)
Анализ dmesg показал, что CD-ROM монтируется как SCSI, это навело на мысль, что его следует отключить как SCSI; никакие usb_modeswitches здесь не работают, да и не нужны они по сути.

Конечно, я сразу же написал собственную программу, которая это делала.

Но назойливая мысль, что это уже кто-то написал и скорее всего это уже есть в портеже или где-то еще, заставила меня поискать.

Первый проход по папке 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).

Управление питанием будет осуществляться дополнительной платой с минимально необходимым набором деталей.

Вот ее схема:

Превращаем D-Link DIR-320 в 3G-роутер

Несколько слов о схеме.

Оба транзистора действуют как переключатели.

При подаче логической единицы на вход «CTRL» транзистор VT1 откроется, что в свою очередь приведет к открытию транзистора VT2 и напряжение питания поступит на порт USB. Как таковых расчетов не производилось, поэтому схему нельзя считать оптимальной.

Например, транзистор VT1 был просто единственным транзистором N-P-N в диапазоне, как и резисторы.

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

Вот как выглядит финальная версия:

Превращаем D-Link DIR-320 в 3G-роутер

Зелеными надписями отмечены одноименные порты на схемах.

Резистор R4 припаян непосредственно к ножке светодиода.

Пошаговая инструкция модификации:

  • Отключите роутер и разберите его.

  • Удалите ненужный R48 — этот резистор соединяет светодиод с ножкой процессора.



    Превращаем D-Link DIR-320 в 3G-роутер

  • Снимите предохранитель F1 — этот предохранитель должен обеспечивать защиту в случае короткого замыкания на линиях питания USB. Не знаю его значение, но я использовал его в своей схеме (R3).

    Обратите внимание, что желтыми надписями отмечены места подключения платы управления.



    Превращаем D-Link DIR-320 в 3G-роутер

  • Снимите защитное покрытие с проводника, подводящего сигнал от процессора к резистору R48. К этому проводнику необходимо припаять порт «CTRL» платы управления.



    Превращаем D-Link DIR-320 в 3G-роутер

  • Приклейте плату управления в наиболее удобном для вас месте.

    Оказалось, что мне понравилась свободная зона, чуть ниже антенного гнезда.

    В этом случае длина соединительных проводов будет минимальной.



    Превращаем D-Link DIR-320 в 3G-роутер

  • Припаяйте резистор R4 непосредственно к аноду светодиода, как показано на фото.

    Также обратите внимание на подключение соединительных проводов.



    Превращаем D-Link DIR-320 в 3G-роутер

  • Завершаем монтаж соединительных проводов

    Превращаем D-Link DIR-320 в 3G-роутер

  • Конечный результат

    Превращаем D-Link DIR-320 в 3G-роутер

  • Собираем и включаем роутер


Обновление программного обеспечения роутера

Это последний шаг на пути к «счастью».

Нам потребуется написать ряд новых скриптов и внести изменения в существующие.

Итак, все в порядке.

Подключитесь к роутеру по 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
Вот и всё, больше изменений не будет. Рекомендую перезагрузить роутер, хотя 3G в любом случае должен оживиться минут через пять.



Вместо эпилога

Домашние испытания длились 41 день.

В результате за весь период не было ни одного сбоя.

Ожидаемая стабильность достигнута.

Перед отправкой на «поля» были проведены испытания проходимости в киевской квартире.

Разочарование застало меня врасплох; достигнутый максимум не превышал 1Мбит/с и только на больших файлах.

Минимальный пинг был в пределах 220мс.

Решив не прекращать тестирование, я уехал за город. Уровень был на максимуме, а индикатор CDMA Rev.B больше не светился.

На самом деле я не возлагал больших надежд на скорость 14 Мбит/с, но ожидал увидеть уже достигнутую скорость как минимум 1 Мбит/с.

Но не заставило себя ждать еще одно разочарование; достигнутый максимум уже составлял около 350Кбит/с.

На этом все эксперименты с модемом МТС были прекращены.

Вернуть его так и не удалось.

Но продавец обменял антенну на модель, способную работать в связке с модемами Интертелеком и PeopleNET. Чему я был несказанно рад, и пусть модем будет в коллекции, он когда-нибудь пригодится.

Теги: #linux #diy #настройка Linux #сделай сам #OpenWRT #роутер #3g модем

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.