Bluetooth pod Linuxem 
Tučňák s modrým zobákem 
Dnes už není pochyb o tom, že si technologie Bluetooth získala své místo na slunci a že jde o záležitost převážně užitečnou. Konečně je možné vzájemně propojovat různá zařízení různých výrobců bez toho, že by bylo nutné tahat kamsi dráty nebo držet komunikující zařízení tak, aby na sebe "viděla". 

Bezdrátové sítě Wi-Fi, svého zdánlivého konkurenta, technologie Bluetooth (dále jen BT) spíše doplňuje, než aby si navzájem překážely. Jako obvykle se uvedení různých BT adaptérů pro PC bohužel obešlo bez podpory Linuxu. Naštěstí je dnes už situace daleko růžovější než v době uvedení prvních BT zařízení na trh. V tomto článku naleznete sadu návodů na různé konfigurace BT komunikace v Linuxu. 
Zaměříme se na oficiální implementaci BT protokolu pro Linux, která se jmenuje BlueZ. Bývá součástí novějších distribucí a v jádrech 2.4.6 a vyšších by měla být standardně obsažena. Dřív než se pustíme do detailů, stručně se zmíním o samotném standardu Bluetooth - jde o systém pro bezdrátovou komunikaci zařízení spotřební elektroniky a počítačů. Zde je asi největší rozdíl proti standardu Wi-Fi, který je zřetelně zaměřen na počítače, zatímco BT má sloužit k propojení všeho, v čem je ukryt procesor. Dosahem a určením je BT blíže standardu IrDA, založenému na přenosu dat pomocí infračerveného záření. Základní dosah zařízení BT je podobný jako v případě IrDA a způsob použití často také. Zjevná inspirace úspěchem IrDA se odrazila také v přijetí některých ze standardů IrDA. 
Díky vlastnostem rádiových vln je použití BT pohodlnější než infrapřenos. Nemusíte zařízení natáčet IrDA portem k sobě, nemusíte je dokonce ani vytahovat z kapes. Je také pravděpodobnější, že přes BT bude spolu komunikovat více zařízení zároveň než pomocí IrDA (i když to standard IrDA teoreticky dovoluje). Tyto vlastnosti se samozřejmě odrazily i v návrhu protokolu. 
Kromě samých výhod rádiového přenosu je tu ale jedna velká nevýhoda, a to právě všesměrovost a možnost prostupu většinou materiálů. Uživatel tedy může mít mnohem méně kontroly nad tím, kdo nebo co komunikuje s jeho přístroji, než při použití IrDA tam pokud nezamíříte přístroj správným směrem, nemůže nikdo přenášet data vaším telefonem na váš účet nebo krást důvěrné informace z vašeho PDA. Proto je součástí standardu zabezpečení proti neoprávněnému přístupu k BT zařízením. 
Jak je to u počítačových protokolů obvyklé, skládá se i BT protokol z několika vrstev, podobných klasickému síťovému modelu. Kromě těchto vrstev je součástí specifikace také sada takzvaných profilů. Ty vycházejí z uživatelského pohledu na věc a definují vlastnosti, které musí dané zařízení splňovat, aby poskytovalo požadovanou funkčnost.  

