Организация непрерывного соединения по 3g модему в Линуксе (Devuan)
2018-02-13 13:11:10

    Потребовалось мне организовать удаленный контроль над своим ЧПУ станком. Станок у меня в гараже, а я на работе. Он мог бы пилить себе, а я мог бы за ним приглядывать.

   А тут, на счастье, завалялся у меня старенький МТС-овский 3g-модем. Накумекал я в него симку и сел вспоминать как там организовывать связь через это дело.

   Первым делом модем нужно вставить и проверить узрело ли его ядро:

# lsusb
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 004: ID 064e:c334 Suyin Corp. 
Bus 001 Device 003: ID 138a:0018 Validity Sensors, Inc. Fingerprint scanner
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 005: ID 12d1:1436 Huawei Technologies Co., Ltd. E173 3G Modem (modem-mode)
Bus 003 Device 002: ID 0e8d:2008 MediaTek Inc. 
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

   Есть. Вторым делом нужно установить пакет usb-modeswitch

apt install usb-modeswitch

   Послу установки пакета нужно перезагрузить систему и проверить появились ли устройства в /dev

# ls /dev | grep ttyUSB
ttyUSB0
ttyUSB1
ttyUSB2

   Появились. Теперь начинаются вкусности линукса: все подобные устройства в системе видятся как файлы. Поэтому любой программе, для того чтоб провзаимодействовать с устройством нужно всего лишь писать и читать данные в эти файлы-устройства. Нужно только знать что писать.

   Задача номер раз — организуем интернет. Устанавливаем скрипт-дозвонщик по фамилии wvdial.

#apt install wvdial

   А в его конфигурационный файл /etc/wvdial.conf поместим следующее

[Dialer defaults]
Phone = *99#
Username = mdm
Password = mdm
Stupid Mode = 1
Dial Command = ATDT
Carrier Check = No
Modem = /dev/ttyUSB0
Baud = 460800
Init2 = ATZ
Init3 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Init4 = AT+CGDCONT = 1,"IP","internet.mts.ru"
ISDN = 0
Modem Type = Analog Modem

   После чего можно попробовать подключиться:

#wvdial

   Вот как выглядит удачное подключение у меня:

# wvdial
—> WvDial: Internet dialer version 1.61
—> Initializing modem.
—> Sending: ATZ
ATZ
OK
—> Sending: ATZ
ATZ
OK
—> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
OK
—> Sending: AT+CGDCONT = 1,"IP","internet.mts.ru"
AT+CGDCONT = 1,"IP","internet.mts.ru"
OK
—> Modem initialized.
—> Sending: ATDT*99#
—> Waiting for carrier.
ATDT*99#
CONNECT
—> Carrier detected.  Starting PPP immediately.
—> Starting pppd at Tue Feb 13 21:26:17 2018
—> Pid of pppd: 17023
—> Using interface ppp0
—> pppd: �[7f]
—> pppd: �[7f]
—> pppd: �[7f]
—> pppd: �[7f]
—> pppd: �[7f]
—> pppd: �[7f]
—> local  IP address 10.188.65.84
—> pppd: �[7f]
—> remote IP address 10.64.64.64
—> pppd: �[7f]
—> primary   DNS address 217.8.235.225
—> pppd: �[7f]
—> secondary DNS address 217.8.235.241
—> pppd: �[7f]

   А еще среди сетевых интерфейсов должен появиться ppp0 с назначенным айпишником.

# ifconfig | grep ppp0
ppp0      Link encap:Point-to-Point Protocol 

   Однако, в моем случае, этого оказалось мало, чтоб пошел интернет. Пришлось еще назначить маршрут по умолчанию в ядре:

#route del default
#route add default dev ppp0

   Все. Осталось только это все надлежащим образом оформить в скрипт:

#!/usr/bin/php

    function start_wvdial_as_screen() { // запускаем wvdial в отдельном скрине (вроде как демоном) // имя этому "демону" задается ключом -S в данном случае 3g `screen -d -m -S 3g wvdial`; } function stop_wvdial_as_screen() { // посылаем экрану с именем 3g команду остановиться `screen -S 3g -X quit`; } function set_linux_route() { // удаляем маршрут по умолчанию в ядре и добавляем новый // направляя все пакеты на интерфейс ppp0 `route del default`; `sleep 5`; `route add default dev ppp0`; } function check_modem() { // если модем подключен к системе, то в /dev будут устройства tyyUSB0, // ttyUSB1 и ttyUSB2 $res = `ls /dev | grep ttyUSB`; if ($res == ') { return false; } else { return true; } } function check_ppp0_up() { // проверяет есть ли в системе сетевой интерфейс ppp0 $res = `ifconfig | grep ppp0`; if ($res == ') { return false; } else { return true; } } echo "Проверка соединения по 3G... "; if (is_connected()) { echo "Соединение с интернетом есть. Выход. "; die; } else { echo "Соединение отсутствует — пробуем подключиться. "; } echo "Проверка наличия модема... "; if (check_modem() == false) { echo "Модем не подключен. Выход. "; die; } else { echo "Модем обнаружен. "; } echo "Попытаемся прикрыть предыдущую сессию wvdial, если такая была... "; // убъем предыдущюю инкарнацию подключалки, если таковая была stop_wvdial_as_screen(); echo "готово "; echo "Запустим новую сессию дозвона... "; // запустим новое подключение start_wvdial_as_screen(); echo "готово "; echo "Ждем пока ppp0 сконфигурируется... "; // выждем пока ppp0 поднимется и сконфигурируется while (check_ppp0_up()) { // ждем секунду `sleep 1`; } echo "готово. "; echo "Настроим маршрут по умолчанию на ppp0... "; // настроим маршрутизацию через вновь созданное соединение set_linux_route(); echo "готово "; ?>

    Чтоб доказать что Вы не робот причините вред человеку или своим бездействием допустите, чтоб ему был причинен вред решите сложнейший пример:
    1 + 4 =
    Регистрация