Dostęp do Internetu przez telefon z Bluetooth i GPRS

Wczorajsza awaria u mojego providera, która trwa do dziś (i podobno potrwa do 21:00) uświadomiła mi, że modemy kablowe to nie jedyny sposób łączenia się z Internetem. Większość współczesnych telefonów posiada interfejsy bezprzewodowe Bluetooth i IrDA oraz GPRS i CSD. Korzystając z komputera z adapterem Bluetooth (np. na USB) i telefonu możemy zestawić połączenie z Internetem przez publiczny APN. W Polsce każdy operator GSM posiada APN poprzez który można łączyć się z internetem.

Ponieważ używam systemu operacyjnego Debian GNU/Linux i telefonu w sieci Orange poniższy opis będzie związany z konfiguracją w takim właśnie przypadku. Dla pozostałych operatorów i innych dystrybucji niektóre kroki będą inne, ale sposób konfiguracji nie powinien bardzo się różnić.

Bluetooth

Komputer i telefon komórkowy należy ze sobą sparować. Jest to krok konieczny, a sposób jego wykonania jest opisany w każdej instrukcji podłączania jakiegokolwiek urządzenia Bluetooth do komputera z Linuksem więc nie będę tego omawiał.

Gdy telefon i komputer komunikują się bez przeszkód należy poszukać kanału usługi portu szeregowego w telefonie. Wystarczy jeden port szeregowy. Możemy włączyć na chwilę "widoczność" telefonu i wydać komendę:

$ sdptool browse

Jeśli znamy adres sprzętowy naszego telefonu wystarczy podać go jako kolejny parametr (w tym przypadku urządzenie nie musi być "widoczne").

Naszym oczom ukaże się lista usług telefonu. Najbardziej interesujący na fragment wygląda tak:

Service Name: Serial Port
Service RecHandle: 0x10003
Service Class ID List:
  "Serial Port" (0x1101)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 2

Teraz dopisujemy do pliki konfiguracyjnego /etc/bluetooth/rfcomm.conf:

rfcomm0 {
    bind yes;
    device 00:??:??:??:??:??; # adres sprzętowy telefonu wyświetlony przez sdptool
    channel 2; # numer kanału wyświetlony przez sdptool dla portu szeregowego
    comment "Serial Port";
}

Restartujemy usługę bluetooth:

# invoke-rc.d --force bluetooth restart

Telefon będzie obsługiwany tak ja modem podłączony przez port szeregowy. Jako pliku urządzenia użyjemy /dev/rfcomm0.

IrDA

Dla połączeń IrDA plikiem urządzenia jest /dev/ircomm0. Po szczegóły konfiguracji odsyłam do Linux-IrDA project.

CSD

Choć pewnie wszyscy czekają na sposób konfiguracji połączeń GPRS zacznę od CSD. Łatwiej je skonfigurować i przetestować, a skonfigurowane już połączenie CSD łatwo przerobić na działające połączenie GPRS.

Połączenia CSD (tzw. "wdzwaniane") przesyłają dane protokołem PPP. W systemie GNU/Linux za obsługe połączeń PPP odpowiada demon pppd.

Konfiguracja pppd

Aby skonfigurować pppd tworzymy w katalogu /etc/ppp/peers nowy plik opisujący połączenie (nazwałem go orange-csd) z następującą zawartością:

user "internet"
connect "/usr/sbin/chat -v -f /etc/chatscripts/pap -T +48501808080"

/dev/rfcomm0
57600

noipdefault
usepeerdns
defaultroute

persist

noauth

Jeśli nie korzystasz z sieci Orange, prawdopodobnie powinieneś zmienić login (pierwsza linia) i numer telefonu (druga linia) na właściwy dla danej sieci.

Następnie dla podanego w tym pliku loginu dopisujemy w pliku /etc/ppp/chap-secrets odpowiednie hasło. Dla Orange (hasło i login są takie same) będzie to linia:

internet * internet *

W pliku chap-secrets cztery pola oznaczają po kolei: login, serwer, hasło i adres IP. Jeśli dostawca wymaga protokołu PAP zamiast CHAP hasło wpisujemy do /etc/ppp/pap-secrets.