BlueZ 
Už jsem se zmínil o tom, že oficiální implementací protokolu BT v Linuxu je BlueZ. Existují ale i další implementace a je nutné podotknout, že v některých ohledech mohou mít nad BlueZ navrch. Rozdíly se ale stírají velice rychle a další vývoj se dále koncentruje na rozvoj BlueZ. Dále se tedy budu věnovat už jen BlueZ. 
Pokud už máte BT adaptér, je třeba zjistit, je-li v BlueZ podporován. K tomu slouží seznam na adrese uvedené v infotipech. Neobjevíteli svůj adaptér na seznamu, nemusí být ještě vše ztraceno. Čipů realizujících fyzickou vrstvu protokolu není na světě tolik, takže je možné, že váš adaptér obsahuje podporovaný hardware. Pokud se na nákup adaptéru teprve chystáte, je samozřejmě nejbezpečnější volbou některé ze seznamu kompatibilních zařízení. Nejčastěji užívaný asi bude adaptér připojený na sběrnici USB, alternativou jsou v podstatě jen zařízení využívající připojení k sériovému portu (UART). Nemusí to být jen klasický RS232, UART se používá i v adaptérech PC Card a vestavěných BT modulech. BlueZ vám nabízí možnost pracovat s BT protokolem i bez BT hardwaru. K dispozici je totiž takzvaný virtuální HCI ovladač, který se dokáže tvářit jako skutečné BT zařízení. 
Aby se vaše snaha o zprovoznění BlueZ neproměnila v blues, je dobré začít od jádra. Přestože je vyžadováno jádro 2.4.x, tedy libovolné jádro čtyřkové řady (přesněji řečeno od verze 2.4.4), bude lepší, když x bude mít co nejvyšší hodnotu - v době psaní článku to je 21. Vlastníte-li jednu z novějších distribucí, řekněme z letošního jara, měl by už být příslušný modul součástí jádra. Starší jádra mohou obsahovat dřívější verzi modulu BlueZ, a v tom případě bude lepší upgrade, protože jinak nebudete mít k dispozici všechny funkce novějších nástrojů BlueZ. 
Pokud se vám myšlenka na kompilaci nového jádra příliš nezamlouvá, doporučuji upgrade na novou verzi jádra pomocí balíčku z vaší distribuce, nebo rovnou přechod na co nejčerstvější verzi vaší oblíbené distribuce.  

Základní nastavení 
Předpokládám, že máte nainstalovány všechny potřebné nástroje, ať už z instalačních balíčků nebo po kompilaci ze zdrojových souborů. Prvním krokem k funkčnímu BT systému je správná konfigurace modulů v jádře. Základem je modul bluez.o, který by měl být v adresáři /lib/modules/2.4.x/ kernel/net/bluetooth. Ve stejném adresáři najdete také moduly bnep.o, rfcomm.o, l2cap.o a sco.o, které realizují služby vyšších vrstev protokolu. Ovladače pro konkrétní zařízení hledejte v /lib/modules/2.4.x/kernel/ drivers/bluetooth. Pokud žádný z těchto modulů nenajdete, je potřeba je nainstalovat z instalačního balíčku nebo přeložit. 
Máte-li příslušné moduly nainstalovány, měl by soubor /etc/modules.conf obsahovat následující řádky (pokud je v něm nenajdete, připište je na konec): 

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 

Pro PC Card a jiné UART zařízení ještě přidejte 
alias tty-ldisc-15 hci_uart 

a pro experimenty s virtuálním HCI 

alias char-major-10-250 hci_vhci 

