1 (edytowany przez Rafciq 2014-02-12 20:42:41)

Temat: Dla Tych, którzy mają więcej niż jeden modem dołączony do routera

Witam,
na pewno spotkaliście się z przypadkiem, gdy interfejsy systemowe modemów podłączonych do routera zmieniają się i np. trudno na pierwszy rzut oka powiedzieć, który to modem schował się pod /dev/ttyUSB02.

Jeżeli w modemach są karty różnych operatorów to problem się komplikuje, bo gdy modem zmieni „miejsce” ustawienia systemu już nie pasują.

Rozwiązaniem jest poniższy skrypt, który automatycznie tworzy aliasy dla każdego modemu.
Jeżeli np. mamy modem E173 o numerze IMEI XXXXXXXXXXXXXXX a w nim kartę SIM o numerze YYYYYYYYYYYYYYYYYYYY a modem ma typowo trzy interfejsy (/dev/ttyUSB0 do /dev/ttyUSB2) to skrypt utworzy sześć aliasów:

dla /dev/ttyUSB0 aliasy /dev/mdmXXXXXXXXXXXXXXXi0 oraz /dev/simYYYYYYYYYYYYYYYYYYYYi0
dla /dev/ttyUSB1 aliasy /dev/mdmXXXXXXXXXXXXXXXi1 oraz /dev/simYYYYYYYYYYYYYYYYYYYYi1
dla /dev/ttyUSB2 aliasy /dev/mdmXXXXXXXXXXXXXXXi2 oraz /dev/simYYYYYYYYYYYYYYYYYYYYi2

W ten oto sposób posługując się aliasem /dev/sim* w konfiguracji uniezależniamy się od tego, w którym modemie znajdzie się karta SIM.
Natomiast posługując się aliasem /dev/mdm* w konfiguracji uniezależniamy się od tego, w które porty zostaną przydzielone modemowi, zawsze to będzie ten sam modem.
Numery interfejsów znajdujące się po znaku "i" w aliasie będą zawsze stałe dla danego modemu.

Wszystko wklejamy do pliku /etc/hotplug.d/usb/90-modem_aliases

#!/bin/sh
# Create alias for modem interface, based on its IMEI and sim ICCID
# Script version 1.03 Rafal Drzymala 2013
#
# Changelog
#     1.00    RD    First stable code
#    1.01    RD    Added additional USB device filter (suggested by Obsy)
#    1.02    RD    Added ICCID decode to readable format
#    1.03    RD    Changed communication with modem
#
# Destination /etc/hotplug.d/usb/90-modem_aliases
#

do_modem_cmd() {
    local Device=$1
    local Cmd=$2
    printf "\nATQ0V1E1\nAT$Cmd\n" >$Device 2>/dev/null
    sleep 1
    awk '
    BEGIN {
        FS="\n";
        RS="\n";
        Step=1;
        Response="";}
    {    if ($1!="") print $1 >>"/tmp/modem_aliases";
        if ($1=="" || substr($1,1,11)=="^")
            {}
        else if ($1=="COMMAND NOT SUPPORT" || $1=="ERROR" || substr($1,1,11)=="+CME ERROR:")
            exit 1
        else if (Step==1 && $1=="OK")
            Step=2
        else if (Step==2 && $1=="AT'$Cmd'") 
            Step=3
        else if (Step==3 && $1!="" && $1!="OK")
            { Step=4; Response=$1 }
        else if (Step==4 && $1=="OK") 
            exit}
    END {
        print Response}' $Device 2>/dev/null
}

get_modem_IMEI() {
    local IMEI=$(do_modem_cmd $1 "+CGSN")
    case "$IMEI" in
    [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]) echo "$IMEI";;
    esac
}

