internecik.com
my home website

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.