Połączenie GPRS przez bluetooth z Nokią 6310i

Połączenie PPP przez bluetooth

UWAGA: to jest stara wersja strony. Idź do tej strony

Połączenie wykonuje się bardzo prosto; w sumie prawie wszystko już jest w systemie. Ja użyłem Bluetooth Dongle USB Dlinka DBT-120, Nokii 6310i. Oczywiście debian sid, jądro 2.6.11.11.

Przygotowania

W nokii: włączyć bluetootha oraz identyfikacje przez inne urządzenia (wersja softu nokii - V5.52. W przypadku starszych wersji softu mogą być problemy z połączeniem poprzez bluetooth - w takim przypadku należy wykonać upgrade firmware). Trzeba przekompilować jajko z włączeniem blutetoot'a, ppp no i oczywiście USB. Moja przykładowa konfiguracja:


    CONFIG_BT=m
    CONFIG_BT_L2CAP=m
    CONFIG_BT_SCO=m
    CONFIG_BT_RFCOMM=m
    CONFIG_BT_RFCOMM_TTY=y
    CONFIG_BT_BNEP=m
    CONFIG_BT_BNEP_MC_FILTER=y
    CONFIG_BT_BNEP_PROTO_FILTER=y
    CONFIG_BT_HIDP=m
    CONFIG_BT_HCIUSB=m
    CONFIG_BT_HCIUSB_SCO=y
    # CONFIG_BT_HCIUART is not set
    CONFIG_BT_HCIBCM203X=m
    CONFIG_BT_HCIBPA10X=m
    CONFIG_BT_HCIBFUSB=m
    CONFIG_BT_HCIDTL1=m
    CONFIG_BT_HCIBT3C=m
    CONFIG_BT_HCIBLUECARD=m
    CONFIG_BT_HCIBTUART=m
    CONFIG_BT_HCIVHCI=m

    CONFIG_PPP=m
    # CONFIG_PPP_MULTILINK is not set
    CONFIG_PPP_FILTER=y
    CONFIG_PPP_ASYNC=m
    CONFIG_PPP_SYNC_TTY=m
    CONFIG_PPP_DEFLATE=m
    CONFIG_PPP_BSDCOMP=m
    CONFIG_PPPOE=m
    CONFIG_PPPOATM=m

Po podłączeniu bluetootha system powinien go wykryć. W debianie instalujemy pakiety bluez-utils, bluez-pin, ppp. W pliku /etc/bluetooth/pin wprowadzamy pin w postaci



    PIN:1234

Przy połączeniu zostaniemy zapytani przez nasz telefon właśnie przez ten pin.

Uruchomienie

Sprawdzamy czy w ogóle bluetooth jest widoczny:


    # hciconfig -a
    hci0: Type: USB
                                BD Address: XX:XX:XX:XX:XX:XX ACL MTU: 192:8 SCO MTU: 64:8
                                UP RUNNING PSCAN ISCAN
                                RX bytes:5046 acl:147 sco:0 events:212 errors:0
                                TX bytes:3835 acl:127 sco:0 commands:52 errors:0
                                Features: 0xff 0xff 0x0f 0x00 0x00 0x00 0x00 0x00
                                Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
                                Link policy: RSWITCH HOLD SNIFF PARK
                                Link mode: SLAVE ACCEPT
                                Name: 'localhost-0'
                                Class: 0x3e0100
                                Service Classes: Networking, Rendering, Capturing
                                Device Class: Computer, Uncategorized
                                HCI Ver: 1.1 (0x1) HCI Rev: 0x20d LMP Ver: 1.1 (0x1) LMP Subver: 0x20d
                                Manufacturer: Cambridge Silicon Radio (10)

XX:XX:XX:XX:XX:XX to mac adres naszego bluetootha. Nazwa to nazwa naszego hosta + numer interfejsu. Następnie:


    # hcitool scan
        Scanning ...
     YY:YY:YY:YY:YY:YY Nokia 6130i

YY:YY:YY:YY:YY:YY to mac adres naszego telefonu. Nazwa jest taka jak ustawiona w telefonie. Jeżeli widoczne jest więcej urządzeń to całkiem możliwe, że ktoś w okolicy ma włączony bluetooth w telefonie :). W pliku /etc/bluetooth/rfcomm.conf zaszywamy na stałe ten mac adres żeby specjalnie nie robić ustawień z każdym razem:


    rfcomm0 {
                bind yes;
                device YY:YY:YY:YY:YY:YY;
                channel 1;
                comment "Nokia 6310i";
    }

