Huawei E122 to solidny (opinia jednego z użytkowników [1], który pracuje w sklepie) i stosunkowo tani (w sprzedaży detalicznej kosztuje ok. 150 zł, przy czym cena stale spada) modem 3G, który można podłączyć do dowolnego urządzenia wyposażonego w port USB — laptopa, komputera stacjonarnego, niektórych routerów.
Urządzenie jest łatwo dostępne, można je zakupić w każdym salonie sieci Era. Modem choć od konkretnego operatora, pozbawiony jest blokady SIM lock (przynajmniej seria dostępna w okresie powstawania tekstu, jednak podobno wcześniej blokada była — lepiej się dopytać u sprzedawcy), zatem można używać go z kartą dowolnego dostawcy.
Poniższe opracowanie dedykowane jest dla modemu Huawei E122, niewykluczone jednak, iż po niewielkich modyfikacjach przydatne będzie dla użytkowników innych modeli. Informacje dotyczące ogólnego użytkowania modemu 2G/3G z pewnością mogą zainteresować posiadaczy wszelkich modemów.
Sprzęt testowany na Debianie Squeeze na kilka chwil przed wydaniem wersji stabilnej, na klasycznej, nie modyfikowanej wersji.
Spis treści:
- Instalacja i uruchmienie [2]
- Konfiguracja połączenia [3]
- Uruchomienie połączenia [4]
- Obsługa dodatkowych funkcji [5]
Instalacja i uruchomienie
Na początek musimy zainstalować następujące pakiety:
usb-modeswitch wvdial ppp
oraz ich zależności. Odpowiedzialne one są za:
- ppp [11] — uruchomienie demona pppd i uruchomienie interfejsu
ppp0
, który pozwala na połączenie się z internetem - usb-modeswitch [12] — przełączenie urządzenia w tryb modemu, inaczej widziane jest jako wirtualny CD-ROM ze sterownikami dla Windows
- wvdial [13] — komunikacja z modemem i zestawienie połączenia
Opcjonalnie można zainstalować jeszcze pakiet comgt [14] do rejestrowania modemu w sieci komórkowej oraz sprawdzania siły sygnału, jednak nie jest on wymagany — można te zadania wykonać innymi metodami.
Po włożeniu modemu w gniazdo USB, sprawdzamy jak system widzi sprzęt:
$ lsusb | grep Huawei
Bus 001 Device 005: ID 12d1:1001 Huawei Technologies Co., Ltd. E620 USB Modem
Wynik podobny do powyższego oznacza, że widzi go jako modem gotowy do działania. Wprawdzie system rozpoznaje modem jak E620, ale to w niczym nie przeszkadza — po prostu zbudowane są one na tym samym układzie.
Natomiast jeśli otrzymamy wynik podobny do następującego:
$ lsusb | grep Huawei
Bus 001 Device 012: ID 12d1:1446 Huawei Technologies Co., Ltd. E1552 (HSPA modem)
System rozpoznaje urządzenie jako wirtualny CD-ROM. W takim wypadku najpierw należy spróbować ręcznie przełączyć tryb modemu:
# usb_modeswitch -v 12d1 -p 1001 -H 1
Powinniśmy wtedy otrzymać następujący wynik:
Looking for default devices ...
Found devices in default mode or class (1)
Accessing device 005 on bus 002 ...
Using endpoints 0x01 (out) and 0x81 (in)
Using endpoints 0x01 (out) and 0x81 (in)
Not a storage device, skipping SCSI inquiry
USB description data (for identification)
-------------------------
Manufacturer: HUA WEI
Product: Huawei Mobile
Serial No.: not provided
-------------------------
Sending Huawei control message ...
OK, Huawei control message sent
-> Run lsusb to note any changes. Bye.
Od tej chwili, nie powinno być najmniejszych problemów z wykryciem modemu przez system. Przyznam uczciwie, że powyższe polecenie potrzebne było tylko raz na laptopie Lenovo, spośród trzech testowanych laptopów i trzech komputerów stacjonarnych.
Jeśli jednak modem uparcie nie chce zmienić trybu, prawdopodobnie zainstalowana jest zbyt stara wersja pakietu usb-modeswitch-data [15]. Należy w takim wypadku zaktualizować go do najnowszej dostępnej wersji (można bez problemu zainstalować ręcznie pakiet z wyższej gałęzi Debiana, użytkownicy pochodnej również mogą zainstalować pakiet z jego repozytorium).
Gdy urządzenie już zostanie przełączone w tryb modemu, sprawdzamy na jakich portach działa urządzenie:
$ ls /dev/ttyUSB*
/dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2
Używany port (np. do połączenia z siecią lub przez program komunikujący się z modemem) jest blokowany, próba połączenia się z nim przez inny program może skutkować informacją o zajętości urządzenia:
--> Cannot open /dev/ttyUSB0: Device or resource busy
W takim przypadku, należy poszukać innego wolnego portu, który pozwoli na komunikację z modemem.
Port /dev/ttyUSB1
jest praktycznie niewykorzystywany (nieczynny).
Konfiguracja połączenia
Plik konfiguracyjny programu wvdial
znajduje się w pliku /etc/wvdial.conf
. Zapisujemy w nim (jeśli nie istnieje, tworzymy go) następującą treść:
[Dialer Defaults]
Modem = /dev/ttyUSB0
Baud = 460800
SetVolume = 0
Dial Command = ATDT
FlowControl = NOFLOW
Init1 = ATZ
[Dialer modem-start]
Init1 = ATZ+CFUN=1
[Dialer modem-stop]
Init1 = AT+CFUN=0
[Dialer pin]
Init1 = AT+CPIN=8888
[Dialer moc]
Modem = /dev/ttyUSB2
Init1 = AT+CSQ
[Dialer era]
Modem = /dev/ttyUSB0
Baud = 57600
Init1 = ATH
Init2 = ATE1
Init3 = AT+CGDCONT=1,"IP","internet"
Dial Command = ATD
Phone = *99***1#
Stupid mode = yes
Username = "blank"
Password = "blank"
Auto DNS = yes
[Dialer plus]
Modem = /dev/ttyUSB0
Baud = 57600
Init1 = ATH
Init2 = ATE1
Init3 = AT+CGDCONT=1,"IP","internet"
Dial Command = ATD
Phone = *99#
Stupid mode = yes
Username = "blank"
Password = "blank"
Auto DNS = yes
[Dialer orange]
Modem = /dev/ttyUSB0
Baud = 57600
Init1 = ATH
Init2 = ATE1
Init3 = AT+CGDCONT=1,"IP","internet"
Dial Command = ATD
Phone = *99#
Stupid mode = yes
Username = "internet"
Password = "internet"
Auto DNS = yes
W razie potrzeby należy ustawić inny port urządzenia oraz numer PIN. Należy zauważyć, że w części „moc” powinien być wskazany inny port niż w pozostałych.
Tak skonstruowany wvdial.conf
pozwala nam na korzystanie z karty większości operatorów. Proszę wybaczyć — nie miałem możliwości (ani karty, ani kolegi) aby przetestować kartę sieci Play. Przypuszczam, że parametry będą podobne do wyżej zobrazowanych.
Znany jest przypadek, kiedy połączenie przez PPP nie zostaje utworzone, ponieważ modem „odkłada słuchawkę”:
--> Carrier detected. Starting PPP immediately.
--> Starting pppd at Wed Jan 5 08:19:06 2011
--> Pid of pppd: 13965
--> Using interface ppp0
--> pppd: (WÒ[08]°WÒ[08] UÒ[08]
--> pppd: (WÒ[08]°WÒ[08] UÒ[08]
--> pppd: (WÒ[08]°WÒ[08] UÒ[08]
--> pppd: (WÒ[08]°WÒ[08] UÒ[08]
--> Disconnecting at Wed Jan 5 08:19:07 2011
--> The PPP daemon has died: A modem hung up the phone (exit code = 16)
--> man pppd explains pppd error codes in more detail.
--> Try again and look into /var/log/messages and the wvdial and pppd man pages for more information.
Pomogło dodanie local
do /etc/ppp/peers/wvdial
:
# echo local >>/etc/ppp/peers/wvdial
Uruchomienie połączenia
Zaraz po włożeniu modemu do gniazda USB, dioda urządzenia będzie migotać zielonym światłem. Podwójne zielone mignięcie co 2 s.
Najpierw należy uruchomić modem:
# wvdial modem-start
Po chwili (ok. 3-4 sekundy) modem zaczyna rejestrować się w sieci — dioda zaczyna migać wolniej: pojedyncze błyski co 3 s, kolorem zielonym (2G) lub niebieskim (3G).
Alternatywnie można użyć do tego zadania comgt
:
# comgt
W razie czego można podać port urządzenia flagą -d /dev/ttyUSB2
(lub inny numer).
Po włączeniu modemu, możemy uruchomić połączenie za pomocą wvdial
podając jako argument nazwę sieci z pliku wvdial.conf
, np.:
# wvdial era
Jeśli karta SIM wymaga autoryzacji kodem PIN, należy przed podaniem nazwy sieci wpisać „pin”:
# wvdial pin era
Po krótkiej chwili modem powinien zestawić połączenie. Dioda będzie świecić w sposób ciągły na zielono (2G), niebiesko (3G) lub jasnoniebiesko (3G+). Aby przerwać połączenie należy wciśnąć kombinację Ctrl+C.
Jeśli zestawimy połączenie jak w powyższym przykładzie, będziemy cały czas musieli mieć otwartą konsolę. Zamknięcie konsoli lub wciśnięcie Ctrl+C zamknie nam połączenie. Aby temu zapobiec można uruchomić połączenie w trybie demona:
# pon.wvdial argumenty dla wvdial
po tym można już zamknąć konsolę. Tak uruchomione połączenie kończymy za pomocą:
# poff.wvdial
Jeśli chcemy wyłączyć modem (aby przestał rejestrować się w sieci), uruchamiamy:
# wvdial modem-stop
Obsługa dodatkowych funkcji
Odczytywanie SMS-ów i innych informacji
Gammu pozwala nam na bezproblemowe odczytanie numeru SIM, IMEI, portu na którym pracuje modem, odczytywanie SMS-ów. Nie wiem jak z wysyłaniem. Wammu jest graficzną nakładką na Gammu.
U mnie modem pracuje na /dev/ttyUSB2
:
~$ gammu identify
Urządzenie : /dev/ttyUSB2
Manufacturer : huawei
Model : unknown (E122)
Firmware : 11.009.01.00.55
IMEI : 3568810370XXXXX
SIM IMSI : 2600210635XXXXX
Warunek: utworzenie w katalogu domowym pliku ukrytego ~/.gammurc o zawartści:
[gammu]
port=/dev/ttyUSB2
connection=at
name=Modem
Kiedy w konsoli (z usera) wydasz poniższe polecenie, otrzymasz wynik:
$ cat ~/.gammurc
[gammu]
port=/dev/ttyUSB2
connection=at
name=Modem
[gammu1]
port=/dev/ttyUSB2
connection=at
name=huawei unknown
Sprawdzanie mocy sygnału
Siłę sygnału można sprawdzić na kilka sposobów:
Za pomocą
comgt
:$ comgt sig -d /dev/ttyUSB2 Signal Quality: 7,99
Czasami jednak
comgt
zwraca błąd bądź inną dziwną kombinację, należy wtedy spróbować ponownie lub skorzystać z innej metody.Za pomocą
wvdial
(jeśli jest dodany odpowiedni wpis wwvdial.conf
):$ wvdial moc --> WvDial: Internet dialer version 1.60 --> Cannot get information for serial port. --> Initializing modem. --> Sending: AT+CSQ AT+CSQ +CSQ: 7,99 OK --> Modem initialized. --> Configuration does not specify a valid phone number. --> Configuration does not specify a valid login name. --> Configuration does not specify a valid password.
W linijce „+CSQ: 7,99” podana jest moc sygnału. Można pozbyć się zbędnych komunikatów (aby uprościć wpisywanie warto utworzyć odpowiedni alias):
$ wvdial moc 2>&1 | grep 'CSQ:' +CSQ: 7,99
Metodą „hakera–partyzanta” — działa zawsze i bez specjalnych przygotowań, choć dla osób nieobeznanych z konsolą wygląda jak czarna magia:
$ echo -e "AT+CSQ\r" >/dev/ttyUSB2 && grep -m1 "CSQ:" /dev/ttyUSB2 +CSQ: 7,99
Aby uprościć wpisywanie warto skorzystać z aliasu bądź funkcji. Można też nieco rozwinąć powyższą metodę aby wyświetlić wynik w wybrany sposób, np.:
$ echo -e "AT+CSQ\r" >/dev/ttyUSB2; grep -m1 "CSQ:" /dev/ttyUSB2 | sed "s/+CSQ/Moc sygnału/g" Moc sygnału: 7,99 $ echo -e "AT+CSQ\r" >/dev/ttyUSB2; grep -m1 "CSQ:" /dev/ttyUSB2 | sed -re "s/\+CSQ: ([0-9]*),([0-9]*)/Moc sygnału: \1 (stopa błędu: \2)/g" Moc sygnału: 7 (stopa błędu: 99)
Moc sygnału odczytujemy następująco — pierwsza liczba przed przecinkiem, to wskaźnik mocy sygnału [16], jego wartość oznacza:
- 0 — 113 dBm lub gorszy
- 1 — 111 dBm
- 2–30 — 109–53 dBm
- 31 — 51 dBm lub lepszy
Druga liczba to stopa błędu wyrażona w procentach. Wartość „99” oznacza, że jest ona nieznana lub nie została wykryta.
Sprawdzanie stanu i doładowanie konta
Istnieje w sieci programik / skrypt Onlitor [17], który pozwala na tego typu operacje w sieci Play. W moim przypadku — mojego systemu — program ten nie spełnił swoich założeń — nie działał. Tzn. program się uruchamia, ale nie spełnia swojej funkcji.
Za pomocą kodów ekspresowych można sprawdzić stan konta, doładować je, itd.
Najprościej ich można użyć w programie gsm-ussd [18] — pobieramy odpowiednią wersję (dla Debiana dostępny jest pakiet deb) i instalujemy.
W internecie można znaleźć wykaz kodów ekspresowych [19] dla poszczególnych sieci, w skrócie:
Era:
*101#
— stan konta*111*kod doładowania#
— uzupełnienie konta
Plus:
*100#
— stan konta*121#
— ważność pakietów*125#
— ważność konta*123*kod doładowania#
— uzupełnienie konta*101*11*01#
— aktywacja roamingu
Play:
*101#
— stan konta*100*kod doładowania#
— uzupełnienie konta
Orange
*124*#
— stan konta*125*kod doładowania#
— uzupełnienie konta
Przykłady zastosowania programu — tekstowo:
$ gsm-ussd -m /dev/ttyUSB2 --no-cleartext "*101#"
Kwota brutto 5.19 PLN, polacz. wychodz. do 07-01-2011, +1 mies. na odbieranie.
Oraz graficznie:
$ xussd -m /dev/ttyUSB2 --no-cleartext
Pojawi się okno, w którym należy wpisać kod.
W pewnych przypadkach, z nieustalonych powodów, gsm-ussd
nie tłumaczy zakodowanej w PDU odpowiedzi od operatora. Można w takim wypadku przekodować wyjście programu w trybie debugowania za pomocą skryptu pdu2ira
.
Najpierw pobieramy skrypt do katalogu /usr/local/bin
i nadajemy mu prawo do wykonywania:
# wget http://dug.net.pl/plik/53/pdu2ira.sh -O /usr/local/bin/pdu2ira
# chmod +x /usr/local/bin/pdu2ira
Potem będzie można odczytać odpowiedzi operatora za pomocą:
$ gsm-ussd -m /dev/ttyUSB2 --no-cleartext "*124*#" -d 2>&1| awk -F'"' '/+CUSD:/ {print $2}' | xargs pdu2ira
Jeszcze jedna, ważna uwaga: jeśli na karcie mamy kwoty groszowe — np. 0,06 zł — nie uda się (przynajmniej u części operatorów) zestawić połączenia z internetem. Nie należy jednak się martwić — aby doładować konto wystarczy włączyć modem (dioda niebieska lub zielona, pojedyncze impulsy co 3 s)
Mimo, że nie jesteśmy połączeni z siecią, gsm-ussd
wyśle odpowiedni kod do operatora i pozwoli na doładowanie konta.
Kontrola transferu
Ponieważ w internecie mobilnym płaci się za każdy bajt transferu, dobrze jest mieć kontrolę na ilością pobieranych i wysyłanych danych.
Szczegółowy poradnik jak to zrealizować dostępny jest w osobnym tekście Statystyki wykorzystania łącza za pomocą vnStat [20].
Uruchamianie połączenia przy starcie systemy
Prosty skrypt (nie jest to najbardziej eleganckie rozwiązanie, aczkolwiek działa), który pozwala na uruchomienie połączenia podczas startu systemy, jeśli modem jest podłączony (i prawidłowo wykryty) oraz nie ma innego połączenia z internetem.
Do /etc/rc.local
należy wkleić przed linijką exit 0
:
echo -n "Running 3G modem... "
if [ -c /dev/ttyUSB0 ] && ! ping -c1 -w1 208.67.222.222 >/dev/null 2>&1; then
echo "Yes (this may take few seconds)"
(
wvdial modem-start >/dev/null 2>&1 || true
sleep 5
pon.wvdial era
## OpenDNS user? Uncomment below lines
# echo "nameserver 208.67.222.222" >/etc/resolv.conf
# echo "nameserver 208.67.220.220" >>/etc/resolv.conf
) &
else
echo "No (modem not plugged in, or network already available)"
fi
Najpierw sprawdzi on czy jest dostępne urządzenie znakowe /dev/ttyUSB0
, jeśli tak — czy adres 208.67.222.222 (jeden z serwerów OpenDNS) odpowie na ping. Gdy nie odpowie (czyli najpewniej nie ma dostępnego internetu) — skrypt uruchomi połączenie przez modem.
W razie potrzeby należy zmodyfikować powyższy skrypt dla swojej konfiguracji.
Tekst zrealizowany przy bardzo wydatnej współpracy azhaga.