Использование USB-3G-модемов | Русскоязычная документация по Ubuntu

mts huawei e Новости

At commands

There are some useful commands:

  • AT^U2DIAG=0 – the device is only Modem
  • AT^U2DIAG=1 – device is in modem mode CD ROM
  • AT^U2DIAG=255 – the device in modem mode CD ROM Card Reader
  • AT^U2DIAG=256 – the device in modem mode Card Reader
  • AT CPIN=PIN-CODE – enter PIN-code
  • AT CUSD=1,PDU-encoded-USSD-code,15 – USSD request, result can be found (probably) in /dev/ttyUSB2.

Encode *100# to PDU format:

$ perl -e '@a=split(//,unpack("b*","*100#")); for ($i=7; $i < $#a; $i =8) { $a[$i]="" } print uc(unpack("H*", pack("b*", join("", @a))))."n"'

Decode AA180C3602 from PDU format:

$ perl -e '@a=split(//,unpack("b*", pack("H*","AA180C3602"))); for ($i=6; $i < $#a; $i =7) {$a[$i].="0" } print pack("b*", join("", @a)).""'

Answer decoding (this example is balance response: 151.25):

$ perl -e 'print pack("H*", "003100350031002C003200350020044004430431002E0020");'

Some operators return USSD result in PDU encoding, so you should check proper decoding method.

  • AT CSQ – get signal quality (AT CSQ=?)
  • AT GMI – get manufacturer
  • AT GMM – get model
  • AT GMR – get revision
  • AT GMN – get IMEI
  • AT COPS? – get operator info
  • AT^CARDLOCK="NCK-code" – unlock modem. NCK-code should be calculated by IMEI. After that modem can work with any GSM-provider.
  • AT^SYSCFG=mode, order, band, roaming, domain – System Config

Mode:

  • 2 Automatic search
  • 13 2G ONLY
  • 14 3G ONLY
  • 16 No change

Order:

  • 0 Automatic search
  • 1 2G first, then 3G
  • 2 3G first, then 2G
  • 3 No change

Band:

  • 80 GSM DCS systems
  • 100 Extended GSM 900
  • 200 Primary GSM 900
  • 200000 GSM PCS
  • 400000 WCDMA IMT 2000
  • 3FFFFFFF Any band
  • 40000000 No change of band

Roaming:

  • 0 Not supported
  • 1 Roaming is supported
  • 2 No change

Domain:

  • 0 CS_ONLY
  • 1 PS_ONLY
  • 2 CS_PS
  • 3 ANY
  • 4 No change

Modem-manager with quectel ec21

I’m running Ubuntu Core on a Raspberry Pi Compute Module 3 (and IO board), and have a Quectel EC21 LTE modem connected to it via USB. I’m struggling to get it to work.

Following the guide on the Ubuntu Core docs site, I can see the modem show up:

<code>$ sudo modem-manager.mmcli -L

Found 1 modems:
    /org/freedesktop/ModemManager1/Modem/1 [Quectel] EC21
</code>

And I can see some good information about it:

<code>$ sudo modem-manager.mmcli -m 1

/org/freedesktop/ModemManager1/Modem/1 (device id 'a7dea8991786834fd4f5937baf2bae98f64e16dd')
  -------------------------
  Hardware |   manufacturer: 'Quectel'
           |          model: 'EC21'
           |       revision: 'EC21AUTFAR02A03M4G'
           |      supported: 'gsm-umts, lte'
           |        current: 'gsm-umts, lte'
           |   equipment id: '861108030174782'
  -------------------------
  System   |         device: '/sys/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2'
           |        drivers: 'option1'
           |         plugin: 'Generic'
           |   primary port: 'ttyUSB2'
           |          ports: 'ttyUSB0 (qcdm), ttyUSB2 (at), ttyUSB3 (at)'
  -------------------------
  Numbers  |           own : 'unknown'
  -------------------------
  Status   |           lock: 'none'
           | unlock retries: 'unknown'
           |          state: 'connected'
           |    power state: 'on'
           |    access tech: 'lte'
           | signal quality: '80' (recent)
  -------------------------
  Modes    |      supported: 'allowed: 2g, 3g, 4g; preferred: none'
           |        current: 'allowed: 2g, 3g, 4g; preferred: none'
  -------------------------
  Bands    |      supported: 'unknown'
           |        current: 'unknown'
  -------------------------
  IP       |      supported: 'ipv4, ipv6, ipv4v6'
  -------------------------
  3GPP     |           imei: '861108030174782'
           |  enabled locks: 'none'
           |    operator id: '50501'
           |  operator name: 'Telstra Mobile Telstra'
           |   subscription: 'unknown'
           |   registration: 'home'
  -------------------------
  SIM      |           path: '/org/freedesktop/ModemManager1/SIM/1'

  -------------------------
  Bearers  |          paths: '/org/freedesktop/ModemManager1/Bearer/0'
</code>

If I follow the rest of the guide, i.e.:

<code>$ sudo nmcli c add type gsm ifname ttyUSB2 con-name 4G apn telstra.internet
Connection '4G' (7640a17c-c7f4-40c7-9490-bfb0d22e28f1) successfully added.

$ sudo nmcli r wwan on
</code>

I seem to get an IP address:

<code>$ ip addr
4: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 3
    link/ppp 
    inet 10.98.27.23/32 brd 10.98.27.23 scope global ppp0
       valid_lft forever preferred_lft forever
</code>

This is the output of the logs:

<code>$ sudo journalctl --no-pager -u snap.network-manager.networkmanager.service

Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.0949] settings: Failed to add 7640a17c-c7f4-40c7-9490-bfb0d22e28f1/'4G': Plugin does not support adding connections
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.0984] keyfile: loading from file "/var/snap/network-manager/265/conf/system-connections/4G"...
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.0987] settings-connection[0x12b6590]: constructed (NMKeyfileConnection)
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1014] settings-connection[0x12b6590,7640a17c-c7f4-40c7-9490-bfb0d22e28f1]: replace settings from connection 0x754040c0 (4G)
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <info>  [1523928492.1049] keyfile: add connection /var/snap/network-manager/265/conf/system-connections/4G (7640a17c-c7f4-40c7-9490-bfb0d22e28f1,"4G")
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1055] settings-connection[0x12b6590,7640a17c-c7f4-40c7-9490-bfb0d22e28f1]: failed to read connection timestamp: Key file does not have key '7640a17c-c7f4-40c7-9490-bfb0d22e28f1' in group 'timestamps'
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1088]    connection 'new connection' (0x12b6590/NMKeyfileConnection): [/org/freedesktop/NetworkManager/Settings/2]
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1090]    connection                [ 0x12fd2a8 ]
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1091]    connection.id             = '4G'
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1092]    connection.interface-name = 'ttyUSB2'
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1093]    connection.permissions    = []
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1094]    connection.secondaries    = []
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1095]    connection.type           = 'gsm'
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1096]    connection.uuid           = '7640a17c-c7f4-40c7-9490-bfb0d22e28f1'
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1097]    gsm                       [ 0x1332b30 ]
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1098]    gsm.apn                   = 'telstra.internet'
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1099]    gsm.number                = '*99#'
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1100]    ipv4                      [ 0x1310bc8 ]
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1101]    ipv4.addresses            = ((GPtrArray*) 0x1303660)
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1102]    ipv4.dns                  = []
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1103]    ipv4.dns-search           = []
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1104]    ipv4.method               = 'auto'
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1105]    ipv4.routes               = ((GPtrArray*) 0x12f7fc8)
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1106]    ipv6                      [ 0x1310c90 ]
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1107]    ipv6.addresses            = ((GPtrArray*) 0x12f8180)
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1108]    ipv6.dns                  = []
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1109]    ipv6.dns-search           = []
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1110]    ipv6.method               = 'auto'
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1111]    ipv6.routes               = ((GPtrArray*) 0x12f7478)
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1127] create NMAuditManager singleton (0x75300d50)
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <info>  [1523928492.1129] audit: op="connection-add" uuid="7640a17c-c7f4-40c7-9490-bfb0d22e28f1" name="4G" pid=3186 uid=0 result="success"
Apr 17 01:28:12 localhost.localdomain NetworkManager[1489]: <debug> [1523928492.1168] Saving secrets for connection /org/freedesktop/NetworkManager/Settings/2 (4G)
Apr 17 01:28:28 localhost.localdomain NetworkManager[1489]: <debug> [1523928508.6772] manager: (WWAN): setting radio enabled by user
Apr 17 01:28:28 localhost.localdomain NetworkManager[1489]: <info>  [1523928508.6842] audit: op="radio-control" arg="wwan-enabled:1" pid=3201 uid=0 result="success"
</code>

But, if I do something like ping using the ppp interface, I get nothing:

<code>$ sudo ping -I ppp0 8.8.8.8
</code>

What do I need to do to get the WWAN interface working?

Mounting of smb shares

Some SMB shares are only available on certain networks or locations (e.g. at home). You can use the dispatcher to only mount SMB shares that are present at your current location.

The following script will check if we connected to a specific network and mount shares accordingly:

/etc/NetworkManager/dispatcher.d/30-mount-smb.sh
#!/bin/sh

# Find the connection UUID with "nmcli connection show" in terminal.
# All NetworkManager connection types are supported: wireless, VPN, wired...
if [ "$2" = "up" ]; then
  if [ "$CONNECTION_UUID" = "uuid" ]; then
    mount /your/mount/point & 
    # add more shares as needed
  fi
fi

The following script will unmount all SMB shares before a software initiated disconnect from a specific network:

/etc/NetworkManager/dispatcher.d/pre-down.d/30-umount-smb.sh
#!/bin/sh

if [ "$CONNECTION_UUID" = "uuid" ]; then
  umount -a -l -t cifs
fi

Note: Make sure this script is located in the pre-down.d sub-directory as shown above, otherwise it will unmount all shares on any connection state change.

The following script will attempt to unmount all SMB shares following an unexpected disconnect from a specific network:

/etc/NetworkManager/dispatcher.d/40-umount-smb.sh
#!/bin/sh

if [ "$CONNECTION_UUID" = "uuid" ]; then
  if [ "$2" = "down" ]; then
    umount -a -l -t cifs
  fi
fi

An alternative is to use the script as seen in NFS#Using a NetworkManager dispatcher:

/etc/NetworkManager/dispatcher.d/30-smb.sh
#!/bin/bash

# Find the connection UUID with "nmcli con show" in terminal.
# All NetworkManager connection types are supported: wireless, VPN, wired...
WANTED_CON_UUID="CHANGE-ME-NOW-9c7eff15-010a-4b1c-a786-9b4efa218ba9"

if [[ "$CONNECTION_UUID" == "$WANTED_CON_UUID" ]]; then
    
    # Script parameter $1: NetworkManager connection name, not used
    # Script parameter $2: dispatched event
    
    case "$2" in
        "up")
            mount -a -t cifs
            ;;
        "pre-down");&
        "vpn-pre-down")
            umount -l -a -t cifs >/dev/null
            ;;
    esac
fi

Note: This script ignores mounts with the noauto option, remove this mount option or use auto to allow the dispatcher to manage these mounts.

Create a symlink inside /etc/NetworkManager/dispatcher.d/pre-down/ to catch the pre-down events:

# ln -s ../30-smb.sh /etc/NetworkManager/dispatcher.d/pre-down.d/30-smb.sh

Use dispatcher to connect to a vpn after a network connection is established

/etc/NetworkManager/dispatcher.d/vpn-up
#!/bin/sh
VPN_NAME="name of VPN connection defined in NetworkManager"
ESSID="Wi-Fi network ESSID (not connection name)"

interface=$1 status=$2
case $status in
  up|vpn-down)
    if iwgetid | grep -qs ":"$ESSID""; then
      nmcli connection up id "$VPN_NAME"
    fi
    ;;
  down)
    if iwgetid | grep -qs ":"$ESSID""; then
      if nmcli connection show --active | grep "$VPN_NAME"; then
        nmcli connection down id "$VPN_NAME"
      fi
    fi
    ;;
esac

If you would like to attempt to automatically connect to VPN for all Wi-Fi networks, you can use the following definition of the ESSID: ESSID=$(iwgetid -r). Remember to set the script’s permissions accordingly.

Trying to connect with the above script may still fail with NetworkManager-dispatcher.service complaining about ‘no valid VPN secrets’, because of the way VPN secrets are stored. Fortunately, there are different options to give the above script access to your VPN password.

1: One of them requires editing the VPN connection configuration file to make NetworkManager store the secrets by itself rather than inside a keyring that will be inaccessible for root: open up /etc/NetworkManager/system-connections/name of your VPN connection and change the password-flags and secret-flags from 1 to 0.

If that alone does not work, you may have to create a passwd-file in a safe location with the same permissions and ownership as the dispatcher script, containing the following:

/path/to/passwd-file
vpn.secrets.password:YOUR_PASSWORD