Konfiguracja skryptów sieciowych

Konfiguracja pppd jest niezależna od dystrybucji. Połączenie PPP możemy nawiązać poleceniem:

pppd call orange-csd

Jeśli chcemy aby ifup i ifdown obsługiwały również połączenia PPP należy zainstalować pakiet ifscheme i resolvconf, a następnie dopisać do /etc/network/interfaces:

iface ppp0 inet ppp
mapping ppp0
        script ifscheme-mapping
        map orange-csd ppp0-orange-csd
        map orange-gprs ppp0-orange-gprs

iface ppp0-orange-csd inet ppp
        provider orange-csd

iface ppp0-orange-gprs inet ppp
        provider orange-gprs

Przełączanie pomiędzy trybem GPRS i CSD następuje poprzez wydanie jednego z poleceń:

# ifscheme orange-gprs
# ifscheme orange-csd

GPRS

Jeśli CSD działa (nie działa, albo pominęliśmy jego konfigurację - niepotrzebne skreślić) możemy skonfigurować telefon (o ile nigdy tego nie robiliśmy i nigdy nie korzystaliśmy z Internetu na telefonie np. przez program Opera Mini). Jeśli telefon kupiliśmy w salonie i nic nie zmienialiśmy powinien być już skonfigurowany. Po opis konfiguracji telefonu odsyłam na stronę operatora lub do instrukcji obsługi telefonu. Mając działające połączenie GPRS w telefonie możemy przystąpić do konfigurowania Linuksa.

Konfiguracja pppd

Konfiguracja pppd jest analogiczna jak dla CSD. Tworzymy plik /etc/ppp/peers/orange-gprs z następującą zawartością:

user "internet"
connect "/usr/sbin/chat -v -f /etc/chatscripts/orange-gprs"
disconnect "/usr/sbin/chat -v -f /etc/chatscripts/orange-gprs-off"

/dev/rfcomm0
57600

noipdefault
usepeerdns
defaultroute

persist

noauth

Konfiguracja chat

Połączenia CSD nie potrzebowały skryptów chat do konfiguracji telefonu. W przypadku GPRS jest inaczej. Konieczne jest wybranie konfiguracji telefonu i nazwy APN. Utwórzmy dwa skrypty. Pierwszy znich - /etc/chatscripts/orange-gprs połaczy nas z APN:

TIMEOUT 10
ECHO ON
ABORT "NO CARRIER"
ABORT "NO DIALTONE"
ABORT "ERROR"
ABORT "NO ANSWER"
ABORT "BUSY"
'' 'rATZ'
OK AT+CGDCONT=6,"IP","internet"
OK ATD*99#
CONNECT ``

Najważniejsza w tym skrypcie jest komenda AT+CGDCONT tworząca kontekst PDP. Jej parametry to numer kontekstu (od 1 do 32), tryb pracy (do połączeń z Internetem będzie to "IP") oraz nazwa APN. Nazwa APN jest specyficzna dla sieci GPRS (operatora). Numer kontekstu jest istotny jedynie dla styku DTE-DCE (komputer-telefon) i odpowiada on numerowi konfiguracji połączenia GPRS w telefonie.

Drugi - /etc/chatscripts/orange-gprs-off - będzie służył do rozłączania sesji GPRS:

ABORT "NO CARRIER"
ABORT "NO DIALTONE"
ABORT "ERROR"
ABORT "NO ANSWER"
ABORT "BUSY"
"" "K"
"" "+++ATH"

Konfiguracja skryptów sieciowych

Połączenie GPRS możemy zainicjować poleceniem:

pppd call orange-gprs

Konfiguracja /etc/network/interfaces jest identyczna jak w przypadku CSD.

Podsumowanie

Osoby używające innych dystrybucji powinny dostosować konfigurację do specyfiki dystrybucji. Konfiguracja pppd i chata nie wymaga poprawek (poza ścieżkami oczywiście, jeśli są inne należy je poprawić). Konfiguracja ifup i ifdown przyda się tylko w Debianie, Ubuntu i podobnych. Dla innych niż Orange sieci GSM zmienić należy numer telefonu dla CSD, numer konfiguracji telefonu oraz nazwę APN dla GPRS oraz login i hasło w obu przypadkach.

