Internet przez komórkę

Niektóre drobne rzeczy, które zwykły po prostu działać w innych systemach, są niebywale skomplikowane i upierdliwe pod Linuksem. Taka rzecz to połączenie z internetem za pośrednictwem telefonu komórkowego.

Oczywiście, dla przeciętnego użytkownika Ubuntu nie stanowi to żadnego problemu — dopóki sprzęt jest rozpoznawany i działa. Podobnie jest z Gnome czy KDE, twórcy tych środowisk przygotowali odpowiednie nakładki na BlueZ, jednakże ja nie używam żadnego z tych środowisk, w związku z tym pierwszą próbę przeprowadziłem „na małpkę”, czyli poprzez zainstalowanie nakładki Blueman, która prawie zadziałała. Nakłada zachowywała się bardzo przyzwoicie, wykryła telefon, pozwoliła na przeglądanie plików w telefonie, ale poległa przy próbie połączenia z Siecią. Czarę goryczy przelał fakt znarowienia się programu przy ponownej próbie komunikacji z telefonem.

Zacząłem więc brnąć w spiralę frustracji i piekło konfiguracji by po paru godzinach w pełni cieszyć się możliwością serfowania po sieci z pomocą telefonu komórkowego.

Dla potomności i własnej sklerozy zapisuję więc poszczególne kroki.

Główni bohaterowie

  1. Telefon Nokia 5220 XpressMusic
  2. Komputer Acer Aspire One + Gentoo Linux na pokładzie.
  3. Dongiel bluetooth Trust (najtańszy, jaki udało mi się kupić na giełdzie swego czasu)

Telefon działa w sieci Orange, ale myślę, że dla innych sieci powinno być analogicznie.

Oprogramowanie

Przede wszystkim konieczne będzie skonfigurowanie kernela (dodanie modułów bt, wsparcia dla USB itp.), zgodnie z dokumentacją Gentoo o ile wcześniej się tego nie zrobiło. Cała reszta opisu w tejże dokumentacji dotyczy niestety starszej wersji BlueZ (2.x oraz 3.x), dlatego część z tych informacji jest niestety nieaktualna. Można też od razu dodać wsparcie dla PPP:

Device drivers  --->
    [*] Networking device support  --->
        <M>   PPP (point-to-point protocol) support
        [*]     PPP filtering
        <M>     PPP support for async serial ports
        <M>     PPP support for sync tty ports
        <M>     PPP Deflate compression
        <M>     PPP BSD-Compress compression

Jeżeli nie jest ustawiona, dodać flagę bluetooth do flag USE w /etc/make.conf i (najprościej) wywołać komendę:

root@aspire1 ~ # emerge -vaNDu world

Jako zależność zostanie skompilowany bluez w wersji (na dzień 2010-11-23) 4.75. Po kompilacji, wystarczy uruchomić usługę:

root@aspire1 ~ # /etc/init.d/bluetooth start

lub włożyć dongiel do gniazda USB; usługa powinna wystartować automatycznie.

Kolejnym niezbędnym programem będzie pppd, choć dla własnej wygody zainstalowałem wvdial:

root@aspire1 ~ # emerge wvdial -va

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild  N    ] net-dialup/ppp-2.4.4-r25  USE="gtk pam -activefilter -atm -dhcp -eap-tls -ipv6 -mppe-mppc -radius" 0 kB
[ebuild  N    ] virtual/c++-tr1-functional-0  0 kB
[ebuild  N    ] net-libs/wvstreams-4.6.1-r1  USE="dbus pam ssl -debug -doc" 0 kB
[ebuild  N    ] net-dialup/wvdial-1.61  0 kB

Total: 4 packages (4 new), Size of downloads: 0 kB

Would you like to merge these packages? [Yes/No]

Konfiguracja BlueZ

Najbardziej upierdliwą rzeczą jest skonfigurowanie komunikacji pomiędzy telefonem a komputerem. Ponieważ w międzyczasie zmienił się dość istotnie sposób w jaki BlueZ utrzymuje konfigurację, postaram się to opisać jak najdokładniej.

Po uruchomieniu serwisu bluetooth, w katalogu /var/lib/bluetooth/ zostanie utworzony katalog o nazwie takiej samej jak adres sprzętowy dongla, załóżmy AA:AA:AA:AA:AA:AA. W tymże katalogu znajduje się plik config, który domyślnie zawiera:

name aspire1-0
class 0x4800fe

do którego należy dopisać linię:

mode discoverable

po czym spróbować wyszukać komputer z donglem przy pomocy telefonu. W przypadku niepowodzenia, należy upewnić się, by urządzenie było wykrywalne (uaktywniona flaga ISCAN) oraz miało możliwość podłączenia doń (uaktywniona flaga PSCAN). W moim przypadku musiałem ręcznie uaktywnić flagę ISCAN:

root@aspire1 ~ # hciconfig hci0
hci0:        Type: BR/EDR  Bus: USB
     BD Address: AA:AA:AA:AA:AA:AA  ACL MTU: 310:10  SCO MTU: 64:8
     UP RUNNING PSCAN
     RX bytes:707 acl:0 sco:0 events:26 errors:0
     TX bytes:358 acl:0 sco:0 commands:26 errors:0
root@aspire1 ~ # hciconfig hci0 piscan
root@aspire1 ~ # hciconfig hci0
hci0:        Type: BR/EDR  Bus: USB
     BD Address: AA:AA:AA:AA:AA:AA  ACL MTU: 310:10  SCO MTU: 64:8
     UP RUNNING PSCAN ISCAN
     RX bytes:720 acl:0 sco:0 events:28 errors:0
     TX bytes:365 acl:0 sco:0 commands:28 errors:0

Po tej operacji telefon powinien być w stanie wykryć komputer, choć nadal nie można się z nim sparować, ponieważ nie wiadomo jakiego hasła spodziewa się komputer. Hasło (lub, jak niektóre źródła podają: pin) należy ustalić indywidualnie względem adresu sprzętu.

Żeby znaleźć adres sprzętowy telefonu należy uaktywnić BT w telefonie, telefon musi być widoczny (powinna być dostępna odpowiednia opcja w ustawieniach) i uruchomić skanowanie na komputerze:

root@aspire1 ~ # hcitool scan
Scanning ...
     BB:BB:BB:BB:BB:BB       Nokia5220

Uzyskany w ten sposób adres należy dopisać do pliku /var/lib/bluetooth/AA:AA:AA:AA:AA:AA/pincodes:

BB:BB:BB:BB:BB:BB 123456

Następnie należy zrestartować serwis bluetooth i ponownie spróbować wyszukać urządzenie powiązane (czyli dokonać sparowania). Po podaniu właściwego pinu w telefonie, powinien pojawić się komunikat o pomyślnie dodanym urządzeniu.

Kolejna rzecz to podłączenie portu szeregowego z „modemem” w telefonie. Najpierw należy sprawdzić na którym kanale znajduje się Dial-up Networking:

root@aspire1 ~ # sdptool search DUN
Inquiring ...
Searching for DUN on BB:BB:BB:BB:BB:BB ...
Service Name: Dial-up networking
Service RecHandle: 0x10003
Service Class ID List:
  "Dialup Networking" (0x1103)
  "Generic Networking" (0x1201)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 1
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Dialup Networking" (0x1103)
    Version: 0x0100

Czyli usługa modemu znajduje się na kanale pierwszym. Można spróbować ręcznie zbindować usługę do urządzenia:

root@aspire1 ~ # rfcomm bind /dev/rfcomm0 BB:BB:BB:BB:BB:BB 1
root@aspire1 ~ # rfcomm
rfcomm0: BB:BB:BB:BB:BB:BB channel 1 clean

I już prawie jest fajnie. Celem zbindowania portu na stałe, można to zrobić w globalnym pliku konfiguracyjnym /etc/bluetooth/rfcomm.conf:

rfcomm0 {
    bind yes;
    device BB:BB:BB:BB:BB:BB;
    channel 1;
    comment "Port w telefonie Nokia 5220";
}

Po restarcie komputera, port ten zawsze będzie widoczny w /dev.

Konfiguracja wvdial

Ostatnia rzecz, jaką należy zrobić, to skonfigurować wvdial. Plik konfiguracyjny znajduje się w /etc/wvdial.conf:

[Dialer Defaults]
Modem = /dev/modem
Baud = 115200
Init1 = ATZ
Init2 = ATE0

[Dialer Orange]
Modem = /dev/rfcomm0
Init3 = AT+cgdcont=1,"IP","internet"
Phone = *99***1#
Stupid Mode = 1
Username = ppp
Password = ppp

Teraz wystarczy uruchomić wvdial:

root@aspire1 ~ # wvdial orange
--> WvDial: Internet dialer version 1.61
--> Cannot get information for serial port.
--> Initializing modem.
--> Sending: ATZ
ATZ
OK
--> Sending: ATE0
ATE0
OK
--> Sending: AT+cgdcont=1,"IP","internet"
OK
--> Modem initialized.
--> Sending: ATDT*99***1#
--> Waiting for carrier.
CONNECT
~[7f]}#@!}!} } }2}#}$@#}!}$}%\}"}&} }*} } g}%~
--> Carrier detected.  Starting PPP immediately.
--> Starting pppd at Tue Nov 23 21:57:46 2010
--> Pid of pppd: 6314
--> Using interface ppp0
--> pppd: [10]. [10].
--> pppd: [10]. [10].
--> pppd: [10]. [10].
--> pppd: [10]. [10].
--> local  IP address 99.99.99.99
--> pppd: [10]. [10].
--> remote IP address 6.6.6.6
--> pppd: [10]. [10].
--> primary   DNS address 79.163.127.70
--> pppd: [10]. [10].
--> secondary DNS address 217.116.100.65
--> pppd: [10]. [10].

I to wszystko.


, Etykiety: gentoo, gsm, linux