- PVSM.RU - https://www.pvsm.ru -
Я более чем уверен, что многие уже не один раз видели подобные заголовки. Но каждый раз, когда их читаешь, получается, что нужно купить какой-то самый в мире проверенный модем, да к тому же удача должна быть к тебе благосклонна. А ведь самая распространённая проблема заключается в том, что нет такого модема, который бы не зависал по истечению определенного времени. Самый длинный интервал, что я видел – это 8 (восемь) часов. Как следствие, многие отказываются от подобной задумки и опускают руки, а в случае если без роутера никак, то приспосабливают для этих целей старенький ПК, да еще и устанавливают Windows (как правило, XP, ну или что будет под рукой).
Так как ПК и уж тем более Windows, для меня не вариант и «того самого» модема у меня не было под руками, пришлось искать решение.
Если интересно продолжение, прошу под «кат».
Как, наверное, многим стало понятно из предисловия, передо мной стояла задача сделать небольшой и очень стабильный 3G роутер.
Что для этого потребовалось:
Итак, прежде чем делать что-то самому, я начал с того, что проанализировал многочисленные форумы и сообщества. На каждом форуме были ветки с описание тех самых чудо модемов и бесконечного ряда, связанных с ними проблем. Одни были мега стабильными, но с неприемлемо низкой скоростью, другие радовали производительностью, но уже через 30 минут «зависали» намертво. Все это очень сильно огорчало.
Прежде чем идти в «закрома родины» за стареньким ПК, я решил проанализировать имеющиеся факты и самостоятельно исследовать проблему.
Для первичных экспериментов я решил воспользоваться стационарным ПК с Linux. Настроив 3G соединение, посредством имеющегося в наличии Huawei E173, запустил вызов команды ping + wget с интервалом раз в 10 минут. Соединение продержалось около 4 (четырёх) часов, после чего модем перестал отвечать на PPP команды, AT при этом работали. Такой же эксперимент я провел и с AnyDATA ADU-500A (это модем из списка «тех самых»). Как ни странно, закончилось все тем же, только через 5 часов.
Всякие попытки оживить, не приносили долгожданного результата, только полное обесточивание спасало ситуацию.
В очередной раз я решил перезагрузить модем и тут меня осенило, а почему бы просто не потушить USB порт. Сказано-сделано:
for f in `ls /sys/bus/usb/devices/*/product`; do echo -e "$ft`cat $f`"; done
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 самостоятельно, при этом с минимумом предустановленных пакетов и сервисов.
Но прежде чем приступить к сборке дистрибутива и модернизации роутера, предстояла работа по выбору целевого модема/оператора и внешней антенны.
Просмотрев карту покрытия разных операторов, пришел к выводу, что наиболее подходящим является MTS. Помимо карты покрытия, мне очень понравилось то, что у них можно всю статистику и управление совершить из достаточно удобного WEB интерфейса. Купив их самый лучший модем, с обещанным максимумом в 14,7 Мбит/с и минимум в 3Мбит/с, начал свое приключение.
Возможно, кому-то будет интересно:
После покупки начал попытки подключиться к этому модему. И как всегда возник ряд вопросов:
Анализ dmesg показал, что CD-ROM монтируется как SCSI, это навело на мысль, что его нужно отключать именно как SCSI, никакие usb_modeswitch тут не работают, да собственно и не нужны.
Разумеется, был сразу написан свой софт, который это делал. Но непокидающая мысль, о том, что это кто-то уже писал и скорее всего это уже есть в портах/portage или еще где-то, заставило поискать. Первый же проход по папке с man’ами показал, что есть чудеснейший пакет sdparm. Установив и проверив, стало ясно — это то, что нужно.
Так как теперь все стало на свои места и больше не осталось вопросов, можно приступать к работе.
Все шаги выполняются в консоли Linux. Обратите внимание, релиз Backfire выбран из-за того, что это последний релиз с ядром 2.4. Это очень важно, так как ядро 2.6 само по себе очень требовательно как к производительности процессора, так и к системным ресурсам.
svn co svn://svn.openwrt.org/openwrt/branches/backfire openwrt-backfire
cd openwrt-backfire
./scripts/feeds update -a
./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`
make kernel_menuconfig
[*] Support 2-chip flash interleave
make -j`grep -c processor /proc/cpuinfo`
После того как прошивка была «залита» и роутер перезагрузился, подключите к нему модем и соедините роутер посредством Ethernet с вашим ПК. Настройте на интерфейсе (в моём случае это eth0) вашего ПК IP адрес выполнив команду:
ifconfig eth0 inet 192.168.1.2/24
Далее, подключитесь к роутеру по Telnet. Для этого из консоли выполните следующую команду:
telnet -l root 192.168.1.1
Вход будет совершен автоматически без запроса пароля. Это в корне не верно. Чтобы исправить ситуацию, задайте пароль, выполнив команду в консоли:
passwd
Выполните команду «exit», для выхода из telnet сессии.
Выполните вход по ssh:
ssh root@192.168.1.1
Следующим шагом, удостоверимся, что модем был распознан ядром, выполнив команду в консоли:
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, припаян непосредственно к ножке светодиода.
Пошаговая инструкция по модификации:
Это последний шаг на пути к «счастью». Нам нужно будет написать ряд новых скриптов и внести изменения в уже имеющиеся. Итак, все по прядку.
Подключитесь к роутеру по ssh, так как все следующие шаги будут выполняться непосредственно на нём.
Перейдите в папку /etc/ppp. Многих заинтересует, почему была выбрана именно эта папка в качестве целевой. Ответ прост, так исторически сложилось. Думаю, /usr/local/sbin будет более подходящей, но сути это не меняет
cd /etc/ppp
$ cat usb-up.sh
#!/bin/sh
logger -t "USB PwrCtrl" "Turn-on USB power"
echo 1 > /proc/diag/led/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
#!/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
$ cat /etc/hotplug.d/usb/11-modem
#!/bin/sh
# Copyright (C) 2013 Sergey Shcherbakov <shchers@gmail.com>
case "$ACTION" in
add)
(grep -q "^P:.*22de.*6803" /proc/bus/usb/devices) &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 ] &(grep -q "^P:.*22de.*6801" /proc/bus/usb/devices) && [ -c /dev/usb/tts/2 ] && ! (ifconfig 3g-wan 1>/dev/null 2>/dev/null) &;
remove)
! (grep -q "^P:.*22de.*6801" /proc/bus/usb/devices) &;
esac
sed -i 's/interface wan$/interface wan_dflt/' /etc/config/network
$ 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
$ cat /etc/init.d/usb
…
start() {
...
# Turn-on power on USB
/etc/ppp/usb-up.sh
}
…
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 ''
*/5 * * * * /etc/ppp/check.sh
/etc/init.d/cron enable && /etc/init.d/cron start
На этом все, больше изменений не будет. Я рекомендую перезагрузить роутер, хотя 3G и так должен «ожить» через пять минут.
Домашние испытания продлились 41 день. Как результат, ни единого сбоя на протяжении всего периода. Ожидаемая стабильность достигнута.
Перед отправкой в «поля», были проведены испытания пропускной способности в киевской квартире. Разочарование застигло врасплох, достигнутый максимум не превышал 1Мбит/с, при этом только на больших файлах. Минимальный пинг был а пределах 220мс. Решив не прекращать испытания, поехал за город. Уровень был на максимуме, при этом индикатор CDMA Rev.B уже не горел. На самом деле, я не теплил надежд на 14Мбит/с, но ожидал увидеть, как минимум, уже достигнутый 1Мбит. Но очередное разочарование не заставило себя ждать, достигнутый максимум составлял уже около 350Кбит/с.
На этом, всяческие эксперименты с модемом от MTS были прекращены. Вернуть его так и не удалось. А вот антенну продавец обменял на модель способную работать в связке с модемами Интертелеком и PeopleNET. Чему я был несказанно рад, а модем пускай будет в коллекции, когда-нибудь пригодится.
Автор: shchers
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/diy/37640
Ссылки в тексте:
[1] MTS WeTelecom WM-D300: http://www.mts.com.ua/rus/wm_d300.php
[2] какого-то неизвестного производителя: http://3gstar.com.ua/Antenna-cdma450Mgc-usileniem-17Db-MTSkonnekt-kabel-perehodnik-p-323.html
[3] упоминание о предыдущей модели (WM-D200): http://imbecyle.livejournal.com/432989.html
[4] например, на сайте DD-WRT: http://www.dd-wrt.com/wiki/index.php/%D0%9F%D1%80%D0%BE%D1%88%D0%B8%D0%B2%D0%BA%D0%B0_DIR-320#.D0.9F.D1.80.D0.BE.D1.88.D0.B8.D0.B2.D0.BA.D0.B0_.D0.B2.D1.80.D1.83.D1.87.D0.BD.D1.83.D1.8E
[5] настройками для 3G: http://wiki.openwrt.org/doc/uci/network#protocol.3g.ppp.over.ev-do.cdma.umts.or.gprs
[6] прекрасно описана на официальном сайте OpenWRT: http://wiki.openwrt.org/doc/uci/wireless#wifi.networks
[7] Источник: http://habrahabr.ru/post/184940/
Нажмите здесь для печати.