The script must be changed accordingly, so that it gets the password from the file:

/etc/NetworkManager/dispatcher.d/vpn-up
#!/bin/sh
VPN_NAME="name of VPN connection defined in NetworkManager"
ESSID="Wi-Fi network ESSID (not connection name)"

interface=$1 status=$2
case $status in
  up|vpn-down)
    if iwgetid | grep -qs ":"$ESSID""; then
      nmcli connection up id "$VPN_NAME" passwd-file /path/to/passwd-file
    fi
    ;;
  down)
    if iwgetid | grep -qs ":"$ESSID""; then
      if nmcli connection show --active | grep "$VPN_NAME"; then
        nmcli connection down id "$VPN_NAME"
      fi
    fi
    ;;
esac

2: Alternatively, change the password-flags and put the password directly in the configuration file adding the section vpn-secrets:

 [vpn]
 ....
 password-flags=0
 
 [vpn-secrets]
 password=<span>your_password</span>

Note: It may now be necessary to re-open the NetworkManager connection editor and save the VPN passwords/secrets again.

Как подключить 3g usb модем (мегафон, мтс, билайн) в ubuntu linux 12.04

В этой статье будет рассмотрена настройка и подключение 3G USB модема
(МТС, Мегафон) в Ubuntu 12.04. Это предельно
простая инструкция как подключить сотовый 3G модем в графической среде
Unity, с использованием интерфейса
Network Manager. Инструкция применима не только к
Ubuntu установленной на жесткий диск, но и к
Live варианту запускаемому с
USB флешки или с лазерного диска.

В Linux, в графических оболочках
Gnome, KDE, XFCE, Unity в качестве графического
интерфейса для настройки сетевых подключений используется программа Network Manager. Точнее Network
Manager обеспечивает plug and play работу с
физическими сетевыми устройствами, а графический интерфейс этой программы
называется Network Manager
Applet (nm-applet). Network Manager
Applet отображается в виде значка в системном трее
и если на этом значке кликнуть мышью откроется меню с функциями программы:

Ubuntu — запускаем 3G модем в консоли | Мой блог (Дмитрий Харций)

Для подключения 3G USB модема нужно воткнуть модем в USB разъем
компьютера и через 1-2 минуты (необходимо некоторое время на то, чтобы модем
был опознан системой и подключен) кликнуть на значке «Сеть» в трее и выбрать
пункт меню «Edit connections» (иллюстрация
выше). В результате откроется окно, в котором
нужно выбрать вкладку «Mobile broadband»
и там нажать кнопку «Add»:

Ubuntu — запускаем 3G модем в консоли | Мой блог (Дмитрий Харций)

Запустится мастер настройки соединения, в первом окне нажать кнопку
«Continue»:

Ubuntu — запускаем 3G модем в консоли | Мой блог (Дмитрий Харций)

Примечание.

Если вкладка «Широкополосный доступ (Mobile
broadband)» недоступна или в первом окне
настройки не определена модель модема, тогда:

нужно добавить новую строку в файле /lib/udev/rules.d/40-usb_modeswitch.rules
в которой прописать vid и pid вашего модема. Эти данные вы можете
узнать через консоль командой lsusb.

Во втором окне выбрать страну и нажать кнопку
«Continue»:

Ubuntu — запускаем 3G модем в консоли | Мой блог (Дмитрий Харций)

В следующем окне выбрать оператора и нажать кнопку
«Continue»:

Ubuntu — запускаем 3G модем в консоли | Мой блог (Дмитрий Харций)

В следующем окне нажать кнопку «Continue»:

Ubuntu — запускаем 3G модем в консоли | Мой блог (Дмитрий Харций)

В следующем окне нажать кнопку «Apply»:

Ubuntu — запускаем 3G модем в консоли | Мой блог (Дмитрий Харций)

В следующем окне нажать кнопку «Save»:

Ubuntu — запускаем 3G модем в консоли | Мой блог (Дмитрий Харций)

В этом окне можно отключить опцию «Allow roaming …»
(роуминг) и включить опцию «Connect automatically».

Готово. Теперь, для того чтобы подключиться к Интернет достаточно
кликнуть на значке «Сеть» и в меню выбрать название созданного соединения:

Ubuntu — запускаем 3G модем в консоли | Мой блог (Дмитрий Харций)

И через несколько секунд соединение будет установлено:

Ubuntu — запускаем 3G модем в консоли | Мой блог (Дмитрий Харций)

Можно сделать так, чтобы соединение устанавливалось автоматически, как
только модем будет воткнут в USB разъем. Для этого
необходимо открыть окно соединений, выбрать вкладку «Mobile
broadband» и там нажать кнопку «Edit»
затем отметить опцию «Connect automatically»
и нажать кнопку «Save»:

Ubuntu — запускаем 3G модем в консоли | Мой блог (Дмитрий Харций)

P.S.

По моим длительным наблюдениям в Ubuntu
«сотовый» Интернет работает немного быстрее чем в Windows.
Бывает даже и такое, что в Windows соединения
вообще нет (оно устанавливается но не работает), а в
Ubuntu все нормально.

Если у вас возникли проблемы с подключением читайте другую статью —
установка и настройка 3G USB модема на Ubuntu
Linux
, в ней более подробно описан процесс установки и настройки.

Иван Сухов, 2021 г.

Настройка 3g-модема в linux • – huawei devices

Настройка 3G-модема в Linux •Продолжение. Начало здесь.

Для тех, кто недавно присоединился к радиоканалу «Боян-FM» читателям моей уютненькой™, напомню, что затеял всё это ради того, чтобы построить достаточно скоростной IPSec-канал через «Йоту». А для этого, в свою очередь, необходимо получить прямой «честный» IP с SIM-карты на каком-либо сетевом интерфейсе, притом минуя PPP.

Конкретно я использую модем iRZ TL21, построенный на базе модуля Sierra (он же AirPrime) MC7710, в составе которого находится чип Qualcomm MDM9200. Система — стабильный дистрибутив Debian (в данном случае Wheezy).

Сразу оговорюсь, что в какой-нибудь свежей Ubuntu данный модем заработает прям «из коробки»: его хорошо понимает NetworkManager. Но мы ж реальные пацаны, у нас реальный сервак, GUI на нём нетути. Да и подниматься линк должен сам по себе при старте системы. Поэтому пойти по простому пути не получится, придётся никакой механизма всё вручную.

Итак, суём модем в USB-порт, заправшиваем «lsusb» и видим…