Příkazem depmod -a zajistíte, že se moduly BlueZ budou nahrávat automaticky podle potřeby. 
Správnou funkci USB adaptérů můžete vyzkoušet jednoduše tak, že zasunete adaptér do USB portu a příkazem lsmod vypíšete moduly jádra, které máte v paměti. Měly by se tam objevit bluez, hci_usb a l2cap. Pokud ne, může být problém v konfiguraci modulů nebo přímo v subsystému USB. K jeho odhalení může posloužit například grafické zobrazení USB zařízení programem usbview. 
Požadované moduly můžete také zkusit nainstalovat ručně příkazem modprobe <jméno modulu>. Případné chybové hlášení se zapisuje do /var/log/messages. 
Jako další krok k funkčnímu BT spojení je potřeba spustit démona hcid. Buď jej spustíte ručně, nebo v případě, že jste instalovali BlueZ z balíčku, můžete zkusit pohodlnější cestu: service bluetooth start (a service bluetooth stop pro ukončení). UART zařízení se potom musí připojit k jednomu ze sériových portů příkazem hciattach, například hciattach /dev/ttyS0 csr 57600. Tím říkáte, že na portu /dev/ttyS0 je BT zařízení komunikující protokolem csr rychlostí 57 600 bitů za sekundu. USB zařízení vám dovolí předchozí krok vynechat. 
Příkazem hcitool dev zkontrolujeme, zda Linux naše zařízení "vidí", a současně můžeme zjistit jeho adresu, což se může dále hodit. Pokud se ve výpisu neobjeví žádné zařízení, něco v předchozích krocích selhalo a je třeba hledat chybu. U mého počítače se během prvních pokusů ukázalo, že v adresáři /lib/modules/2.4.x/kernel/drivers/usb sídlí modul bluetooth.o, který se vždy po připojení USB adaptéru nahrál do paměti a zjevně překážel. Stačilo soubor smazat a bylo po problému. 
Vyšší vrstvy BlueZ využívají pro komunikaci zařízení pojmenovaná hciX, kde X je číslo připojeného adaptéru. K jejich konfiguraci slouží příkaz hciconfig, který má podobné ovládání jako síťový ifconfig. Stačí tedy napsat hciconfig hci0 up a náš adaptér je připojen k zařízení hci0 a můžeme začít komunikovat s okolím. Zařízení zastavíme příkazem hciconfig down. 
Nastavení, která budou platit pro dané zařízení, jsou uložena v konfiguračním souboru /etc/bluetooth/hci.conf. Mimo jiné tam naleznete jméno, kterým se bude dané zařízení hlásit okolním BT přístrojům. Ve stejném adresáři hledejte i soubor pin s heslem, které se používá pro párování BT zařízení. Jenom dejte pozor na to, aby bylo možné vámi zvolené heslo na připojovaných zařízeních zadat. 
Kromě démona hcid, bez kterého BlueZ jednoduše nepoběží, můžete ještě nainstalovat démona pro službu SDP - sdpd, a klienta pro stejnou službu - sdptool. Pokud bude váš linuxový stroj sloužit jako server, může právě pomocí sdpd inzerovat své služby navenek. Sdptool vám pak poslouží při nastavení služeb, které bude sdpd vytrubovat do okolí. Start obou démonů, to je právě to, se děje během startu služby bluetooth. Podrobnosti najdete v souboru /etc/rc.d/init.d/bluetooth. 
Je to sice pěkné, že už BT adaptér funguje, že je zjistitelný z okolních BT zařízení (pokud používáte implicitní nastavení v hci.conf) a že umí najít jiná BT zařízení v okolí (příkazy hcitool scan nebo sdptool browse), ale prakticky použitelné to zatím není. Chybí implementace nějakého užitečného profilu.  

RfCOMM 

Začneme tím nejjednodušším. Stručně řečeno, RfCOMM nahrazuje drát mezi dvěma zařízeními, tedy sériový kabel. Pomocí RfCOMM můžete propojit dva počítače, počítač s telefonem, PDA a podobně. Bez funkčního RfCOMM nebudou fungovat složitější profily, které jsou na něm závislé (například síť). Potřebovat budete modul rfcomm.o v jádře, program rfcomm pro nastavení parametrů a speciální soubory rfcommXX v adresáři /dev. 
Modul rfcomm.o by měl být v adresáři /lib/modules/2.4.x/kernel/net/bluetooth. Pokud tam není, bude nutné přeložit moduly z balíčku bluez-kernel. Nezapomeňte automatizovat nahrávání modulu do paměti pomocí správného aliasu v souboru /etc/modules.conf. Program rfcomm se instaluje z balíčku bluez-utils. Chybějící soubory rfcommXX vytvoříte příkazem mknod /dev/rfcommXX c 216 XX. Pro experimenty stačí jeden (např. /dev/rfcomm0 vytvořený příkazem mknod /dev/rfcomm0 c 216 0). Pak už můžete experimentovat. Ještě připomenu, že adresu okolních zařízení získáte například příkazem hcitool scan. 
Přímého propojení dosáhnete parametrem connect. Pokud je adresa vzdáleného zařízení správná, spojí se s vaším počítačem okamžitě. Pro případ, že počítáte s častým připojováním, je výhodnější parametrem bind nastavit adresu vzdáleného zařízení. Spojení bude navázáno až tehdy, když se někdo pokusí otevřít lokální soubor, který je příkazem rfcomm bind "propojen" s daným BT zařízením. Pro případ, že zapomenete, jaké je nastavení jednotlivých rfcommXX, je možné si je vypsat příkazem rfcomm show a případně uvolnit pomocí rfcomm release. 
Zatím jsme probírali možnosti připojení směrem ven. Váš počítač ale může také čekat na příchozí připojení pomocí příkazu rfcomm listen. Pak je ale dobré inzerovat nabízené spojení pomocí protokolu sdp. Příklady spojení pomocí příkazu rfcomm: 

rfcomm connect rfcomm0 
11:22:33:44:55:66 

