| interNecik.com - Tymoteusz Rogalewski | start unix budownictwo |
Bluetooth + GPRS/EDGE/(UMTS) + Linux HOWTO "Uruchomienie połączenia GPRS/EDGE/UMTS przez Bluetooth" Autor Tymoteusz Rogalewski http://www.internecik.com/ wersja 2.0, 3 marca 2006 Cel, który sobie postawiłem: Notebook - IBM x20 | Moduł Bluetooth USB - Integrated System Solution Corp. KY-BT100 Bluetooth Adapter | Telefon komórkowy - Nokia 6021 (EDGE klasy 6, do 177,6 Kb/s / GPRS klasy 10, do 53,6 Kb/s) - Nokia 6230i (EDGE klasy 10, do 236,8 Kb/s / GPRS klasy 10, do 53,6 Kb/s) - Siemens S55 (GPRS klasy 10, do 53,6 Kb/s). (Wszystkie aparaty obsługują Bluetooth) | Internet - PlusGSM z GPRS/EDGE/UMTS Wprawdzie żaden z powyższych aparatół nie obsługuje UMTS, ale to bez znaczenia, gdyż GPRS/EDGE/UMTS konfiguruje się w komputerze identycznie, a komórka sama wykrywa jaka najszybsza technologia jest w zasięgu i sama się ustawia/przełącza na najszybszą z dostępnych. Moduł Bluetooth ISS KY-BT100 kupiłem w 2006.02 za około 35zł. W poprzedniej wersji HOWTO użyłem moduł Bluetake BT009S POKE2 - kosztował ok. 270zł. w sierpniu 2002r. Kompilacja kernela: (na przykładzie kernela 2.4.31) Bluetooth support ---> <M> Bluetooth subsystem support <M> L2CAP protocol support < > SCO links support <M> RFCOMM protocol support [*] RFCOMM TTY support < > BNEP protocol suppor Bluetooth device drivers ---> <M> HCI USB driver [ ] SCO (voice) support <M> HCI UART driver [*] UART (H4) protocol support [*] BCSP protocol support [*] Transmit CRC with every BCSP packet < > HCI BlueFRITZ! USB driver <M> HCI VHCI (Virtual HCI device) driver make modules modules_install Po tym będą skompilowane i zainstalowane moduły, gotowe do użycia. Kompilacja pakietów Pakiety do obsługi Bluetooth znajdują się na stronie http://www.bluez.org/ Jest jeszcze alternatywa - OpenBT, ale ja użyłem BlueZ i mi odpowiada ten pakiet. tar -xzf bluez-libs-2.25.tar.gz cd bluez-libs-2.25 ./configure make make install tar -xzf bluez-utils-2.25.tar.gz cd bluez-utils ./configure make make install Poniższe linijki dopisz do /etc/modules.conf alias net-pf-31 bluez alias bt-proto-0 l2cap alias bt-proto-2 sco alias bt-proto-3 rfcomm alias bt-proto-4 bnep alias bt-proto-5 cmtp alias tty-ldisc-15 hci_uart alias char-major-10-250 hci_vhci post-install bluez modprobe hci_usb Po jego edycji odpal: depmod -a /etc/bluetooth/hcid.conf options { autoinit yes; security auto; pairing multi; pin_helper /etc/bluetooth/pin; } device { name "Slackware"; class 0x3e0100; iscan enable; pscan enable; lm master; lp rswitch,hold,sniff,park; } To jest definicja daemona odpowiadajacego chyba za autoryzacje przy połączeniach między urządzeniami Bluetooth, ale jeżeli się myle - napisz do mnie. /etc/bluetooth/pin #!/bin/bash echo "PIN:1234" Po jego edycji odpal: chmod +x /etc/bluetooth/pin Ten plik normalnie zawiera tylko PIN, a pin_helper jest jakims skryptem napisanym w pythonie z uzyciem GTK - niektórym on nie działa, więc to jest to jedna z metod na obejście tego :) /etc/bluetooth/rfcomm.conf rfcomm0 { bind yes; device 01:01:01:01:01:01; channel 1; comment "Nokia 6021"; } rfcomm1 { bind yes; device 02:02:02:02:02:02; channel 1; comment "Siemens S55"; } rfcommX to nazwa urządzenia /dev/rfcommX, pod którym będzie podpięte połączenie z komórką. Tworzenie pliku urządzenia, jeżeli go nie masz: mknod -m 666 /dev/rfcomm0 c 216 0 mknod -m 666 /dev/rfcomm1 c 216 1 device xx:xx:xx:xx:xx:xx to MAC adres Twojej komórki. Pewnie go nie znasz, więc odpal hcitool scan, a system sam zobaczy, co jest w zasięgu i jakie ma adresy MAC. channel X to kanal, który będzie używany przy danym połączeniu. Może być tak, że dla dial-up jest 1, do PCSuite 13, itp itd. Liste dostępnych kanałów dla danej komórki można uzyskać poleceniem sdptool browse Kanał 1 jest używany domyślnie, jeżeli jest pomijany przy konfiguracji czy odpalaniu poleceń. Ja powyżej stworzyłem definicje dla moich obu komórek - jedna będzie dostępna pod /dev/rfcomm0, a druga /dev/rfcomm1 dla połączeń pppd. Włóż Bluetootha do portu USB i odpal lsusb, żeby zobaczyć czy system USB widzi moduł. Zakładam, że obsługę USB masz wkompilowaną i że działa Skrypcik startowy /etc/rc.d/rc.bluez #!/bin/sh case "$1" in 'start') echo -n "Starting BlueZ..." #zaladuj moduly modprobe hci_usb modprobe l2cap #podniesc interfejs urzadzenia bluetooth hciconfig hci0 up #odpal daemona - autoryzacji polaczen chyba czy jakos tak hcid #zbinduj dwa urzadzenia bluetoth z portami wirtualnymi tty rfcomm bind 0 rfcomm bind 1 #w tym mijescu mozesz juz sie laczyc na /dev/rfcommX echo "done." ;; 'stop') echo -n "Stopping BlueZ..." killall -TERM rfcomm rfcomm release 0 rfcomm release 1 killall -TERM hcid hciconfig hci0 down rmmod rfcomm rmmod l2cap rmmod hci_usb rmmod bluez echo "done." ;; 'restart') /etc/rc.d/rc.bluez stop /etc/rc.d/rc.bluez start ;; *) echo "Usage $0 start|stop|restart" esac Narzędzia diagnostyczne i inne przydatne: hciconfig -a - pokazuje urządzenia bluetooth uruchomione w systemie i stan o nich (cos jak ifconfig) root# hciconfig -a hci0: Type: USB BD Address: 11:11:11:11:11:11 ACL MTU: 678:8 SCO MTU: 48:10 UP RUNNING PSCAN ISCAN RX bytes:392458 acl:2410 sco:0 events:1087 errors:0 TX bytes:64340 acl:1043 sco:0 commands:26 errors:0 Features: 0xbf 0xfe 0x8d 0x78 0x08 0x18 0x00 0x00 Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 Link policy: RSWITCH HOLD SNIFF PARK Link mode: MASTER Name: 'Slackware' Class: 0x3e0100 Service Classes: Networking, Rendering, Capturing Device Class: Computer, Uncategorized HCI Ver: 1.2 (0x2) HCI Rev: 0x1fe LMP Ver: 1.2 (0x2) LMP Subver: 0x1fe Manufacturer: Integrated System Solution Corp. (57) hciconfig hci0 up hciconfig hci0 down - włącza i wyłącza urządzenie (coś jak ifconfig up/down) hcitool -i hci0 scan - wykrywa urządzenia w zasięgu i pokazuje ich nazwy oraz adresy MAC root@tygrysek:~# hcitool -i hci0 scan Scanning ... 01:01:01:01:01:01 Nokia 6021 02:02:02:02:02:02 Siemens S55 hcitool --help - popatrz sobie więcej ciekawy opcji dla poszerzenia wiedzy sdptool browse - pokazuje liste uslug (z kanałami) dla wszystkich urządzeń (np.komórek) w zasięgu (taki sniffer) root# sdptool browse Inquiring ... Browsing 01:01:01:01:01:01 ... Service Name: Dial-up networking Service RecHandle: 0x10000 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 To jest tylko fragment, bo usług komórka ma sporo. rfcomm bind rfcomm0 01:01:01:01:01:01 1 - binduje zadana komorke na kanale 1 pod /dev/rfcomm0 (od teraz mozesz odpalic np. pppd na tym urzadzeniu i laczyc sie do Inetu, jak przez zwykłego COMa) rfcomm show - pokazuje liste akualnych połączeń TTY z urządzeniami (widac czy jest tylko zbindowane, czy juz uzywane przez jakis program) root# rfcomm show rfcomm0: 01:01:01:01:01:01 channel 1 connected [tty-attached] rfcomm1: 02:02:02:02:02:02 channel 1 clean tu widać, że pierwsza komórka jest w użyciu - jest połaczona z GPRS i wirtualny port COM jest stworzony i użyty Teraz konfiguracja połączenia GPRS/EDGE/UMTS na przykłądzie PlusGSM ---/etc/ppp/options--- debug /dev/rfcomm0 #nasz port COM nie jest fizyczny #wiec nie bedziemy uzywac "modem control line" local #standardowo poniższe dwie rzeczy są ustawione na 1000 albo 1500, #ale przy takich dużych jednostkach zwisało mi połączenie #po przesłaniu kilku bajtów. Zmniejszylem sobie na takie #i dziala bez problemow teraz mtu 524 mru 524 # Serial port line speed 460800 #wylaczenie jakies osblugi sprzetowa uzywanej tylko na kablach nocrtscts nocdtrcts # To keep pppd on the terminal nodetach noauth #if no reply is received, #pppd will wait passively for a valid LCP packet passive # Connect script connect /etc/ppp/gprs-connect-bluetooth 0.0.0.0:0.0.0.0 usepeerdns noipdefault # Disconnect script disconnect /etc/ppp/gprs-disconnect #Dodaj domyslny routing przez to polaczenie #To dziala tylko, gdy nie jest zaden domyślny routing #zdefiniowany aktualnie w systemie defaultroute ---EOF---------------- ---/etc/ppp/gprs-connect--- exec /usr/sbin/chat -V -S -s \ TIMEOUT 15 \ 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' \ TIMEOUT 40 \ SAY "\nPress CTRL-C to close connection." \ SAY "\ndefining PDP context...\n" \ "" 'AT' \ OK 'ATE1' \ OK 'AT+CGDCONT=1,"IP","www.plusgsm.pl","",0,0' \ OK 'ATD*99***1#' \ CONNECT "" \ SAY "\nConnected." ---EOF---------------- ---/etc/ppp/gprs-disconnect--- exec /usr/sbin/chat -V -s -S \ ABORT "BUSY" \ ABORT "ERROR" \ ABORT "NO DIALTONE" \ SAY "\nBreak modem...\n" \ "" "\K" \ "" "+++ATH" \ SAY "\nPDP context detached\n" ---EOF---------------- Odpalamy wszystko: /etc/rc.d/rc.bluez start pppd Przy pierwszym połączeniu z komórką komórka poprosi o PIN, wpisz to, co masz w /etc/bluetooth/pin Praktyczne testy komórek i transferów: Wszystkie testy przeprowadziłem w centrum miasta Gdańska ściągając wgetem kernel z www.kernel.org Nokia 6230i - ok. 15 kB/s (pingi ok. 440 ms) Nokia 6021 - ok. 10 kB/s (pingi ok. 450 ms) Siemens S55 - ok. 5 kB/s (pingi ok. 670 ms) Powyższe wartości to przeważające szybkości. Oczywiście zdarzało się, że chwilowo było ciut lepiej lub gorzej. Pingi były robione do www.wp.pl oraz do kilku moich serwerków na szybkich łączach. Niestety SSH na EDGE podobnie jak na GPRS - troche laguje. Może na UMTSie będzie lepiej - ale o tym za kilka lat :) Mi tak dziala i tyle. Jak bedziecie mieli jakies problemy to czytajcie logi (nawet 5 razy, jak 4 bedzie za malo) a potem (a raczej najpierw) HOWTO na stronie projektu BlueZ. ...ja nie mam czasu bawic sie w szczegolowe opisywanie jeżeli czegoś totalnie nie rozumiecie, albo ja mam jakiś gupi błąd w tym HOWTO, to wtedy klikajcie do mnie opisujac problem SZCZEGÓŁOWO. |
|