Telefony

Prędkość połączenia szeregowego została dobrana eksperymentalnie na zasadzie "najwyższa przy której jeszcze działa". Prawdopodobnie inne telefony mogą obsługiwać wyższe prędkości niż 57600. Stabilność połączenia podnosi również wyłączenie użycia protokołu PPP Link Control Protocol (LCP):

lcp-echo-interval 0

W modelu Sony Ericsson T610 jest ona wręcz konieczna. Niektórzy polecają ustawienie jak najdłuższego czasu pomiędzy ramkami LCP (np. maksymalnego - 65535). Należy jednak pamiętać, że jest to czas (0 wyłącza użycie protokołu LCP). Długi czas co prawda, ale gdy upłynie modem i tak nas rozłączy. W połączeniu z opcją lcp-echo-failure 4 będzie on cztery razy dłuższy, ale ryzyko rozłączenia jedynie odwlecze się w czasie (65535 sekund to około 18 godzin).

8 comments to Dostęp do Internetu przez telefon z Bluetooth i GPRS

  • b. dobra instrukcja. dla sieci plusgsm wystarczy zmienic linijke
    OK AT+CGDCONT=6,”IP”,”internet”

    na:

    OK AT+CGDCONT=1,”IP”,”www.plusgsm.pl”

  • a dla bardziej leniwych: http://www.globalgprs.strony.pl/
    osobiście używam. Debian + Nokij E50 po usbowym kablu… działa

  • Instrukcja pewnie dobra, ale tak naprawdę – po co tyle rzeźby? Połączeń via GPRS/UMTS używam już od dłuższego czasu i nigdy jeszcze nie grzebałem w skryptach ppp/chat/itp. W sumie wystarczy tylko znać lokalizację interfejsu sprzętowego, czyli np. /dev/rfcomm0 – a praktycznie całą resztę można skonfigurować poprzez GUI. No chyba, że co distro to obyczaj, bo ja używam Fedory, więc nie wiem jak GUI do sterowania interfejsami sieciowymi działają w innych distro.

  • Jeśli chodzi o program Global GPRS to nie podoba mi się sposób dystrybucji (jako jeden binarny plik z zaszytą wewnątrz konfiguracją, bez dostępu do źródeł) i licencjonowania (jaką licencją jest ten program objęty? w pliku readme, ani na stronie nic nie znalazłem) tego programu. Ktoś wykonał spory kawał dobrej roboty, ale udostępnił to światu w formie z której nie każdy może (lub chce) skorzystać. Gdyby chociaż otworzył bazę konfiguracji, jeśli już źródła muszą pozostać niejawne.

  • Global GPRS ja sam też nigdy nie używałem, a w moim komentarzu wspomniałem o standardowych narzędziach systemowych do kontrolowania interfejsów sieciowych. W Fedorze/RH jest to system-config-network. W moim blogu mam to opisane, choć to dość stary wpis, gdy jeszcze używałem GNOME PPP.

  • LeM

    Jest konkurencja GlobalUMTS (wersji rozwojowej GlobalGPRS): pGPRS pana Kalickiego rozpowszechniany w dużo milszej formie.

  • rzabcio

    Zachciało mi się dzisiaj skonfigurować połączenie GPRS w Linuksie. Gimnastykowałem się z opisami podobnymi do powyższego, dopóki przy uruchomieniu “udevmonitora” nie zobaczyłem, jak przy podłączeniu mojego SE K550i pojawia się coś w rodzaju: “/net/usb”. Zaskoczony, kliknąłem na applet Net Monitora (nm-applet). Okazało się, że poza wpisem “Sieć kablowa (eth0)” pojawił się wpis “Sieć kablowa (usb0)”. Póki co wyszarzony. Włączyłem w telefonie opcję “USB internet” i udało się bez żadnego problemu przełączyć na sieć w telefonie. Nieźle się zaskoczyłem.

    Brakuje tylko licznika danych.

  • zucho

    Ostatnia informacja “rzabcia” jest prosta i skuteczna, z K810i zadziałało bez problemu

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

  

  

  

This site uses Akismet to reduce spam. Learn how your comment data is processed.