get_sim_ICCID() {
    local ICCID=$(do_modem_cmd $1 "+CRSM=176,12258,0,0,10" | cut -d "," -f 3 | tr -d "\"")
    local ICCID=$(echo "${ICCID:1:1}${ICCID:0:1}${ICCID:3:1}${ICCID:2:1}${ICCID:5:1}"\
"${ICCID:4:1}${ICCID:7:1}${ICCID:6:1}${ICCID:9:1}${ICCID:8:1}${ICCID:11:1}${ICCID:10:1}"\
"${ICCID:13:1}${ICCID:12:1}${ICCID:15:1}${ICCID:14:1}${ICCID:17:1}${ICCID:16:1}${ICCID:19:1}")
    case "$ICCID" in
    [0-9][0-9][0-9][0-9]*) echo "$ICCID";;
    esac
}

create_device_alias() {
    local DevicePath=$1
    local InterfaceAlias=$2
    if [ -L $InterfaceAlias ] && [ $(ls -l $InterfaceAlias | awk '{print $11}') != $DevicePath ]; then
        logger -p user.notice -t $SCR "$DEVICENAME Remove link $InterfaceAlias for device $DevicePath"
        rm -f $InterfaceAlias
    fi
    if [ ! -L $InterfaceAlias ]; then
        logger -p user.notice -t $SCR "$DEVICENAME Create link $InterfaceAlias for device $DevicePath"
        ln -sf $DevicePath $InterfaceAlias
    fi
}

