При использовании этого 3G USB модема и интернета от ИнтерКом можно наблюдать следующую картину: при не активности соединения в течении длительного времени (около часа) интернет пропадает. Что бы обратно заработал интернет нужно было вынуть и обратно вставить модем. Но такое меня не устраивало, так как площадка была удалённая и нужно было каждый раз кого-то просить. Решение нашлось следующее: для управления usb устройствами существует утилита usbconfig с помощью которой можно делать detach\attach USB устройств.
Тестовый стенд: FreeBSD, Linux (Debian)
1) FreeBSD.
Отдельно будет описан способ для версий 8.0/8.1 и 8.2, так как в в 8.2 оставили единственный метод сброса для питания, а в 8.0/8.1 – их было 2. В любом случае, лучше использовать новый метод.
Старый метод (для версии 8.0, 8.1)
Всё ниже описанное проводилось на ОС FreeBSD 8.1 i386
Теперь при пропадании интернета, можно выполнить такую последовательность команд, что бы интернет заработал:
#/etc/rc.d/ppp stop ; usbconfig -d ugen1.2 power_off ; sleep 10 ; usbconfig -d ugen1.2 power_on ; /etc/rc.d/ppp start
– где ugen1.2 имя устройства, к которому подключён модем.
При этом в системном журнале можно наблюдать такие сообщения:
– при отключении (usbconfig -d ugen1.2 power_off):
u3g0: at uhub1, port 1, addr 2 (disconnected)
– при включении (usbconfig -d ugen1.2 power_on):
u3g0: <Data Interface> on usbus1
u3g0: Found 3 ports.
Если убрать задержку в 10 секунд, то на модеме не успеет пропасть питание.
Это решение не идеальное, просто описывает вариант “сброса по питанию”.
Но это крайний метод. Что бы такого не случалось, можно добавить в расписание по cron’y запуск пинг-пакетов на определённый сайт раз в 5 минут.
Новый метод (начиная с версий 8.2, хотя так же работает и на 8.0, 8.1)
– отключить устройство
usbconfig -d 0.1 set_config 255
– включить устройство
usbconfig -d 0.1 set_config 0
где 0.1 – адрес устройства кореневого хаба, а не адрес самого устройства. К примеру, у меня модем подключён к 0.2 (устройство ugen0.2):
uhub0: <VIA UHCI root HUB, class 9/0, rev 1.00/1.00, addr 1> on usbus0
uhub0: 2 ports with 2 removable, self powered
ugen0.2: <Novatel Wireless Inc.> at usbus0
u3g0: <Data Interface> on usbus0
u3g0: Found 2 ports.
А рут-хаб будет соответственно 0.1:
ugen0.1: <VIA> at usbus0
uhub0: <VIA UHCI root HUB, class 9/0, rev 1.00/1.00, addr 1> on usbus0
Если вместо кореневого хаба отключать само устройство, то оно потом не включиться.
2)Linux
Любителям линукса придётся чуть сложнее, ибо определённой команды для этих целей нет. И так, выключаем
#echo suspend >/sys/bus/usb/devices/1-2/power/level
и обратно включаем
#echo auto >/sys/bus/usb/devices/1-2/power/level
где 1-2 – номер порта к которому подключёно USB-устройство.
Примечание: для устройств на базе прошивок OpenWRT (которая сделана на базе linux) данных механизм реализован только частично. Это значит, что только в некоторых моделях оно работать будет, в остальных же – нет. Будем надеяться, что разработчики исправят эту ситуацию в дальнейшем.