Переделал скрипты на MNC идентификаторы, init.d
не работает нормально, выполнит while три раза и упадёт, сделал через cron
с периодичностью в минуту. rc.local
вообще не нашёл где лежит.
В кроне * * * * * root /etc/autoGSM_HW
#!/bin/bash
#LOGFILE=/var/log/ppp0.log
if [ ! -e /var/run/ppp0.pid ]; then
#echo "`date +'%b %d %T'` restarting ppp0" >> $LOGFILE
logger -i -t autoGSM_HW "Restarting ppp0"
sh -c "ifdown ppp0; ifup ppp0"
fi
/etc/autoGSM.sh
#!/bin/bash
PORT=/dev/ttyGSM
DEFAULT_BAUDRATE=115200
REPORT_FILE=`mktemp`
declare -a gsm_dbm=("-110" "-109" "-107" "-105" "-103" "-101" "-99" "-97" "-95" "-93" "-91" "-89" "-87" "-85" "-83" "-81" "-79" "-77" "-75" "-73" "-71" "-69" "-67" "-65" "-63" "-61" "-59" "-57" "-55" "-53")
declare -a gsm_cond=("BAD" "BAD" "BAD" "BAD" "BAD" "BAD" "BAD" "BAD" "BAD" "OK" "OK" "OK" "OK" "OK" "Good" "Good" "Good" "Good" "Good" "Excellent" "Excellent" "Excellent" "Excellent" "Excellent" "Excellent" "Excellent" "Excellent" "Excellent" "Excellent" "Excellent")
if [ ! -e $PORT ]; then
logger -i -t autoGSM "Reseting modem by pin"
#echo "Reseting modem by pin"
sh -c "wb-gsm reset && wb-gsm restart_if_broken; sleep 10;"
else
#set speed
stty -F $PORT ${DEFAULT_BAUDRATE} -icrnl
/usr/sbin/chat -s -r $REPORT_FILE TIMEOUT 10 ABORT "ERROR" REPORT "\r\n" "" "AT" "" OK "OK" > $PORT < $PORT
ANSWER=`tail -n 1 $REPORT_FILE`
logger -i -t autoGSM "AT: $ANSWER"
if [ "$ANSWER" = "RDY" ]; then
/usr/sbin/chat -s -r $REPORT_FILE TIMEOUT 10 ABORT "ERROR" REPORT "\r\n" "" "AT" "" OK "OK" > $PORT < $PORT
ANSWER=`tail -n 1 $REPORT_FILE`
logger -i -t autoGSM "AT: $ANSWER"
fi
if [ "$ANSWER" != "OK" ]; then
logger -i -t autoGSM "Reseting modem by pin"
sh -c "wb-gsm reset; wb-gsm restart_if_broken"
sleep 10
exit 1;
fi
/usr/sbin/chat -s -r $REPORT_FILE TIMEOUT 5 ABORT "RDY" ABORT "ERROR" ABORT "BUSY" REPORT "\r\n" "" "AT+CPIN?" OK "+CPIN: READY" > $PORT < $PORT 2>/dev/null
ANSWER=`tail -n 1 $REPORT_FILE`
logger -i -t autoGSM "AT+CPIN?: $ANSWER"
if [ "$ANSWER" != "+CPIN: READY" ]; then
logger -i -t autoGSM "Reseting modem by software"
/usr/sbin/chat -s -r $REPORT_FILE TIMEOUT 10 ABORT "ERROR" REPORT "\r\n" "" "AT+CFUN=1,1" OK "OK" > $PORT < $PORT
ANSWER=`tail -n 1 $REPORT_FILE`
logger -i -t autoGSM "AT+CFUN=1,1: $ANSWER"
sleep 11
/usr/sbin/chat -s -r $REPORT_FILE TIMEOUT 15 ABORT "ERROR" ABORT "BUSY" REPORT "\r\n" "" "AT" OK "RDY" > $PORT < $PORT
ANSWER=`tail -n 1 $REPORT_FILE`
logger -i -t autoGSM "AT: $ANSWER"
exit 1;
fi
rm $REPORT_FILE
fi
/usr/sbin/chat -s -r $REPORT_FILE TIMEOUT 1 ABORT "ERROR" ABORT "BUSY" REPORT "\r\n" "" "AT+COPS=0,0" OK "OK" > $PORT < $PORT
ANSWER=`tail -n 1 $REPORT_FILE`
logger -i -t autoGSM "AT+COPS=0,0: $ANSWER"
rm $REPORT_FILE
/usr/sbin/chat -s -r $REPORT_FILE TIMEOUT 2 ABORT "ERROR" ABORT "BUSY" REPORT "\r\n" "" "AT+COPS?" OK "OK" > $PORT < $PORT
ANSWER=`tail -n 1 $REPORT_FILE`
logger -i -t autoGSM "AT+COPS?: $ANSWER"
rm $REPORT_FILE
if [[ "$ANSWER" =~ ^.*,[\"]{0,}([^\"\,]+)[\"]{0,},[0-9]{1,}$ ]];
then
PROVIDER_NAME=${BASH_REMATCH[1]}
logger -i -t autoGSM "PROVIDER_NAME = $PROVIDER_NAME"
else
logger -i -t autoGSM "PROVIDER_NAME = ERROR"
exit 1;
fi
/usr/sbin/chat -s -r $REPORT_FILE TIMEOUT 1 ABORT "ERROR" ABORT "BUSY" REPORT "\r\n" "" "AT+COPS=3,2" OK "OK" > $PORT < $PORT
ANSWER=`tail -n 1 $REPORT_FILE`
logger -i -t autoGSM "AT+COPS=3,2: $ANSWER"
rm $REPORT_FILE
/usr/sbin/chat -s -r $REPORT_FILE TIMEOUT 2 ABORT "ERROR" ABORT "BUSY" REPORT "\r\n" "" "AT+COPS?" OK "OK" > $PORT < $PORT
ANSWER=`tail -n 1 $REPORT_FILE`
logger -i -t autoGSM "AT+COPS?: $ANSWER"
rm $REPORT_FILE
if [[ "$ANSWER" =~ ^.*,[\"]{0,}([^\"\,]+)[\"]{0,},[0-9]{1,}$ ]];
then
PROVIDER_ID=${BASH_REMATCH[1]}
logger -i -t autoGSM "PROVIDER_ID = $PROVIDER_ID"
else
logger -i -t autoGSM "PROVIDER_ID = ERROR"
exit 1;
fi
/usr/sbin/chat -s -r $REPORT_FILE TIMEOUT 1 ABORT "ERROR" ABORT "BUSY" REPORT "\r\n" "" "AT+CSQ" OK "OK" > $PORT < $PORT
ANSWER=`tail -n 1 $REPORT_FILE`
logger -i -t autoGSM "AT+CSQ: $ANSWER"
if [[ "$ANSWER" =~ ^.*\ ([0-9]{1,}),[0-9]{1,}$ ]];
then
STRENGTH=$(("${BASH_REMATCH[1]}"))
logger -i -t autoGSM "Signal: [$STRENGTH] ${gsm_cond[$STRENGTH]} ${gsm_dbm[$STRENGTH]}dBm"
fi
if [ ! -e $(eval echo /etc/ppp/peers/$PROVIDER_ID) ]; then
logger -i -t autoGSM "Unknown network $PROVIDER_NAME [$PROVIDER_ID], error getting apn settings"
exit 1;
else
logger -i -t autoGSM "Selecting /etc/ppp/peers/$PROVIDER_ID"
cp $(eval echo "/etc/ppp/peers/$PROVIDER_ID") /etc/ppp/peers/autoprovider
exit 0;
fi
exit 1;
/etc/network/interfaces
auto ppp0
iface ppp0 inet ppp
pre-up wb-gsm restart_if_broken; /etc/autoGSM.sh;
provider autoprovider
/etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client server secret IP addresses
gdata * gdata *
beeline * beeline *
mts * mts *
motiv * motiv *
n@k * nok *
ntc * ntc *
skylink * skylink *
smarts * smarts *
internet * internet *
IT * IT *
Итог: не выключая контроллер можно вставить симкарту или заменить текущую, соединение поднимется автоматически. У меня также установлен openvpn в качестве клиента, и при первой же возможности контроллер остётся на связи с возможностью обратного доступа по ssh.
Используемые операторы:
25001 MTS (Mobile Telesystems)
25002 Megafon
25006 DANYCOM
25011 YOTA
25020 Tele2/ECC/Volgogr.
25023 ЗАО «Джи Ти Эн Ти» (Возможно не поддерживается, имеется спутниковая связь)
25027 Летай (ТАТТЕЛЕКОМ)
25032 WIN-Mobile
25033 СевМобайл
25034 Крымтелеком
25035 Motiv LLC Ekaterinburg-2000
25039 Ростелеком (Utel, АКОС, НСС, БайкалВестКом, Волгоград-GSM, Тамбов GSM)
25054 Таттелеком
25060 Волна мобайл
25061 Интертелеком (Республика Крым и Севастополь) (Возможно не поддерживается CDMA с точной доступа #777)
25062 Тинькофф Мобайл
25099 Beeline / OJSC Vimpel-Communications (VimpelCom)
Было отсеяно 17 операторов из 44, остальные закрылись или были выкуплены другими операторами. Если есть информация, что APN точки из /etc/chatscripts имеют неверную конфигурацию, сообщите здесь.
Результат работы из /var/log/messages
Mar 3 21:46:32 wirenboard-AVBQBQ46 user.notice autoGSM[2612]: AT: OK
Mar 3 21:46:32 wirenboard-AVBQBQ46 user.notice autoGSM[2619]: AT+CPIN?: +CPIN: READY
Mar 3 21:46:32 wirenboard-AVBQBQ46 user.notice autoGSM[2623]: AT+COPS=0,0: OK
Mar 3 21:46:33 wirenboard-AVBQBQ46 user.notice autoGSM[2627]: AT+COPS?: +COPS: 0,0,"MTS RUS",2
Mar 3 21:46:33 wirenboard-AVBQBQ46 user.notice autoGSM[2629]: PROVIDER_NAME = MTS RUS
Mar 3 21:46:33 wirenboard-AVBQBQ46 user.notice autoGSM[2632]: AT+COPS=3,2: OK
Mar 3 21:46:33 wirenboard-AVBQBQ46 user.notice autoGSM[2636]: AT+COPS?: +COPS: 0,2,"25001",2
Mar 3 21:46:33 wirenboard-AVBQBQ46 user.notice autoGSM[2638]: PROVIDER_ID = 25001
Mar 3 21:46:33 wirenboard-AVBQBQ46 user.notice autoGSM[2641]: AT+CSQ: +CSQ: 15,0
Mar 3 21:46:33 wirenboard-AVBQBQ46 user.notice autoGSM[2642]: Signal: [15] Good -81dBm
Mar 3 21:46:33 wirenboard-AVBQBQ46 user.notice autoGSM[2644]: Selecting /etc/ppp/peers/25001