Oczywiście YY:YY:YY:YY:YY:YY trzeba zamienić na mac adres telefonu. Zostało jeszcze zrobić odpowiednie skrypty startowe. Można to wykonać przy pomocy pppconfig lub stworzyć je ręcznie:


    # cat /etc/chatscripts/gprs
    TIMEOUT 5
    ECHO ON
    ABORT '\nBUSY\r'
    ABORT '\nERROR\r'
    ABORT '\nNO ANSWER\r'
    ABORT '\nNO CARRIER\r'
    ABORT '\nNO DIALTONE\r'
    ABORT '\nRINGING\r\n\r\nRINGING\r'
    '' \rAT
    TIMEOUT 12
    OK ATE1
    OK 'AT+CGDCONT=1,"IP","www.plusgsm.pl","",0,0'
    OK ATD*99***1#
    CONNECT ""

    # cat /etc/ppp/peers/gprs
    /dev/rfcomm0 57600
    connect '/usr/sbin/chat -v -f /etc/chatscripts/gprs'
    noauth
    defaultroute
    debug
    noipdefault
    local
    ipcp-accept-local
    novj
    novjccomp
    lcp-echo-failure 10000
    lcp-echo-interval 1000

Skrypty są dla PlusGSM, dla innego trzeba zmienić linijkę 'AT+CGDCONT=1,"IP","www.plusgsm.pl","",0,0' na taką jaka powinna być dla danego operatora.
Niekiedy należy jeszcze dodać ATZ przed ATE1 w celu zresetowania modemu w telefonie.

Uruchomienie

Zostaje tylko wykonanie połączenia. Na sposób debianowy jest to:


    # pon gprs

W logach powinno być mniej wiecej coś takiego:


