Jak na Bluetooth pod Linuxem

21. 5. 2003
Doba čtení: 5 minut

Sdílet

Ve Vltavě již uplynulo mnoho vody od chvíle, kdy jsme si naposledy pověděli něco o Bluetooth pod Linuxem. Mezitím se v této oblasti mnohé posunulo a téměř nic z toho, co jsme si povídali minule, již neplatí. Ukažme si tedy nové cesty, jak rozjet Bluetooth pod Linuxem.

Naštěstí byl už dávno opuštěn starý systém přidávání nových vlastností BlueZ projektu do jádra a nyní tedy máme klasicky dvě možnosti.

  1. stáhnout poslední verzi jádra – doporučuji 2.4.21-rc2, jelikož ve starších jádrech se vyskytuje velice nepříjemná race condition
  2. použít -mh patche na současné stabilní jádro 2.4.20, 2.4.19 a 2.4.18 z adresy www.holtmann.or­g/linux/kernel

Kdo má starší jádro, měl by urychleně přejít na nové nebo patchnout to současné, jelikož ve všech jádrech od 2.2.0 do 2.4.21-pre5 včetně je race condition, kterou lze lokálně zneužít a získat práva roota.

Poté, co jsme patchli naše současné jádro nebo rozbalili nové – uvádět zde postup nemá smysl, jelikož jej snad už každý z mých předchozích článků zná – přistoupíme k jeho konfiguraci a zapneme Bluetooth podporu:

<M> Bluetooth subsystem support
<M> L2CAP protocol support
<M> SCO links support
<M> RFCOMM protocol support
[*] RFCOMM TTY support
<M> BNEP protocol support
[*] Multicast filter support
[*] Protocol filter support
Bluetooth device drivers --->
<M> HCI USB driver
[*] SCO (voice) support
[ ] USB zero packet support
< > HCI UART driver
< > HCI VHCI (Virtual HCI device) driver

Jaký modul používá váš hardware a jestli vůbec je schopen pod Linuxem fungovat, zjistíte na této stránce: www.holtmann.or­g/linux/blueto­oth/devices.html

Podle ní příslušně upravte sekci drivers. Osobně doporučuji používat USB dongles, už z toho důvodu, že dnes stojí i s daní 1000 korun a navíc fungují bez problémů.

Nyní upravíme soubor /etc/modules.conf a přidáme autoloading příslušných modulů:

#modrozub
alias net-pf-31 bluez
alias bt-proto-0 l2cap
alias bt-proto-2 sco
alias bt-proto-4 bnep
alias tty-ldisc-15 hci_uart
alias char-major-10-250 hci_vhci
alias bt-proto-3 rfcomm

Nyní přeložíme poslední verze utilit ze stránky: bluez.sourcefor­ge.net/downlo­ad/download.htmla stáhneme a přeložíme tyto soubory:

bluez-libs-2.4.tar.gz
bluez-utils-2.3.tar.gz
bluez-sdp-1.1.tar.gz
bluez-pan-1.1.tar.gz
bluez-hcidump-1.5.tar.gz
bluez-bluefw-0.9.tar.gz

Při kompilování postupujeme od bluez-libs k bluez-bluefw přesně tak, jak jsou soubory uvedeny pod sebou.

Po nainstalování nám vznikne adresář /etc/bluetooth, ve kterém se nacházejí soubory potřebné ke správné funkci bluetooth pod Linuxem. Nezbývá nám tedy nic jiného, než se v nich trochu „povrtat“ :)

Ze všeho nejdříve ovšem musíme „nahodit“ Bluetooth zařízení, aby o nich jádro vědělo:

modprobe hci_usb; #popřípadě jiný driver v závislosti na vašem železe
hciconfig hciX up; #hci0 - prvni dongle, hci1 - druha dongle...

Nyní zeditujeme soubor /etc/bluetooth/pin a nastavíme párovací heslo. Doporučuji nastavit nějakou číselnou kombinaci, jelikož v případě párování s mobilním telefonem nebudeme mít možnost zadat písmena.

Poté nastavíme soubor /etc/bluetooth/hcid.conf

Mně se nejvíce osvědčila tato kombinace:

#
# HCI daemon configuration file.
#
# $Id: hcid.conf,v 1.3 2002/07/18 18:12:46 maxk Exp $
#

# HCId options
options {
    # Automatically initialize new devices
    autoinit yes;

    # Security Manager mode
    #   none - Security manager disabled
    #   auto - Use local PIN for incoming connections
    #   user - Always ask user for a PIN
    #
    security auto;

    # Pairing mode
    #   none  - Pairing disabled
    #   multi - Allow pairing with already paired devices
    #   once  - Pair once and deny successive attempts
    pairing multi;

    # PIN helper
    pin_helper /bin/bluepin;
}

