Bluetooth

Aus wiki.archlinux.de

Dieser Artikel ist teils eine Übersetzung aus der englischen Archlinux-Wiki zum Thema Bluetooth, behandelt in erster Linie jedoch nur den Dateitransfer zwischen Mobiltelefonen und Computern mittels OBEX.

Installation

Als erstes benötigt ihr die bluez-utils, welche den Bluetooth-Daemon und einige Hilfsprogramme enthält:

 $ pacman -Sy bluez-utils

Nun muss der bluetooth-Daemon gestartet werden. Aus verschiedenen Gründen muss der dbus-Daemon laufen, und das noch bevor der bluetooth-Daemon aktiviert wird.

 $ /etc/rc.d/dbus start
 $ /etc/rc.d/bluetooth start

Um zu sehen, ob das Bluetooth-Gerät richtig erkannt wurde, benutzt man den Befehl hcitool aus den bluez-utils:

 $ hcitool dev
 Devices:
         hci0    xx:xx:xx:xx:xx:xx

Ausgegeben werden alle verfügbaren Geräte mit ihren zugehörigen MAC-Adressen. Um detaillierte Informationen über ein Gerät zu erhalten, kann man das Tool hciconfig verwenden.

 $ hciconfig -a hci0
 hci0:   Type: USB
         BD Address: xx:xx:xx:xx:xx:xx ACL MTU: 384:8 SCO MTU: 64:8
         UP RUNNING PSCAN 
         RX bytes:6245132 acl:18111 sco:0 events:6806 errors:0
         TX bytes:102529 acl:6568 sco:0 commands:128 errors:0
         Features: 0xff 0xff 0x8f 0xfe 0x9b 0xf9 0x00 0x80
         Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 
         Link policy: RSWITCH HOLD SNIFF PARK 
         Link mode: SLAVE ACCEPT 
         Name: 'xxx'
         Class: 0x08010c
         Service Classes: Capturing
         Device Class: Computer, Laptop
         HCI Ver: 2.0 (0x3) HCI Rev: 0x7a6 LMP Ver: 2.0 (0x3) LMP Subver: 0x7a6
         Manufacturer: Cambridge Silicon Radio (10)

Geräte Koppeln

Damit eine Verbindung nicht von jedem einfach so aufgebaut werden kann, müssen Bluetooth-Geräte oft mit einem Passkey gekoppelt werden. Der Vorgang läuft in etwa so ab:

  • Der Client will eine Verbindung zum Server aufbauen (zum Beispiel Computer->Mobiltelefon)
  • Der Client und der Server bitten um die Eingabe des Passkeys
  • Diese werden verglichen - wenn sie gleich sind, so wird das Gerät gekoppelt, ansonsten wird die Verbindung abgebrochen

Das bluez-utils Paket stellt uns wieder ein praktisches Tool namens passkey-agent für die Übermittlung des Passkeys zur Verfügung.

 $ passkey-agent
 Bluetooth passkey agent ver 3.32
 Usage:
         passkey-agent [--default] [--path agent-path] <passkey> [address]

Um einen default Key für alle Geräte zu verwenden benutzt man einfach folgenden Befehl:

 $ passkey-agent --default xxx &

Wenn man nur mit einem speziellen Gerät koppeln will kann man auch die jeweilige MAC-Adresse verwenden

 $ passkey-agent --default xxx MAC &

Wenn man ein Mobiltelefon benutzt, so kann man auf zwei Arten koppeln:

  • Entweder man sucht den Computer direkt mit dem Mobiltelefon und koppelt manuell
  • oder man versucht vom Computer aus eine Verbindung zum Mobiltelefon aufzubauen.

Für die erste Möglichkeit muss die Option ISCAN (Inquiry scan) für das Bluetooth-Device aktiviert sein. Überprüfen könnt ihr das mit folgendem Befehl:

 $ hciconfig <dev> | grep ISCAN
        UP RUNNING PSCAN ISCAN