cleanup_devices_aliases() {
    local DeviceInfo
    for DeviceInfo in $(ls -l /dev/*i? | awk '$9!="" && $11!="" {print $9":"$11}'); do
        local InterfaceAlias=$(echo "$DeviceInfo" | cut -d ":" -f 1)
        local DevicePath=$(echo "$DeviceInfo" | cut -d ":" -f 2)
        if [ ! -c $DevicePath ]; then
            logger -p user.notice -t $SCR "$DEVICENAME Remove link $InterfaceAlias for device $DevicePath"
            rm -f $InterfaceAlias
        fi
    done
}

if [ "$HOTPLUG_TYPE" == "usb" ] && [ "$DEVTYPE" == "usb_interface" ]; then
    case "$DEVICENAME" in
    *-*.*:*.*) : ;;
    *-*:*.*) : ;;
    *) exit 0 ;;
    esac
    SCR=$(basename $0)
    if [ "$ACTION" == "add" ]; then
        if [ -e /sys$DEVPATH/*/tty/*/dev ]; then
            local ModemIMEI
            local simICCID
            for InterfaceConfig in /sys$DEVPATH/../*/*/tty/*; do
                local InterfaceNumber=$(cut -d ':' -f 2 $InterfaceConfig/dev)
                if [ "$InterfaceNumber" != "" ]; then
                    local ModemDevice=/dev/$(basename $InterfaceConfig)
                    [ -c $ModemDevice ] && [ "$ModemIMEI" == "" ] && ModemIMEI=$(get_modem_IMEI $ModemDevice)
                    if [ "$ModemIMEI" != "" ]; then
                        local InterfaceAlias=/dev/"mdm"$ModemIMEI"i"$InterfaceNumber
                        create_device_alias $ModemDevice $InterfaceAlias
                    fi
                    [ -c $ModemDevice ] && [ "$simICCID" == "" ] && simICCID=$(get_sim_ICCID $ModemDevice)
                    if [ "$simICCID" != "" ]; then
                        local InterfaceAlias=/dev/"sim"$simICCID"i"$InterfaceNumber
                        create_device_alias $ModemDevice $InterfaceAlias
                    fi
                fi
            done
        fi
    elif [ "$ACTION" == "remove" ]; then
        cleanup_devices_aliases
    fi
fi
#Done

Tu http://eko.one.pl/?p=openwrt-linkidoportowszeregowych także znajdziecie coś na ten temat.

install.sh - Aktualizacja systemu, sysinfo.sh - Info.o systemie, openvpn-auth.sh - Login dla OpenVPN
Tu moje skrypty na GitHub

2

Odp: Dla Tych, którzy mają więcej niż jeden modem dołączony do routera

działa na wszystkich modemach, czy tylko na Huawei?

3

Odp: Dla Tych, którzy mają więcej niż jeden modem dołączony do routera

@Rafciq: mała uwaga - dodaj jeszcze

*-*:*.*) : ;;

Tak jest np. na Huawei D105 (który dostałem od jednego z forumowiczów, dziękuję).

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

4

Odp: Dla Tych, którzy mają więcej niż jeden modem dołączony do routera

@KMY jestem otwarty na zmiany, proszę wszystkich o testy i informacje w tym wątku, z którymi modemami działa a z którymi nie. Będą kolejne wersje:)

@Cezary, dziękuję za propozycję, zmieniłem skrypt.

install.sh - Aktualizacja systemu, sysinfo.sh - Info.o systemie, openvpn-auth.sh - Login dla OpenVPN
Tu moje skrypty na GitHub

5

Odp: Dla Tych, którzy mają więcej niż jeden modem dołączony do routera

Dla ZTE MF821 nie chodzi w ogóle. W sensie nie czyta IMEI/ICCID

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

6

Odp: Dla Tych, którzy mają więcej niż jeden modem dołączony do routera

podane w skrypcie komendy AT odczytują E398

AT+CRSM=176,12258,0,0,10
+CRSM: 144,0,"988420591174090863F1"   

AT+CGSN
355589041134531

w takiej formie

to ma szanse zadziałać?

7

Odp: Dla Tych, którzy mają więcej niż jeden modem dołączony do routera

Powinno działać.

install.sh - Aktualizacja systemu, sysinfo.sh - Info.o systemie, openvpn-auth.sh - Login dla OpenVPN
Tu moje skrypty na GitHub

8

Odp: Dla Tych, którzy mają więcej niż jeden modem dołączony do routera

tylko pamięci mam za mało aby wgrać plik do routera, aktualnie nie mam extroota

jest komunikat

scp: /etc/hotplug.d/usb/90-modem_aliases: No space left on device

jak zrobię extroota to sprawdzę

chociaż mam jeszcze 60kB wolnego flasha a plik ma 3,6kB, nie wiem, dlaczego nie chce go wgrać

9

Odp: Dla Tych, którzy mają więcej niż jeden modem dołączony do routera

Mam modem Huawei e173 i skrypt trochę słabo działa.
w /dev/ mam coś takiego

lrwxrwxrwx    1 root     root            12 Feb 11 23:30 mdm+++ -> /dev/ttyUSB2
lrwxrwxrwx    1 root     root            12 Feb 11 23:30 sim++ -> /dev/ttyUSB2


crw-rw-rw-    1 root     root      188,   0 Jan  1  1970 ttyUSB0
crw-rw-rw-    1 root     root      188,   1 Jan  1  1970 ttyUSB1
crw-rw-rw-    1 root     root      188,   2 Jan  1  1970 ttyUSB2

10

Odp: Dla Tych, którzy mają więcej niż jeden modem dołączony do routera

Witaj,
poprawiłem skrypt.

install.sh - Aktualizacja systemu, sysinfo.sh - Info.o systemie, openvpn-auth.sh - Login dla OpenVPN
Tu moje skrypty na GitHub

11

Odp: Dla Tych, którzy mają więcej niż jeden modem dołączony do routera

to jest tak wersja na githubie?
Teraz nie mam żadnych aliasów w /dev/
Używam MR3420 z powiększonym flashem i najnowszego Gargoyle.

12

Odp: Dla Tych, którzy mają więcej niż jeden modem dołączony do routera

Na githubie jest ta sama wersja.
Pokaż proszę zawartość pliku /tmp/modem_aliases

install.sh - Aktualizacja systemu, sysinfo.sh - Info.o systemie, openvpn-auth.sh - Login dla OpenVPN
Tu moje skrypty na GitHub

13

Odp: Dla Tych, którzy mają więcej niż jeden modem dołączony do routera

cat /tmp/modem_aliases
AT+CSQ
COMMAND NOT SUPPORT
AT&F
OK
ATI
Manufacturer: huawei
Model: E173
Revision: 11.126.16.05.264
IMEI: 869878005215743
+GCAP: +CGSM,+DS,+ES

OK
AT+CSQ
+CSQ: 18,99

OK
AT&F
OK
ATI
Manufacturer: huawei
Model: E173
Revision: 11.126.16.05.264
IMEI: 869878005215743
+GCAP: +CGSM,+DS,+ES

OK
AT+CSQ
+CSQ: 18,99

OK
AT&F
OK
ATI
Manufacturer: huawei
Model: E173
Revision: 11.126.16.05.264
IMEI: 869878005215743
+GCAP: +CGSM,+DS,+ES

OK
AT+CSQ
+CSQ: 18,99

OK
AT&F
OK
ATI
Manufacturer: huawei
Model: E173
Revision: 11.126.16.05.264
IMEI: 869878005215743
+GCAP: +CGSM,+DS,+ES

OK
AT+CSQ
+CSQ: 19,99

OK
AT&F
OK

Wydaje mi się też, że przez ten skrypt mam tylko /dev/ttyUSB0 bo jeśli go usunę to pojawiają się wszystkie tty.
Modem przełączyłem też w tryb tylko modemu więc modswitch nie musi nic robić.

14

Odp: Dla Tych, którzy mają więcej niż jeden modem dołączony do routera

Witaj,
jakiś inny skrypt/program odpytuje modem w tym samym czasie. Nic z tego nie będzie:(

install.sh - Aktualizacja systemu, sysinfo.sh - Info.o systemie, openvpn-auth.sh - Login dla OpenVPN
Tu moje skrypty na GitHub

15

Odp: Dla Tych, którzy mają więcej niż jeden modem dołączony do routera

Rzeczywiście jeśli wyłączę połączenie WAN to skrypt działa. Jednak jeśli ustawię połączenie 3g to niestety nie działa.

 cat /tmp/modem_aliases
ATQ0V1E1
COMMAND NOT SUPPORT
V1E
OK
ATQ0V1E1
OK
AT+CRSM=176,12258,0,0,10
+CRSM: 144,0,"988471110000513686F6"
OK

w dev mam
tylko

/dev/sim8948171100001563686i0

/dev/ttyUSB0
/dev/ttyUSB1
/dev/ttyUSB2

16

Odp: Dla Tych, którzy mają więcej niż jeden modem dołączony do routera

Niestety, gdy więcej niż jeden skrypt w tym samym czasie komunikuje się z tym samym modemem, to wynik takiej operacji jest nieprzewidywalny.
Może masz zainstalowane 3ginfo albo jest coś w Gargoyle, co odpytuje modemy?
Obawiam się że moje rozwiązanie w tej wersji nie przyda się Tobie:(

install.sh - Aktualizacja systemu, sysinfo.sh - Info.o systemie, openvpn-auth.sh - Login dla OpenVPN
Tu moje skrypty na GitHub

17

Odp: Dla Tych, którzy mają więcej niż jeden modem dołączony do routera

Chyba mam tylko automatyczne nawiązywanie połączenia 3g i to pewnie się gryzie. W 3ginfo ma ustawiony inny port wlasnie jakiś alias.
W config/network mam ustawiony alias ale może jest tak, że jak on jest dostępny to od razu jest próba połączenia i blokuje port dla twojego skryptu.

Mam jeszcze pytanie to te liczby na początku nazwy pliku 90- czy one maja jakieś znaczenie?

18

Odp: Dla Tych, którzy mają więcej niż jeden modem dołączony do routera

Nazwy są tak skonstruowanie aby dawać twórcy skryptu możliwość prostego zdecydowania o kolejności jego wykonania w stosunku do innych skryptów.
Inaczej mówiąc jak posortujesz sobie po nazwie wszystkie skrypty w katalogu w którym się znajdują zobaczysz ich kolejność wykonywania się.

install.sh - Aktualizacja systemu, sysinfo.sh - Info.o systemie, openvpn-auth.sh - Login dla OpenVPN
Tu moje skrypty na GitHub