Okamžité připojení vzdáleného zařízení s adresou 11... Komunikace probíhá pomocí souboru /dev/rfcomm0.  

rfcomm bind rfcomm0 
11:22:33:44:55:66 

Podobné jako v předchozím případě, s tím rozdílem, že spojení se naváže až v okamžiku, kdy někdo přistupuje k souboru /dev/rfcomm0.  

rfcomm release rfcomm0 

Ruší se vazba na zařízení vytvořená předchozím příkazem bind.  

rfcomm show 

Výpis informací o daném zařízení.  

rfcomm listen rfcomm0 

Čeká se na příchozí žádost o připojení na sériový port. Je dobré tuto možnost inzerovat pomocí sdp. V tom případě musí běžet démon sdpd a pomocí příkazu sdptool add SP přidáte RfCOMM na "vývěsku" svého počítače. 
Použití profilu RfCOMM představuje nejjednodušší způsob propojení linuxového PC a mobilního telefonu. Mohlo by to vypadat asi následovně: 
* V telefonu zapnete BT a přepnete ho do zjistitelného režimu. V případě, že se připojujete poprvé, spárujete obě zařízení. Příkazem hcitool scan zjistíte adresu telefonu. 
* Pomocí rfcomm bind rfcommXX <adresa> propojíte počítač s telefonem. 
* Nyní už stačí jen otevřít soubor /dev/ rfcommXX a posílat telefonu AT příkazy. 
* Pokud chcete používat grafické programy pro práci s telefonem, bude možná dobré přesměrovat zařízení /dev/modem na správný rfcomm port: ln -s /dev/rfcommXX / dev/modem 
Standardní nastavení pro RfCOMM je uloženo v adresáři /etc/bluetooth/rfcomm.conf. Pro každý ze speciálních souborů rfcommXX v adresáři /dev můžete definovat implicitní parametry, které se použijí, když něco vynecháte na příkazové řádce. 
Ještě jednou zopakuji, že RfCOMM je plnohodnotná náhrada sériového portu, a proto s ním můžete dělat všechno, co se dá dělat se sériovým portem. Jenom si musíte uvědomit, že navazování spojení přes RfCOMM je nesymetrické. Musíte vždy určit, která strana zahájí konverzaci. Kromě připojení telefonu můžete rfcomm spojení využít pro spojení dvou počítačů protokolem ppp, případně můžete komunikovat přímo pomocí programů typu minicom. Fungující RfCOMM je také podmínkou práce složitějších profilů, které jsou na něm závislé. 
Daleko zajímavější než nastavení RfCOMM je práce se síťovými profily protokolu BT. Samozřejmě je možné použít ppp spojení přes RfCOMM, ale jde to i jinak. O tom si ale povíme až někdy příště. 
Lukáš Mikšíček, lukas.miksicek@seznam.cz

BLUETOOTH - SADA PROTOKOLŮ PRO BEZDRÁTOVOU KOMUNIKACI 
DUN (Dial Up Networking) - profil pro vytáčené připojení k síti. 
HCI (Host Controller Interface) - API pro komunikaci hardwaru s vyšší vrstvou. 
NAP (Network Acces Point) - přístupový bod, který připojuje ostatní zařízení do sítě. 
PAN (Personal Area Networking) - profil pro spojování BT zařízení do sítí podle potřeby. Maximálně může vzniknout tzv. piconet o sedmi členech. PAN definuje i způsob připojení piconetu do vnějších sítí. 
RfCOMM - profil pro emulaci sériové linky přes rádiové rozhraní. 
Umí přenášet i informace o řídicích signálech RS232, takže je možné jej použít například pro připojení modemů a podobně. Na RfCOMM je založena většina složitějších protokolů. 
SDP (Service Discovery Protocol) - protokol pro výměnu informací o schopnostech zařízení. Pomocí sdp se zařízení dohodnou na profilech, které podporují. 
SCO (Synchronous Connection Oriented) - spojení se zaručenou přenosovou kapacitou. Používá se u profilů pro přenos zvuků, jako je Headset profile nebo Handsfree profile. 