# Default settings for HCI devices
device {
    # Local device name
    #   %d - device id
    #   %h - host name
    #name "BlueZ (%d)";
    name "Linux";

    # Local device class
    class 0x100;

    # Default packet type
    pkt_type DH1,DM1,HV1;

    # Inquiry and Page scan
    iscan enable; pscan enable;

    # Default link mode
    #   none   - no specific policy
    #   accept - always accept incoming connections
    #   master - become master on incoming connections,
    #        deny role switch on outgoing connections
    #
    #lm accept,master;
    #
    lm accept,master;

    # Default link policy
    #   none    - no specific policy
    #   rswitch - allow role switch
    #   hold    - allow hold mode
    #   sniff   - allow sniff mode
    #   park    - allow park mode
    #
    #lp hold,sniff;
    #
    lp hold,sniff,park,rswitch;

    # Authentication and Encryption
    auth enable;
    encrypt enable;
}

Poté můžeme pustit démona starajícího se o ověřování hesel – hcid takto:

hcid -f /etc/bluetooth/hcid.conf

Dalším krokem je vyeditování souboru /etc/bluetooth/rfcomm.conf  – zde je největší změna. Již se oproti minulosti nepoužívá démon rfcommd, projekt BlueZ přešel na jaderný modul rfcomm.

#
# RFCOMM configuration file.
#
# $Id: rfcomm.conf,v 1.1 2002/10/07 05:58:18 maxk Exp $
#

rfcomm0 {
    # Automatically bind the device at startup
    bind yes;

    # Bluetooth address of the device
    device 00:11:22:33:44:55;

    # RFCOMM channel for the connection
    channel 1;

    # Description of the connection
    comment "";
}

device označuje MAC adresu zařízení, ke kterému se chcete připojit, kanál s danou námi využívanou službou na daném zařízení a rfcomm0 označuje zařízení v /dev/, v tomto případě /dev/rfcomm0. Těchto sekcí si v souboru vyrobíme příslušný počet.

Následuje vytvoření příslušných devices v /dev/, o které se postará tento jednoduchý skript:

I=0
while [ "$I" -lt 256 ]; do
if [ ! -c /dev/rfcomm"$I" ]; then
mknod -m 666 /dev/rfcomm"$I" c 216 "$I"
fi
I=`expr "$I" + 1`
done

Jestliže máte vhci zařízení, vyrobíte jej takto:
  mknod /dev/vhci c 10 250; chmod 644 /dev/vhci

S nastavením systému jsme hotovi a můžeme začít Bluetooth rutinně používat :)

Nejsnazší cestou je asi použití příkazu rfcomm bind all a poté již jen používat daná zařízení ve všech skriptech, kde chceme, jednoduchým přidáním /dev/rfcomm0 na místa, kam bychom jinak psali /dev/ttyS0 nebo /dev/ircomm0.

Rfcomm můžeme obsluhovat i ručně, uvedu zde nejčastěji používané příkazy:

  • rfcomm bind device MAC kanal  – spojení jádra a daného zařízení/kanálu
  • rfcomm release device  – uvolnění jádra od daného zařízení
  • rfcomm connect device kanal  – rovnou se k zařízení připoj a nečekej na inicializaci

Z dalších příkazů se mohou například hodit:

bitcoin_skoleni

  • hcitool scan  – vyhledá MAC adresy zařízení v dosahu a určí jejich nickname – zařízení musí být v módu zjistitelný
  • hcitool inq  – zjistí pouze MAC adresy a doplňkové informace
  • hcitool dev  – uvede seznam všech adaptérů v počítači
  • hcitool info MAC  – zjistí informace o zařízení
  • hcitool cc MAC  – připojí se k danému zařízení
  • hcitool dc MAC  – odpojí se od daného zařízení
  • hcitool lq MAC  – určí kvalitu linky vedoucí k danému zařízení! (dodáno na mé přání :-) )
  • hciconfig hciX features  – řekne, které vlastnosti vaše zařízení podporuje
  • hciconfig hciX revision  – sdělí vám, zda jste šťastným uživatelem dongle s podporou kolika připojených zařízení v režimu slave/master – daný firmware porovnejte s touto stránkou a dostanete výsledek:
    www.holtmann.or­g/linux/blueto­oth/csr.html

Bluez v dnešní době umí i komunikovat s Bluetooth bondovkami, využívat výhod PAN a SDP. Bohužel ani jedno z těchto dalších potřebných zařízení nevlastním, takže je nemohu vyzkoušet. Zde je prostor pro prodejce těchto zařízení k jejich zapůjčení a za drobnou reklamu napsání další části seriálu. Takže co bych potřeboval? Ještě alespoň dva USB nebo PCMCIA Bluetooth adaptéry a Bluetooth bondovku.

Asi mne nenapadá nic, co bych dodal, takže užívejte, modrejte a popřípadě se ptejte v diskusi pod článkem :-)