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
#DoneTu http://eko.one.pl/?p=openwrt-linkidoportowszeregowych także znajdziecie coś na ten temat.
Tu moje skrypty na GitHub