Bus 006 Device 002: ID 03f0:1027 Hewlett-Packard Virtual keyboard and mouse
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 003: ID 1199:68a2 Sierra Wireless, Inc. MC7710 Modem
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Ага, третья строчка — вот оно как раз самое. Выделенные жирным шрифтом цифирки нам потом ещё пригодятся. Ну что-ж, вроде как всё хорошо. Смотрим «ls /dev/ttyUSB*» и видим… а ничего мы не видим. Как говорится, «***в панама». Нету псевдотерминалов.

Иногда затык может заключаться в том, что некоторые модемы «тянут» за собой виртуальный CD-ROM, на котором типа лежат типа драйвера для этого модема. И пока не пнёшь этот модем правильной AT-командой, собственно в модем он не превратится. А будет и дальше себе с настойчивостью кретина прикидываться CD-приводом. Ну это лечится элементарной установкой пакета «usb-modeswitch»: «apt-get install usb-modeswitch«.

Ладно, установили. Но псевдотерминалы всё равно не появились. Чешем репу. И вспоминаем, что в Debian-е по умолчанию идёт довольно боянистый софт, и нужных драйверов «из коробки» нет. Чтобы не париться уж слишком сильно, можно тупо поставить свежее ядрышко из backports. На момент написания этого псто оно было версии 3.16:

Перезагрузились. Смотрим «modinfo qmi_wwan» и «modinfo sierra_net«. Если выделенные жирным циферки из выхлопа lsusb (см. выше) оказались в одном из двух списков, то всё пучком. Можем продолжать. Если же нет, увы. Идем искать драйвера к нашему «мопеду». Хорошо если найдём. А если не найдем — значит «упс». В моём случае всё ништяк:

Внезапно, и псевдотерминалы появились в большом количестве:

Дальше тыкаем каким-нибудь minicom-ом в каждый терминал по очереди («minicom -D /dev/ttyUSB0«, «minicom -D /dev/ttyUSB1» и т.п.) и смотрим который из них откликнется на какой нибудь «AT!GSTATUS?«, тот и есть нужный нам. Заодно проверим, что модем сцепился с сотовой сетью.

RSSI (dBm): -75 Tx Power: 0
RSRP (dBm): -103 TAC: 26BD (9917)
RSRQ (dB): -9 Cell ID: 0F30DB00 (254860032)
SINR (dB): 7.2

OK

Вроде работает. Тут наступает небольшая засада. В дальнейшем нам придётся из различных скриптов ссылаться на найденный псевдотерминал. Но никто не может гарантировать нам, что после очередной перезагрузки сервера имя устройства останется таким же. Поэтому придётся помучать udev для того чтобы создать символическую ссылку (symlink), дабы увековечить нашу бесценную находку. Для начала смотрим к каким атрибутам мы могли бы привязаться.

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

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

looking at device ‘/devices/pci0000:00/0000:00:1d.7/usb4/4-5/4-5:1.3/ttyUSB3/tty/ttyUSB3’:
KERNEL==»ttyUSB3″
SUBSYSTEM==»tty»
DRIVER==»»

looking at parent device ‘/devices/pci0000:00/0000:00:1d.7/usb4/4-5/4-5:1.3/ttyUSB3’:
KERNELS==»ttyUSB3″
SUBSYSTEMS==»usb-serial»
DRIVERS==»sierra»
ATTRS{port_number}==»0″

looking at parent device ‘/devices/pci0000:00/0000:00:1d.7/usb4/4-5/4-5:1.3’:
KERNELS==»4-5:1.3″
SUBSYSTEMS==»usb»
DRIVERS==»qcserial»
ATTRS{bInterfaceClass}==»ff»
ATTRS{bInterfaceSubClass}==»ff»
ATTRS{bInterfaceProtocol}==»ff»
ATTRS{bNumEndpoints}==»03″
ATTRS{supports_autosuspend}==»1″
ATTRS{bAlternateSetting}==» 0″
ATTRS{bInterfaceNumber}==»03″

looking at parent device ‘/devices/pci0000:00/0000:00:1d.7/usb4/4-5’:
KERNELS==»4-5″
SUBSYSTEMS==»usb»
DRIVERS==»usb»
ATTRS{bDeviceSubClass}==»00″
ATTRS{bDeviceProtocol}==»00″
ATTRS{devpath}==»5″
ATTRS{idVendor}==»1199″
ATTRS{speed}==»480″
ATTRS{bNumInterfaces}==» 6″
ATTRS{bConfigurationValue}==»1″
ATTRS{bMaxPacketSize0}==»64″
ATTRS{busnum}==»4″
ATTRS{devnum}==»3″
ATTRS{configuration}==»Sierra Configuration»
ATTRS{bMaxPower}==»0mA»
ATTRS{authorized}==»1″
ATTRS{bmAttributes}==»e0″
ATTRS{bNumConfigurations}==»1″
ATTRS{maxchild}==»0″
ATTRS{bcdDevice}==»0006″
ATTRS{avoid_reset_quirk}==»0″
ATTRS{quirks}==»0x0″
ATTRS{serial}==»358178041352404″
ATTRS{version}==» 2.00″
ATTRS{urbnum}==»895″
ATTRS{ltm_capable}==»no»
ATTRS{manufacturer}==»Sierra Wireless, Incorporated»
ATTRS{removable}==»unknown»
ATTRS{idProduct}==»68a3″
ATTRS{bDeviceClass}==»00″
ATTRS{product}==»MC7710″

looking at parent device ‘/devices/pci0000:00/0000:00:1d.7/usb4’:
KERNELS==»usb4″
SUBSYSTEMS==»usb»
DRIVERS==»usb»
ATTRS{bDeviceSubClass}==»00″
ATTRS{bDeviceProtocol}==»00″
ATTRS{devpath}==»0″
ATTRS{idVendor}==»1d6b»
ATTRS{speed}==»480″
ATTRS{bNumInterfaces}==» 1″
ATTRS{bConfigurationValue}==»1″
ATTRS{bMaxPacketSize0}==»64″
ATTRS{authorized_default}==»1″
ATTRS{busnum}==»4″
ATTRS{devnum}==»1″
ATTRS{configuration}==»»
ATTRS{bMaxPower}==»0mA»
ATTRS{authorized}==»1″
ATTRS{bmAttributes}==»e0″
ATTRS{bNumConfigurations}==»1″
ATTRS{maxchild}==»8″
ATTRS{bcdDevice}==»0316″
ATTRS{avoid_reset_quirk}==»0″
ATTRS{quirks}==»0x0″
ATTRS{serial}==»0000:00:1d.7″
ATTRS{version}==» 2.00″
ATTRS{urbnum}==»61″
ATTRS{ltm_capable}==»no»
ATTRS{manufacturer}==»Linux 3.16.0-0.bpo.4-amd64 ehci_hcd»
ATTRS{removable}==»unknown»
ATTRS{idProduct}==»0002″
ATTRS{bDeviceClass}==»09″
ATTRS{product}==»EHCI Host Controller»

