Huawei E122 - instalacja i obsługa modemu 3G

Kategoria: Artykuły, etykiety: modemy, internet, huawei

Dodany: 2010-12-25 18:18 (zmodyfikowany: 2012-05-21 17:40)
Przez: Bodzio

Wyświetleń: 67934

Huawei E122 to solidny (opinia jednego z użytkowników, 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:

  1. Instalacja i uruchmienie
  2. Konfiguracja połączenia
  3. Uruchomienie połączenia
  4. Obsługa dodatkowych funkcji

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 — uruchomienie demona pppd i uruchomienie interfejsu ppp0, który pozwala na połączenie się z internetem
  • usb-modeswitch — przełączenie urządzenia w tryb modemu, inaczej widziane jest jako wirtualny CD-ROM ze sterownikami dla Windows
  • wvdial — komunikacja z modemem i zestawienie połączenia

Opcjonalnie można zainstalować jeszcze pakiet comgt 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. 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:

  1. 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.

  2. Za pomocą wvdial (jeśli jest dodany odpowiedni wpis w wvdial.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
    
  3. 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, 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, 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 — pobieramy odpowiednią wersję (dla Debiana dostępny jest pakiet deb) i instalujemy.

W internecie można znaleźć wykaz kodów ekspresowych 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.

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.

OSnews Wykop Blip Flaker Kciuk Śledzik Facebook Identi.ca Twitter del.icio.us Google Bookmarks