Jul 10 10:23:03 localhost pppd[6242]: pppd 2.4.3 started by root, uid 0
Jul 10 10:23:23 localhost chat[6246]: timeout set to 5 seconds
Jul 10 10:23:23 localhost chat[6246]: abort on (\nBUSY\r)
Jul 10 10:23:23 localhost chat[6246]: abort on (\nERROR\r)
Jul 10 10:23:23 localhost chat[6246]: abort on (\nNO ANSWER\r)
Jul 10 10:23:23 localhost chat[6246]: abort on (\nNO CARRIER\r)
Jul 10 10:23:23 localhost chat[6246]: abort on (\nNO DIALTONE\r)
Jul 10 10:23:23 localhost chat[6246]: abort on (\nRINGING\r\n\r\nRINGING\r)
Jul 10 10:23:23 localhost chat[6246]: send (^MAT^M)
Jul 10 10:23:23 localhost chat[6246]: timeout set to 12 seconds
Jul 10 10:23:23 localhost chat[6246]: expect (OK)
Jul 10 10:23:23 localhost chat[6246]: ^MAT^M^M
Jul 10 10:23:23 localhost chat[6246]: OK
Jul 10 10:23:23 localhost chat[6246]: -- got it
Jul 10 10:23:23 localhost chat[6246]: send (ATE1^M)
Jul 10 10:23:23 localhost chat[6246]: expect (OK)
Jul 10 10:23:23 localhost chat[6246]: ^M
Jul 10 10:23:23 localhost chat[6246]: ATE1^M^M
Jul 10 10:23:23 localhost chat[6246]: OK
Jul 10 10:23:23 localhost chat[6246]: -- got it
Jul 10 10:23:23 localhost chat[6246]: send (AT+CGDCONT=1,"IP","www.plusgsm.pl","",0,0^M)
Jul 10 10:23:24 localhost chat[6246]: expect (OK)
Jul 10 10:23:24 localhost chat[6246]: ^M
Jul 10 10:23:24 localhost chat[6246]: AT+CGDCONT=1,"IP","www.plusgsm.pl","",0,0^M^M
Jul 10 10:23:24 localhost chat[6246]: OK
Jul 10 10:23:24 localhost chat[6246]: -- got it
Jul 10 10:23:24 localhost chat[6246]: send (ATD*99***1#^M)
Jul 10 10:23:24 localhost chat[6246]: expect (CONNECT)
Jul 10 10:23:24 localhost chat[6246]: ^M
Jul 10 10:23:27 localhost chat[6246]: ATD*99***1#^M^M
Jul 10 10:23:27 localhost chat[6246]: CONNECT
Jul 10 10:23:27 localhost chat[6246]: -- got it
Jul 10 10:23:27 localhost chat[6246]: send (^M)
Jul 10 10:23:27 localhost pppd[6242]: Serial connection established.
Jul 10 10:23:27 localhost pppd[6242]: using channel 1
Jul 10 10:23:27 localhost pppd[6242]: Using interface ppp0
Jul 10 10:23:27 localhost pppd[6242]: Connect: ppp0 <--> /dev/rfcomm0
Jul 10 10:23:28 localhost pppd[6242]: sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0xa0458d44> <pcomp> <accomp>]
Jul 10 10:23:28 localhost pppd[6242]: rcvd [LCP ConfRej id=0x1 <magic 0xa0458d44> <pcomp> <accomp>]
Jul 10 10:23:28 localhost pppd[6242]: sent [LCP ConfReq id=0x2 <asyncmap 0x0>]
Jul 10 10:23:28 localhost pppd[6242]: rcvd [LCP ConfAck id=0x2 <asyncmap 0x0>]
Jul 10 10:23:30 localhost pppd[6242]: rcvd [LCP ConfReq id=0x0 <auth pap> <mru 1500> <asyncmap 0xa0000>]
Jul 10 10:23:30 localhost pppd[6242]: sent [LCP ConfAck id=0x0 <auth pap> <mru 1500> <asyncmap 0xa0000>]
Jul 10 10:23:30 localhost pppd[6242]: sent [LCP EchoReq id=0x0 magic=0x0]
Jul 10 10:23:30 localhost pppd[6242]: sent [PAP AuthReq id=0x1 user="localhost" password=<hidden>]
Jul 10 10:23:30 localhost pppd[6242]: rcvd [LCP EchoRep id=0x0 00]
Jul 10 10:23:30 localhost pppd[6242]: lcp: received short Echo-Reply, length 1
Jul 10 10:23:30 localhost pppd[6242]: rcvd [PAP AuthAck id=0x1 ""]
Jul 10 10:23:30 localhost pppd[6242]: PAP authentication succeeded
Jul 10 10:23:30 localhost kernel: PPP BSD Compression module registered
Jul 10 10:23:30 localhost kernel: PPP Deflate Compression module registered
Jul 10 10:23:30 localhost pppd[6242]: sent [CCP ConfReq id=0x1 <deflate 15> <deflate(old#) 15> <bsd v1 15>]
Jul 10 10:23:30 localhost pppd[6242]: sent [IPCP ConfReq id=0x1 <addr 0.0.0.0>]
Jul 10 10:23:30 localhost pppd[6242]: rcvd [IPCP ConfReq id=0x0 <addr 10.6.6.6>]
Jul 10 10:23:30 localhost pppd[6242]: sent [IPCP ConfAck id=0x0 <addr 10.6.6.6>]
Jul 10 10:23:30 localhost pppd[6242]: rcvd [LCP ProtRej id=0x0 80 fd 01 01 00 0f 1a 04 78 00 18 04 78 00 15 03 2f]
Jul 10 10:23:30 localhost pppd[6242]: Protocol-Reject for 'Compression Control Protocol' (0x80fd) received
Jul 10 10:23:32 localhost pppd[6242]: rcvd [IPCP ConfNak id=0x1 <addr 172.17.66.153>]
Jul 10 10:23:32 localhost pppd[6242]: sent [IPCP ConfReq id=0x2 <addr 172.17.66.153>]
Jul 10 10:23:32 localhost pppd[6242]: rcvd [IPCP ConfAck id=0x2 <addr 172.17.66.153>]
Jul 10 10:23:32 localhost pppd[6242]: local IP address 172.17.66.153
Jul 10 10:23:32 localhost pppd[6242]: remote IP address 10.6.6.6
Jul 10 10:23:32 localhost pppd[6242]: Script /etc/ppp/ip-up started (pid 6276)
Jul 10 10:23:32 localhost pppd[6242]: Script /etc/ppp/ip-up finished (pid 6276), status = 0x0

Można jeszcze dla pewności wykonać ifconfig, sprawdzić czy jest interfejs ppp0 i spróbować wykonać np. ping www.google.pl (niestety, czasy są rzędu 700 - 1000ms).
Jeżeli wszystko działa to można usunąć opcje debug z ppp oraz -v z wywołania chat, będzie mniej informacji w logach.
Rozłączenie połączenia następuje po wywołaniu polecenia:


    # poff gprs

Zostaje nam zrobienie tylko kosmetyki - dodanie userów do grupy dialup żeby mogli ze swojego konta uruchamiać połączenie oraz ewentualnie skonfigurowanie appletu z GNOME, żeby mieć "ładny" graficzny klikany program do połączenia.