looking at parent device ‘/devices/pci0000:00/0000:00:1d.7’:
KERNELS==»0000:00:1d.7″
SUBSYSTEMS==»pci»
DRIVERS==»ehci-pci»
ATTRS{irq}==»16″
ATTRS{subsystem_vendor}==»0x103c»
ATTRS{broken_parity_status}==»0″
ATTRS{class}==»0x0c0320″
ATTRS{companion}==»»
ATTRS{driver_override}==»(null)»
ATTRS{consistent_dma_mask_bits}==»32″
ATTRS{dma_mask_bits}==»32″
ATTRS{local_cpus}==»00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,0000000f»
ATTRS{device}==»0x268c»
ATTRS{uframe_periodic_max}==»100″
ATTRS{enable}==»1″
ATTRS{msi_bus}==»»
ATTRS{local_cpulist}==»0-3″
ATTRS{vendor}==»0x8086″
ATTRS{subsystem_device}==»0x31fe»
ATTRS{numa_node}==»-1″
ATTRS{d3cold_allowed}==»1″

looking at parent device ‘/devices/pci0000:00’:
KERNELS==»pci0000:00″
SUBSYSTEMS==»»
DRIVERS==»»

Смотрим к каким атрибутам оборудования мы можем «привязаться». Однозначно придётся использовать критерий SUBSYSTEM==»tty» из первой секции, иначе получится ерунда. Но этого мало. Нужно что-то ещё. Большой соблазн взять ATTRS{product}==»MC7710″, чтобы однозначно идентифицировать устройство, но… тогда мы не сможем указать номер интерфейса. Ибо udev позволяет брать параметры устройства и только одного родителя. Поэтому придётся довольствоваться ATTRS{bInterfaceNumber}==»03″ и DRIVERS==»qcserial» из третьей секции. Итоговое правило будет выглядеть так:

Записываем его куда-нибудь в «/etc/udev/rules.d/80-LTE.rules», после чего заклинаем «udevadm control —reload-rules«, «udevadm trigger«. Первое нужно, чтобы udev перечитал список правил, второе — чтобы не топать ногами в серверную и не «перевтыкать» руками модем.

Итак, у нас появилась символическая ссылка «/dev/LTE-control». Что же с ней делать дальше? А дальше надо указать модему APN и логин-пароль, если есть. Но каждый раз мы это делать руками, понятно, не будем. Поэтому имеет смысл либо написать скрипт, либо запихнуть вызов соответствующих команд прямо в «/etc/network/interfaces». У меня получилось что-то типа того.

В директиве «pre-up» описываем действия до поднятия интерфейса: указать название APN, немного подождать, запустить пакетный драйвер QMI (или как он там правильно называется). То есть софтинку, которая разбирает-собирает поток данных и контрольный канал. С этого момента всё должно заработать. Если не взлетит, то вдумчиво раскуривать мануалы по модему, искать там диагностические AT-команды и пытаться разобраться что же пошло не так. После опускания интерфейса останавливаем QMI-драйвер.

Вроде бы на этом можно и успокоиться. Но я же ж извращенец, мне этого мало. Я хочу не просто подключить модем к серваку, а стать владычицей морскою «закинуть» его вовнутрь QEMU/KVM-виртуалки. В принципе, можно потанцевать с бубном и попробовать сделать это «прям щас». Но мой модем помимо режима QMI умеет ещё Direct IP, при котором не надо запускать никакого QMI-драйвера. Поэтому я пошёл дальше.

Сперва попросил уважаемого Настройка 3G-модема в Linux •rustedowl разобраться как именно переключить модем в другой режим. Сложность там в том, что у данного устройства есть два разных набора AT-команд. Один лоховский универсальный, который является стандартным для любых UMTS-устройств. А второй — пацанский расширенный, для того чтобы можно было трогать модем за яйца крутить всякие хитрые инженерные параметры. Спустя какое-то время поспели вот такие заклинания:

Где набор символов «A710» является… паролем. Дабы всякие ничтоже сумнящиеся не совали свои шаловливые ручки куда не просят. И что сцуко характерно, энтот пароль в официальной документации к хитропопому прибору напрочь отсутствует. Он был найден на бескрайних просторах интернета и подходит к большинству модемов от данного производителя (Sierra Wireless). Параметр второй команды — собственно режим. «68A2» — это QMI, «68A3» — Direct IP. Данные значения актуальны только для данной модели (MC7710). Но в любом случае будет очень кстати лишний раз свериться с документацией чтобы не напортачить, поскольку операция смены PID является весьма щекотливой и может привести к самым разным последствиям. Третья команда перезагружает мопед.

После перезагрузки супостат перекрашивается яки киллер из GTA2. Он теперь в lsusb виден как «Bus 004 Device 003: ID 1199:68a3 Sierra Wireless, Inc. MC8700 Modem». Обратите внимание, что поменялся ID оборудования и даже название модели. Раньше он представлялся как MC7710, а теперь внезапно стал MC8700. И драйвер теперь к нему подключился другой:

Также увеличилось количество псевдотерминалов ажно до пяти штук. И несколько изменился набор допустимых AT-команд.

Дальше всё «как обычно». Находим среди этой пачки «телетайпов» контрольный канал, фиксируем его udev-ом. Точно так же, как и в предыдущем случае, указываем точку доступа («AT CGDCONT=1,»IP»,»yota.ru»»). А вот процесс «дозвона» намного проще: «at!scact=1,1». Где последняя циферка является номером профиля, указанного в «CGDCONT». То есть, внутри модема можно создать несколько разных профилей с разными точками доступа и переключаться между ними. Теоретически это может пригодиться если нужно время от времени использовать то «честный» IP от оператора, то «серый», которые раздаются разными APN. Практически я не знаю случаев, когда такое может реально понадобиться.

Проверить, что «всё хорошо» можно командой «at!scpaddr=1», где цифра означает номер пресловутого «профиля». В ответ модем должен откликнуться полученным от оператора IP-адресом.