PŘÍKAZY BLUEZ 
DÉMONI 
hcid - základ celého systému BlueZ, bez něj by to prostě nefungovalo. HCI je zkratka anglického Host Controller Interface a představuje abstrakci hardwaru pro vyšší vrstvy. Zajímavou možností BlueZ je virtuální varianta HCI, hciemud, který funguje bez BT hardwaru. 
sdpd - sdp démon, stará se o "public relations" BlueZ. Jeho úkolem je informovat okolí o službách, které počítač poskytuje. 
dund - Dial Up Networking démon. 
pand - Personal Area Networking démon. Zajišťuje síťování přímo, bez pomoci ppp. 
Jeho úkolem je vytvářet piconety zařízení BT a řídit jejich provoz. 
rfcommd - to už je historická záležitost. Měl se starat o příchozí požadavky na spojení RfCOMM, ale dnes je plně nahrazen novou verzí podpory RfCOMM v jádře. Určitě byste jej už neměli používat. 

KONFIGURACE 
hciconfig - nástroj pro vytváření hci zařízení a nastavování jejich parametrů. 
hcitool - pracuje na stejné úrovni jako hciconfig, ale stará se více o vnější záležitosti. Zjišťuje parametry okolních BT zařízení a poskytuje údaje o právě probíhajících spojeních. 
hciattach - specialista na UART zařízení. Připojí konkrétní hardware k určenému sériovému portu a nastaví parametry pro komunikaci s adaptérem. Pokud jste někdy připojovali IrDA zařízení po sériové lince, jistě znáte program irattach. Hciattach je to samé pro Bluetooth. 
rfcomm - konfiguruje rfcomm spojení. Stará se o správně přiřazení lokálních a vzdálených rfcomm požadavků. 
sdptool - ovládací centrum sdp démona. 
bluepin - pomocný program pro zadávání PIN během párování přístrojů. 

TESTOVÁNÍ 
hcidump - výpis HCI paketů. Slouží pro ladění a kontrolu nastavení. 
l2ping - obdoba příkazu ping pro kontrolu spojení na úrovni l2cap. 
l2test - testovací program pro l2cap spojení. scotest - program pro testování sco spojení. 

APLIKACE PRO BLUEZ 
BlueZ je pouhým nástrojem a bez dobrých aplikací není sám o sobě příliš užitečný. Kromě normálních aplikací, které BlueZ využijí jako další komunikační kanál, jsou dnes už k dispozici i aplikace poněkud specializovanější. 
Bluewire - zatím spíš waporware než skutečná aplikace, ale pokud se autor polepší, dá nám k dispozici pohodlný nástroj pro grafickou správu BlueZ. 
MultiSync - nástroj pro synchronizaci mobilních zařízení. Podporuje standard IrMC a rozumíí si s Palm OS i se Symbianem. BlueZ umí využít jako jeden ze svých komunikačních kanálů. 
K68 - graficky nápaditý program pro správu telefonů T68i od společnosti Sony Ericsson. 
BtRemote - dálkové ovládání hudebního přehrávače XMMS pomocí mobilního telefonu s BT. 

JINÉ IMPLEMENTACE BT PRO LINUX 
BlueZ není jedinou implementací technologie Bluetooth pro Linux. Byl ale zvolen standardní implementací, a proto se mu dostává větší pozornosti než konkurenci. 
AXIS OpenBT Stack vznikl jako jednoúčelová implementace pro přístupový bod. 
V současné době umí pouze profily LAN, DUN a RfCOMM. SCO nepodporuje. Jeho výhodou je poměrně jednoduchá instalace a nastavení pomocí grafických nástrojů (www.axis.com). 
BlueDrekar je dítkem IBM, ale zdá se, že co do počtu podporovaných profilů se zatím příliš nevyvíjí - z těch "koncových" to je prakticky jen RfCOMM. BlueDrekar má širší záběr než jenom implementaci protokolu. Měl by být i nástrojem pro vývojáře (www.research.ibm.com/BlueDrekar) 

INFOTIPY 
www.bluetooth.org 
Oficiální stránky standardu Bluetooth 
http://bluez.sourceforge.net 
Stránky projektu BlueZ 
http://bluez.sourceforge.net/download/ download.html 
Jednotlivé balíčky BlueZ včetně balíčků pro populární distribuce www.holtmann.org/linux/bluetooth 
Sbírka odkazů na téma Bluetooth a Linux