Zgodnie z obietnicą:
Konfigi podaję dla orange, bo chyba nie ma w Polsce innego operatora gsm, który serwował by net przez cdma? Pin na karcie ustawiony na 0000, hotplug w tym przypadku wyłączony celowo - później się z tego wytłumaczę.
/etc/config/network
Połączenie przez klasyczne EDGE/UMTS/HSDPA:
config 'interface' '3g'
option 'device' '/dev/ttyUSB3'
option 'apn' 'internet'
option 'proto' '3g'
option 'hotplug' 0
option 'pincode' '0000'
option 'username' 'internet'
option 'password' 'internet'
Połączenie przez CDMA:
config 'interface' '3g'
option 'device' '/dev/ttyUSB0'
option 'apn' 'internet'
option 'service' 'evdo'
option 'proto' '3g'
option 'hotplug' 0
option 'pincode' '0000'
option 'username' 'cdma@orange'
option 'password' 'orange'
Polazłem na łatwiznę i zrobiłem tak, że wersja z cdma jest zapisana jako:
a wersja z 3g jako:
W /etc/config/system zmodyfikowałem obsługę guzika qss:
config 'button'
option button BTN_1
option action released
option handler '/bin/switch.sh'
option min 0
option max 2
config 'button'
option button BTN_1
option action released
option handler '/sbin/wifionoff'
option min 5
option max 8
Czyli 0-2 sekundy to zmiana trybu pracy 3g/cdma, a 5-8 radio on/off
Zawartość skryptu /bin/switch.sh:
#!/bin/sh
CDMA=`cat /etc/cdma_mode`
if [ $CDMA == 1 ];then
echo "Ustawiony jest tryb CDMA"
cp -f /etc/config/network.3g /etc/config/network
echo "0">/etc/cdma_mode
echo "Zmienilem na tryb 3G"
echo "0" > /sys/class/leds/tl-wr1043nd\:green\:system/brightness
sleep 1
echo "255" > /sys/class/leds/tl-wr1043nd\:green\:system/brightness
else
echo "Ustawiony jest tryb 3G"
cp -f /etc/config/network.cdma /etc/config/network
echo "Zmienilem na tryb CDMA"
echo "1">/etc/cdma_mode
echo "0" > /sys/class/leds/tl-wr1043nd\:green\:system/brightness
sleep 1
echo "255" > /sys/class/leds/tl-wr1043nd\:green\:system/brightness
sleep 1
echo "0" > /sys/class/leds/tl-wr1043nd\:green\:system/brightness
sleep 1
echo "255" > /sys/class/leds/tl-wr1043nd\:green\:system/brightness
fi
/bin/tester.sh
Łatwo zauważyć, że skrypt zapisuje w pliku /etc/cdma_mode 0 lub 1 w zależności od trybu pracy, oraz generuje (właściwie to po prostu kopiuje) konfigurację do /etc/config/network raz z jednego, a raz z drugiego pliku.
Mruga też diodą - raz dla 3g, dwa razy dla cdma - tak, żeby bez komputera było wiadomo w którym trybie pracuje.
Zawartość /bin/tester.sh:
#!/bin/sh
ifconfig 3g-3g >/dev/null
if [ $? -ne 0 ]; then
CDMA=`cat /etc/cdma_mode`
if [ $CDMA == 1 ]; then
echo -ne "\xD7\x03\x00\xAE\xEF\x7E" > /dev/ttyUSB2
sleep 4
echo -ne "\xCF\x0D\x00\x00\x81\x8A\x7E" > /dev/ttyUSB2
sleep 5
fi
ifup 3g
fi
Skrypt dodatkowo wykonywany jest co minutę przez dopisanie w cronie:
Realizuje on sprawdzenie czy jest aktywne połączenie i w zależności od wartości w /etc/cmda_mode wysyła odpowiednie stringi przełączające oraz inicjuje samo połączenie.
Zdaję sobie sprawę z tego, że rozwiązałem to wyjątkowo prymitywnie i mało elegancko. Można by to było zrobić milion razy lepiej np. zamiast tworzyć ten /etc/cdma_mode można by parsować aktualny /etc/config/network i w zależności od tego, co w nim znajdzie zmieniać go na drugi wariant. Tak samo kod powiela niemal identyczne fragmenty, ale po prostu nie chciało mi się pisać tego w "ładniejszej" formie, opartej o jakąś funkcję.
Niemniej działa (a tylko to było wtedy istotne) i realizuje swoje podstawowe założenia tj:
1) Co minutę sprawdza czy jest aktywne połączenie - jeżeli nie, wznawia je.
2) Guzikiem qss pozwala przełączyć tryb pracy CDMA/3G bez dostępu do komputera, a dodatkowo poprzez jedno lub dwukrotne błyśnięcie informuje (jednorazowo) o aktualnie załączonym trybie.
W praktyce wygląda to tak, że jego użytkownik w mieście używa 3G, a kiedy przenosi się na działkę zabiera go ze sobą i przełącza w CDMA. Po powrocie do domu cyk - i znowu jedzie na 3G.