<dev> ersetzt ihr mit dem jeweiligen Bluetooth-Gerät (z.B.: hci0). Sollte ISCAN nicht aktiviert sein, so aktiviert man es manuell mittels hciconfig:

 $ hciconfig <dev> piscan

Dieser Befehl aktiviert PSCAN (Page scan) und ISCAN - das Gerät bleibt aber nur eine bestimmte Zeit sichtbar. (Beide Optionen findet man auch in der /etc/bluetooth/hcid.conf, leider scheint keine der Defaulteinstellungen darin eine unmittelbare Wirkung zu zeigen) Nun kann der Computer von anderen Bluetooth-Geräten gefunden werden und man kann versuchen manuell zu koppeln. Der passkey-agent gibt bei der Anfrage dann folgende Meldung aus:

 Passkey request for device xx:xx:xx:xx:xx:xx

Wenn der Key richtig eingegeben wurde, so ist das Gerät nun gekoppelt (evtl. muss die Kopplung auf einem Mobiltelefon noch gespeichert werden).

Für die zweite Möglichkeit, der Kopplung durch Verbindungsanfrage, benutzt man einfach beispielsweise ein Tool wie obexftp, um sich mit dem Server (Mobiltelefon) mittles OBEX zu verbinden. Wenn beim Mobiltelefon Bluetooth aktiviert ist, sollte das Gerät selbst nach der Kopplung fragen. Nach der Eingabe des Keys wird die Verbindung hergestellt und das Gerät ist gekoppelt.

Ist das Gerät einmal gekoppelt worden, so muss man den passkey-agent nichtmehr extra starten. Dessen Aufgabe übernimmt von nun an der dbus-Daemon.

Beispiel für Methode mit automatischer Kopplung

Bei diesem Beispiel wurde ein Motorola RAZR V8 verwendet.

 $ obexftp -b xx:xx:xx:xx:xx:xx -l
 Browsing xx:xx:xx:xx:xx:xx ...
 Connecting...done
 Receiving "/"... Sending ""... done
 --- <content> ---
 Disconnecting...done

Dieser Befehl baut eine OBEX-Datenverbindung mit der unter der Option -b angegebenen MAC-Adresse auf und gibt den Inhalt des Rootverzeichnisses des Mobiltelefons aus. Wenn das Mobiltelefon noch nicht gekoppelt wurde, so wird nach dem Passkey gefragt, der zuvor mittels passkey-agent angegeben wurde (hier muss passkey-agent unbedingt noch laufen!). Ist das Gerät dann gekoppelt, so wird am Mobiltelefon nachgefragt, ob eine Verbindung aufgebaut werden darf - akzeptiert man dies, so fährt obexftp nach der Connecting-Phase mit dem Transfer fort und beendet nach dessen Abschluss die Verbindung.

Ein Gerät in das lokale Dateisystem einbinden

Mit dem auf FUSE basierenden Tool obexfs kann ein Dateisystem über Bluetooth in das lokale Linuxdateisystem gemountet werden. Dazu installiert man es sich einfach mittels

 $ pacman -Sy obexfs

Nun erstellt man sich noch einen beliebigen Mountpoint (sofern man noch keinen zur Verfügung hat):

 $ mkdir /mnt/bluetooth

Damit man als User mounten kann muss man Schreibzugriff auf den Mountpoint besitzen. Also führt ihr obexfs entweder als root aus, oder ihr erstellt am Besten eine eigene Gruppe namens "bluetooth", welche Lese- und Schreibrechte auf den Mountpoint besitzen:

 $ chown root /mnt/bluetooth
 $ chmod 775 /mnt/bluetooth
 $ addgrp bluetooth
 $ usermod -a -G bluetooth USERNAME

Nun kann man das Dateisystem mounten:

 $ obexfs -b xx:xx:xx:xx:xx:xx /mnt/bluetooth/