Но самой главной «плюшкой» режима Direct IP является то, что конкретно Sierr-овские модемы можно настроить на «автодозвон». Для этого нужно установить профиль по умолчанию: «at!scdftprof=1» и включить автодозвон в этом профиле: «at!scprof=1,»»,1,0,0,0«. Теперь после перезагрузки сервера либо отключения-включения питания модема он будет устанавливать линк автоматически. Аллилуйя!

IP-шник на системный интерфейс прилетает как обычно, по DHCP. Однако wwan0 — это всё-таки не ethernet. Попытки объединить его в bridge с другими системными интерфейсами («brctl addif br0 wwan0«) не увенчались успехом. Для того, чтобы получить беспроводной LTE-линк с честным IP-адресом внутри виртуальной машины, пришлось ещё немного поизгаляться. Как — напишу в третьей части, если когда-нибудь дойдут руки.

Какой вывод можно сделать из вышеописанных половых сношений с модемом умозаключений? Sierra Wireless делает вполне годные железки, которые довольно неплохо поддерживаются Linux-ом. Даже таким консервативным, как Debian. Собратьям по несчастью разуму могу порекомендовать брать устройства, которые понимает драйвер «sierra_net», ибо при прочих равных секса с ними будет меньше. К сожалению, таковых не так уж и много. Пока что их можно пересчитать по пальцам одной руки. Если кто будет выбирать, вот вам их VID-PID: «0f3d:68a3», «0f3d:68aa», «1199:68a3», «1199:68aa». Однако имейте в виду, что VID-PID также зависит и от режима работы и может изменяться в результате переключения последнего.

Подключиться к модему для ввода at команд

Для подключения к COM портам предназначена программа minicom. В RHEL / CentOS установить её можно следующей командой:yum install minicom

Подробно о том, как пользоваться программой minicom, Вы можете прочитать в интернете. Здесь приводится только краткая инструкция по проверке работы 3g модема. Выполните ее строго по порядку:

  1. Запустите команду:
    minicom -s
  2. Выберите пункт “Serial port setup” (“Настройка последовательного порта”)
  3. Нажмите “A” для выбора имени устройства COM порта
  4. Введите название устройства: /dev/ttyUSB…
  5. Нажмите Enter 2 раза
  6. Выберите пункт “Save setup as ..” (“Сохранить настройки как”)
  7. Введите название профиля, например:
    3g
  8. Дождитесь сохранения профиля и выберите пункт “Exit from minicom” (Выход из minicom)
  9. Теперь запустите из командной строки:
    minicom имя-профиля
    например:
    minicom 3g
  10. Если программа “вылетит” с ошибкой, значит проблема в драйвере (либо драйвере модема, либо драйвере COM порта – usbserial, и т.д.). Далее мы предполагаем, что программа открылась нормально, и отобразила пустое (или непустое) окошко.
  11. Введите команду:
    ATI
    После чего нажмите Enter. Обратите внимание: символы, которые Вы вводите, могут не отображаться на экране! Однако, после ввода команды и нажатия Enter, модем должен отобразить результат (подробнее о команде и её результатах см. Приложение 1 “AT команды для 3g модемов“).
  12. Выполните нужные Вам AT команды для модема.
  13. Для выхода в меню программы нажмите Ctrl A, затем Z
  14. Для выхода из программы (находясь в меню) нажмите Q и подтвердите выход нажатием Enter.
  15. Если программа не выдает никакой информации (или выдает абракадабру) в ответ на AT команды, значит неверно указано имя устройства, на котором находится часть 3G модема, принимающая AT-команды. Попробуйте другое имя (обычно это ttyUSBx, где x – цифра от 0 до 2).

Вы читаете статью “3G модем asterisk”, состоящую из нескольких частей:

  1. 3G модем asterisk. Часть 1: Подключение модема к компьютеру и перевод из режима “составное устройство” в режим “только модем”.
  2. 3G модем asterisk. Часть 2: Настройка chan_dongle и asterisk.
  3. 3G модем asterisk. Часть 3: Настройки chan_dongle – проблемы и решения.
  4. 3G модем asterisk. Приложение 1: AT команды для 3G модемов.
  5. 3G модем asterisk. Приложение 2: Работа с 3G модемами в Windows.
  6. 3G модем asterisk. Приложение 3: Работа с 3G модемами в Linux.

Регистрация модемов в системе ubuntu


Корректно подключенный модем (например, F3607gw со вставленной SIM-картой) отображается в системе следующим образом:

# lsusb

Для модема F3607gwBus 001 Device 002: ID 0930:130c Toshiba Corp. F3607gw Mobile Broadband Module

Для модема E1550Bus 001 Device 005: ID 12d1:1001 Huawei Technologies Co., Ltd. E169/E620/E800 HSDPA Modem

Для модема E171

Bus 001 Device 006: ID 12d1:1001 Huawei Technologies Co., Ltd. E169/E620/E800 HSDPA Modem

Вывод сообщений ядра.

# dmesg

Для модема Huawei E1550

[ 8792.027386] usb 1-1.5: New USB device found, idVendor=12d1, idProduct=1001[ 8792.027392] usb 1-1.5: New USB device strings: Mfr=2, Product=1, SerialNumber=0[ 8792.027395] usb 1-1.5: Product: HUAWEI Mobile[ 8792.

027397] usb 1-1.5: Manufacturer: HUAWEI Technology[ 8792.032452] usb-storage 1-1.5:1.0: USB Mass Storage device detected[ 8792.032593] option 1-1.5:1.0: GSM modem (1-port) converter detected[ 8792.032731] usb 1-1.5:

GSM modem (1-port) converter now attached to ttyUSB0[ 8792.032787] usb-storage 1-1.5:1.1: USB Mass Storage device detected[ 8792.033032] option 1-1.5:1.1: GSM modem (1-port) converter detected[ 8792.

033148] usb 1-1.5: GSM modem (1-port) converter now attached to ttyUSB1[ 8792.033185] usb-storage 1-1.5:1.2: USB Mass Storage device detected[ 8792.033427] option 1-1.5:1.2: GSM modem (1-port) converter detected[ 8792.

033477] usb 1-1.5: GSM modem (1-port) converter now attached to ttyUSB2[ 8792.033510] usb-storage 1-1.5:1.3: USB Mass Storage device detected[ 8792.034564] scsi25 : usb-storage 1-1.5:1.3[ 8792.034696] usb-storage 1-1.5:1.4:

USB Mass Storage device detected[ 8792.035550] scsi26 : usb-storage 1-1.5:1.4[ 8793.035728] scsi 25:0:0:0: CD-ROM            HUAWEI   Mass Storage     2.31 PQ: 0 ANSI: 2[ 8793.038573] scsi 26:0:0:0:

Direct-Access     HUAWEI   MMC Storage      2.31 PQ: 0 ANSI: 2[ 8793.047079] sr0: scsi-1 drive[ 8793.047183] sr 25:0:0:0: Attached scsi CD-ROM sr0[ 8793.047240] sr 25:0:0:0: Attached scsi generic sg3 type 5[ 8793.048641] sd 26:0:0:0: Attached scsi generic sg4 type 0[ 8793.058444] sd 26:0:0:0: [sdd] Attached SCSI removable disk

Для модема Huawei E171

[ 8340.864006] usb 1-1.5: new high-speed USB device number 6 using ehci-pci[ 8340.958541] usb 1-1.5: New USB device found, idVendor=12d1, idProduct=1001[ 8340.958546] usb 1-1.5: New USB device strings: Mfr=3, Product=2, SerialNumber=0[ 8340.

958548] usb 1-1.5: Product: HUAWEI Mobile[ 8340.958560] usb 1-1.5: Manufacturer: HUAWEI Technology[ 8340.960056] usb-storage 1-1.5:1.0: USB Mass Storage device detected[ 8340.960155] option 1-1.5:1.0:

GSM modem (1-port) converter detected[ 8340.960265] usb 1-1.5: GSM modem (1-port) converter now attached to ttyUSB0[ 8340.960337] usb-storage 1-1.5:1.1: USB Mass Storage device detected[ 8340.960380] option 1-1.5:1.1:

GSM modem (1-port) converter detected[ 8340.960442] usb 1-1.5: GSM modem (1-port) converter now attached to ttyUSB1[ 8340.960504] usb-storage 1-1.5:1.2: USB Mass Storage device detected[ 8340.960550] option 1-1.5:1.2:

Примечание: этот модем был переключен в состояние только модем, поэтому storage не видно.

Переключение модемов Huawei E1550, E171 в режим только модема

Ubuntu Desktop содержит программу usb_modeswitch, которая выполняет автоматическое переключение модема, но каждый раз при подключении.

Для переключение этого конкретного модема Huawei E1550 в режим только модема, под Linux, надо сделать следующее:1. Подключиться к третьему порту (/dev/ttyUSB2) со скоростью 9600N1.2. Отправить команду AT^U2DIAG=0 либо AT^U2DIAG=256 (с флешкой).

Переименовывание модема

Т.к. подключенный к разъёму mini-pcie модем, является системным (несъёмным), то можно освободить автоматические имена и сформировать свои собственные в ветке /dev.Например:/dev/modem3g/dev/modem3g-control/dev/modem3g-control2Для этого используется правила udev.Пока не делал.

Удаленный мониторинг и управление устройств на базе linux/openwrt/lede через 80-ый порт…

Всем привет, это мой первый опыт на Хабре. Хочу написать о том, как нестандартно управлять сетевым оборудованием во внешней сети. Что значит нестандартно: в большинстве случаев, для управления оборудованием во внешней сети Вам необходимо:

Поэтому «мой велосипед» потребуется Вам, когда стандартные методы Вам не подходят, например:

  1. Оборудование находится за NAT-ом и кроме обычного http (80-го порта) — все закрыто. Вполне нормальная ситуация для крупных федеральных корпоративных сетей. Прописать порты — могут, но не сразу, не быстро и не Вам.
  2. Нестабильный и/или «узкий» канал связи. Маленькая скорость, постоянные потери. Боль и разочарование при попытке организовать туннель.
  3. Дорогой канал связи, где буквально каждый мегабайт на счету. Например спутниковая связь. Плюс большие задержки и «узкая» полоса.
  4. Ситуация, когда Вам надо «жонглировать» большим количеством маленьких роутеров, на которых с одной стороны установлена OpenWrt/Lede для расширения возможностей, а с другой стороны ресурсов (памяти) роутера хватает далеко не на все.

Итак, я постарался описать Вам мою типовую ситуацию: «где-то далеко-далеко, стоит очень важный, одинокий и маленький роутер под управлением Linux. Важно знать хотя бы раз в день, что он „жив“ и при необходимости отсылась ему команды, например „солнышко, перезагрузись!“

Перейдем к реализации:

1) На стороне роутера по cron-у каждые 5/10/1440 минут, или когда угодно необходимо отсылать http-запрос на сервер с помощью wget, результат запроса сохранять в файл, файл делать исполняемым, и исполнять его.

У меня строчка в cron-е выглядит примерно так:

Файл /etc/crontabs/root:

  */5 * * * * wget "http://xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai/a.php?u=user&p=password" -O /tmp/wa.sh && chmod 777 /tmp/wa.sh && /tmp/wa.sh

, где:

xn--80abgfbdwanb2akugdrd3a2e5gsbj.xn--p1ai — домен моего сервера. Сразу замечу: да, можно указать и конкретный ip-адрес сервера, мы так раньше делали, пока наше государство, в праведном порыве борьбы нескажусчемнезнаю — не закрыло доступ к львиной доле „облаков“ DigitalOcean и Amazon. В случае использования символьного домена, при возникновении подобного казуса, вы спокойно сможете поднять резервное облако, перенаправить на него домен и восстановить мониторинг устройств.

a.php — имя скрипта на стороне сервера. Да, я знаю, что это неправильно, называть переменные и имена файлов одной буквой… предлагаю считать, что так мы экономим несколько байт при отправке запроса 🙂
u — имя пользователя, логин железки
p — пароль
„-O /tmp/wa.sh“ — файл на удаленном роутере, куда будет сохранятся ответ сервера, например команда reboot.

2) На стороне сервера (у меня это Ubuntu) мы будем использовать Zabbix. Почему: хочу чтобы было красиво (с графиками) и удобно (отправлять команды через контекстное меню). У Заббикса есть такая прелестная вещь, как zabbix-агент. Через агента мы будем вызывать php-скрипт на сервере, который будет возвращать информацию о том, регистрировался ли наш роутер в требуемый период времени. Для хранения информации о времени регистрации, командах для устройств, я использую MySQL, отдельную таблицу users примерно с такими полями:

		CREATE TABLE `users` (
		  `id` varchar(25) NOT NULL,
		  `passwd` varchar(25) NOT NULL,
		  `description` varchar(150) NOT NULL,
		  `category` varchar(30) NOT NULL,
		  `status` varchar(10) NOT NULL,
		  `last_time` varchar(20) NOT NULL, // время последнего соединения
		  `last_ip` varchar(20) NOT NULL, // IP последнего соединения 
		  `last_port` int(11) NOT NULL, // порт последнего соединения
		  `task` text NOT NULL, // задача которую получает роутер
		  `reg_task` varchar(150) NOT NULL, // "регулярная" задача, если мы захотим чтобы задача выполнялась всегда при регистрации
		  `last_task` text NOT NULL, // лог задач
		  `response` text NOT NULL, // сюда пишется ответ устройства
		  `seq` int(11) NOT NULL
		) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Все исходники можно забрать с Git-репозитория, по адресу:

https://github.com/BazDen/iotnet.online.git

Теперь PHP-скрипты, размещаемые на стороне сервера(для удобства их можно положить в папку /usr/share/zabbix/):

Файл a.php:

<?php
// Получаем входные параметры: имя пользователя, пароль и сообщение от удаленного роутера
// Зачем нужен message ? Это способ ответа роутера, например если вы захотите посмотреть содержимое файла роутера
	$user=$_REQUEST['u'];
	$password=$_REQUEST['p'];
	$message=$_REQUEST['m'];
	
	// Подключаемся к нашей базе данных (MySQL)
	$conn=new mysqli("localhost","db_login","db_password","DB_name");
	if (mysqli_connect_errno()) {
		exit();
	}
	$conn->set_charset("utf8");
	// здесь ищем наш роутер в таблице базы данных
	$sql_users=$conn->prepare("SELECT task, reg_task, response, last_time FROM users WHERE id=? AND passwd=? AND status='active';");
	$sql_users->bind_param('ss', $user, $password);
	$sql_users->bind_result($task, $reg_task, $response, $last_time);
	$sql_users->execute();
	$sql_users->store_result();
	if (($sql_users->num_rows)==1){
		$sql_users->fetch();
		// здесь мы роутеру отправляем его задачи
		echo $task;
		echo "n";
		echo $reg_task;
		// вот здесь мы пишем время ответа и сам ответ роутера
		$response_history="[".date("Y-m-d H:i")."] ".$message;
		// задачу отправили, теперь надо ее удалить,а после удаления отметить в логах, что такая-то задача выполнена
		$last_ip=$_SERVER["REMOTE_ADDR"];
		$last_port=$_SERVER["REMOTE_PORT"];
		$ts_last_conn_time=$last_time;
		$sql_users=$conn->prepare("UPDATE users SET task='', seq=1 WHERE (id=?);");
		$sql_users->bind_param('s', $user);
		$sql_users->execute();
		if (strlen($message)>1){
			$sql_users=$conn->prepare("UPDATE users SET response=?, seq=1 WHERE (id=?);");
			$sql_users->bind_param('ss', $response_history, $user);
			$sql_users->execute();
		}
		// теперь надо сохранить время регистрации пользователя, его айпи и сообщение от него. Пока только сообщение
		$ts_now=time();
		$sql_users=$conn->prepare("UPDATE users SET last_time=?, last_ip=?, last_port=? WHERE (id=?);");
		$sql_users->bind_param('ssss', $ts_now, $last_ip, $last_port, $user);
		$sql_users->execute();
	}
	// если мы не нашли роутер в нашей базе данных, или его статус "неактивный", то ему ... будет отправлена команда reboot....
	// Почему так жестоко ? Потому что роутеры иногда пропадают, а это маленький способ проучить "новых владельцев". 
	else
	{
	echo "reboot";
	}
	$sql_users->close();
	?>

Файл agent.php (это скрипт вызываемого zabbix-агента):

<?php
	// файл агента Zabbix. Данный скрипт обращается к таблице users и получает "1" если устройство регистрировалось с момента последнего обращения
	// user и password - учетные данные оборудования
	$user = $argv[1];
	$password = $argv[2];
	
	// подключаемся к нашей базе данных
	$conn=new mysqli("localhost","db_user","db_password","db_name");
	if (mysqli_connect_errno()) {
		exit();
		}
	$conn->set_charset("utf8");
	$sql_users=$conn->prepare("SELECT seq FROM users WHERE id=? AND passwd=? AND status='active';");
	$sql_users->bind_param('ss', $user, $password);
	$sql_users->bind_result($seq);
	$sql_users->execute();
	$sql_users->store_result();
	// обмен данными происходит через поле seq. При регистрации железка ставит данное поле в "1"
	if (($sql_users->num_rows)==1){
		$sql_users->fetch();
		echo $seq;
	}
		
	// обнуляем $seq. 
	$sql_users=$conn->prepare("UPDATE users SET seq=0 WHERE id=? AND passwd=? AND status='active';");
	$sql_users->bind_param('ss', $user, $password);
	$sql_users->execute();
	$sql_users->close();
?>		

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

Если у Вас еще не установлен zabbix-агент, то:

apt-get install zabbix-agent

Редактируем файл /etc/zabbix/zabbix_agentd.conf.

Добавляем строку:

UserParameter=test,php /usr/share/zabbix/agent.php user password

, где:

test — имя нашего агента

„php /usr/share/zabbix/agent.php user password“ — вызываемый скрипт с указанием регистрационных данных устройства.

Добавление графиков: открываем web-интерфейс zabbix, в меню выбираем:
Настройка -> Узлы сети -> Создать узел сети. Здесь достаточно указать имя узла сети, его группу, интерфейс агента по умолчанию:

Использование USB-3G-модемов | Русскоязычная документация по Ubuntu

Теперь нам для данного узла сети надо добавить элемент данных. Обратите внимание на два поля: „ключ“ — это как раз тот параметр, что мы прописывали в файле /etc/zabbix/zabbix_agentd.conf (в нашем случае это test), и „интервал обновления“ — я ставлю 5 минут, потому как и оборудование регистрируется на сервере тоже один раз в пять минут.

Использование USB-3G-модемов | Русскоязычная документация по Ubuntu

Ну и добавляем график. Рекомендую в качестве стиля отрисовки выбрать „Заполнение“.

Использование USB-3G-модемов | Русскоязычная документация по Ubuntu

На выходе получается нечто очень лаконичное, например вот так:

Использование USB-3G-модемов | Русскоязычная документация по Ubuntu

На резонный вопрос: „и это того стоило?“, отвечу: ну конечно, смотрите „причины создания велосипеда“ в начале статьи.

Если мой первый графоманский опыт вызовет интерес читателей, то в следующих статьях я хочу описать как отправлять команды на удаленное оборудование. Также удалось реализовать всю схему и для устройств на базе RouterOS (Mikrotik-ов).

Оцените статью
Huawei Devices
Добавить комментарий