linux:bluetooth

Bluetooth mit Linux

Bluetooth /ˈbluːtuːθ/ ist ein in den 1990er Jahren ursprünglich von Ericsson entwickelter Industriestandard gemäß IEEE 802.15.1 für die drahtlose (Funk-)Vernetzung von Geräten über kurze Distanz. Bluetooth bietet eine drahtlose Schnittstelle, über die sowohl mobile Kleingeräte wie Mobiltelefone und PDAs als auch Computer und Peripheriegeräte miteinander kommunizieren können. Ein solches Netzwerk wird auch als Wireless Personal Area Network (WPAN) bezeichnet. Hauptzweck von Bluetooth ist das Ersetzen von Kabelverbindungen zwischen Geräten.

Bluetooth-Logo verwendbar, es ist aber ein geschütztes Warenzeichen (Bluetooth-Logo verlustfreie SVG-Version)

Theoretisch kann eine Datenübertragungsrate von 706,25 kBit/s beim Herunterladen (Download) bei gleichzeitigen 57,6 kBit/s beim Heraufladen (Upload) erreicht werden (asymmetrische Datenübertragung). Seit der Version 2.0 + EDR können Daten durch EDR (Enhanced Data Rate) maximal etwa dreimal so schnell übertragen werden, also mit rund 2,1 Mbit/s. Bereits seit Version 1.1 kann ein Bluetooth-Gerät gleichzeitig bis zu sieben Verbindungen aufrechterhalten, wobei sich die beteiligten Geräte die verfügbare Bandbreite teilen müssen (shared medium). Quelle

Unter Ubuntu installiert man die gebrauchten Pakete mit

apt-get install bluez-utils bluez-gnome gnome-bluetooth

optional kann man noch bluemon (ein bluetooth-monitor) dazu nehmen.

:!: Für headsets muss das Paket bluez-btsco ebenfalls installiert werden.

Tipps und Tricks

  • Bluetooth deaktiviert man (z. B. aus Stromspargründen) mit den beiden Zeilen:
    hciconfig hci0 down
    rmmod hci_usb
  • Für KDE gibt es das Paket kdebluetooth, im Konqueror muss man dann nur noch bluetooth:/ in der Adresszeile eingeben.
  • Mit watch hcitool con kann man aktuelle Verbindungen überwachen.
  • Die Zuordnungen von Bluetooth-Geräten und ihren PINs sowie weitere Information werden im Verzeichnis /var/lib/bluetooth abgelegt (geordnet nach der MAC-Adresse der BT-Adaptern).

Wenn der Befehl hciconfig (wie hier im Beispiel) in der dritten Zeile DOWN anzeigt

hci0:   Type: USB 
        BD Address: 00:00:00:00:00:00 ACL MTU: 0:0  SCO MTU: 0:0
        DOWN 
        RX bytes:0 acl:0 sco:0 events:0 errors:0
        TX bytes:0 acl:0 sco:0 commands:0 errors:0

muss der Bluetooth-Adapter noch aktiviert werden (hciconfig hci0 up).

Der Befehl

hcitool scan

sollte eine Ausgabe nach folgenden Schema ergeben.

Scanning ...
        00:80:37:25:55:96       Nokia 6630
        00:E0:03:04:6D:36       Nokia 6210

Die unterstützten Profile kann man mit dem Befehl

sdptool browse 00:80:37:25:55:96

auswerfen lassen, die MAC Adresse (00:80:37…) muss man anpassen.

Dabei bedeuten die Abkürzungen:

  • L2CAP: „Logical Link Control and Adaptation Protocol“
  • RFCOMM: serielle Übertragung
  • OBEX: Object Exchange
  • BNEP: Netzwerk
  • HIDP: Eingabegeräte.

Die richtigen Einstellungen in der Datei /etc/bluetooth/rfcomm.conf eintragen:

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

	# Bluetooth address of the device
	device 00:80:37:25:55:96;

	# RFCOMM channel for the connection
	channel	1;

	# Description of the connection
	comment "Nokia 6630";
}

nach dem Neustart von Bluetooth (/etc/init.d/bluetooth restart) sollte der Befehl rfcomm -a eine ähnliche Ausgabe zeigen:

rfcomm0: 00:15:A0:4D:5A:3A channel 1 clean

Falls nicht bzw. alternativ zu „bind yes“ kann man das Gerät auch manuell Binden:

rfcomm connect 0 00:15:A0:4D:5A:3A 1

Das Telefon ist nun unter /dev/rfcomm0 erreichbar und kann über ein Wählprogramm angesprochen werden. Falls ein Programm auf den Zugriff über /dev/modem besteht, legt man einen symbolischen Link (mit sudo ln -s /dev/rfcomm0 /dev/modem )an.

Die Einwahl geht mit vielen Programmen, genannt wird immer wieder wvdial und kppp. KPPP wird man benutzen wenn man KDE benutzt bzw. unter Gnome z.B. zu wenig Arbeitsspeicher kein Problem ist. Andernfalls erledigt das Konsolenbasierte wvdial die Aufgabe ebenso.

Kppp ist sehr komfortabel und braucht für den Provider o2 (ggf. andere Daten eintragen) und dem Nokia 6630 (spielt hier keine Rolle) folgende Einstellungen:

  • Karteireiter „Zugänge“: „Neu …“
    • Wählen: Zugangsname: (egal) Telefonnummer: *99# Authentifizierung: PAP
    • IP: dynamische IP
    • Gateway: Standard-Gateway, unten ankreuzen: Standardgateway auf diesen Gateway setzen. Übrigens spricht kppp im Verbindungsfenster vom „Adresse auf Fremdrechner“ (bei mir 10.6.6.6).
    • DNS: „automatisch“ müsste gehen, ansonsten auf 62.134.11.4 und 195.182.110.132 setzen; „Während Verbindung existierende DNS-Server deaktivieren“ nicht vergessen.
    • der Rest ist optional
  • Karteireiter „Modems“: „Neu …“
    • Modem-Name (egal) z.B. Nokia 6630
    • Modemgerät: /dev/rfcomm0
    • Flusskontrolle: Hardware
    • Zeilenende: CR
    • Geschwindigkeit: 460800
    • Vor dem wählen auf Freizeichen warten
  • Unterkarteireiter „Modem“: :
    • der APN internet oder surfo2 (je nach Tarif) stellt so ein: „Modembefehle“ → Init-Zeichenfolge 2: AT+CGDCONT=1,„IP“,„surfo2“

Die Datei /etc/wvdial.conf sollte um einen Eintrag für die Interneteinwahl ergänzt werden: Im Beispiel hier für den Provider o2. Vorrausgesetzt wird eine stehende Bluetooth-Verbindung über rfcomm als Gerät /dev/rfcomm0.

[Dialer Defaults]
Phone = 
Username = 
Password = 
New PPPD = yes

[Dialer 6630]
Modem = /dev/rfcomm0
ISDN = off
Modem Type = Analog Modem
Baud = 460800
Init = ATZ
Init2 = AT+CGDCONT=1,"IP","surfo2"
Phone = *99#
Dial Prefix =
Dial Attempts = 1
Dial Command = ATD
Ask Password = off
Password = gprs
Username = eplus
Auto Reconnect = off
Abort on Busy = off
Carrier Check = on
Check Def Route = on
Abort on No Dialtone = on
Stupid Mode = off
Idle Seconds = 0
Auto DNS = on

Andere Konfigurationsbeispiele sind hier aufgelistet bzw. hier eine passende Fehlerhilfe.

Danach kann die Einwahl mit wvdial 6630 gestartet werden. Statt 6630 gibt man den Name des Profils an. :!: Wenn man auch das Standard-gateway automatisch eingestellt haben möchte (und nicht nur die DNS-Server), muss man wvdial als root starten:

sudo wvdial 6630

siehe auch: KPPP: Most Frequently Asked questions

kppp (in Ubuntu 6.06 dapper, nicht in Ubuntu 7.04 feisty) meldet Fehler Couldn't find interface ppp0: No such device:

  • entweder reicht es vor dem Vebinden anderen Netzwerkschnittstellen zu deaktivieren
  • oder (bei mir ging es nur so) in der Datei /etc/ppp/options die Zeile/das Wort auth suchen und es gegen noauth austauschen.

They are saying to remove „auth“ and replace it with „noauth“ in /etc/ppp/options Also, remove it from the kppp config menu.

Wenn die Verbindung geklappt hat und man trotzdem keine Daten empfängt: klappt ein ping auf eine bekannte IP? Beispielweise ping 85.25.136.135 (für diesen Server?).

  • ja? → DNS-Problem.
  • nein? → die Standardroute stimmt nicht.

Lösung der Probleme

  • Standardroute richtig? Wenn nicht: route add default gw 10.6.6.6 . 10.6.6.6 sollte durch die richtige IP des Gateways ersetzt werden, diese findet sich im Verbindungsstatistikfenster neben „Adresse auf Fremdrechner“ (bei mir 10.6.6.6).
  • richtige DNS-Server eingetragen? cat /etc/resolv.conf sollte als erste Zeilen (gelten nur für o2, andere Provider haben natürlich andere DNS).
nameserver 62.134.11.4
nameserver 195.182.110.132

enthalten. Wenn nicht, dann ändern (sudo nano /etc/resolv.conf).

Wenn man sein Headset lediglich für Sprache (z.B. VoIP) einsetzen will, reicht die mäßige Soundqualität (8000khz mono) aus.

Das Modul snd_bt_sco richtet eine Soundkarte (für ALSA) ein, auf die dann jedes Programm zugreifen kann. Dazu muss das Modul vorher mit

sudo modprobe snd_bt_sco

geladen werden. Danach taucht sie in der Liste der Soundkarten auf, was man mit

cat /proc/asound/cards

überprüfen kann. Dauerhaft kann man das Modul in der /etc/modules eintragen (einfach snd_bt_sco in einer eigenen Zeile eintragen und abspeichern).

Nachdem man mit hcitool scan die MAC-Adresse des entsprechende Gerätes herausbekommen hat, verbindet man sich zum Headset mit

btsco -v MAC

Die Qualität dürfte für Sprache reichen, für mehr muss man A2DP einrichten (siehe unten). Ausführlichere Informationen bietet die Seite von Christoph Langner noch ausführlicher (und einfacher) ist die Seite von Ubuntuusers für Bluetooth-headsets.

Wenn beide Geräte A2DP (Advanced Audio Distribution Profile) beherrschen kann Audio in hoher Qualität angehört werden. Dazu muss man in seiner Linux-Distribution A2DP-Unterstützung aktivieren.

Ab Ubuntu 7.10 (gutsy), bzw. bei ähnlich aktuellen Distributionen, dürfte die Einrichtung mit dem Paket bluetooth-alsa (aus „universe“) sehr viel einfacher sein.

Auf 7.04 (feisty) ist leider ein etwas umständlicherer Weg nötig:

  1. aus Debian libsbc und bluetooth-alsa installieren
  2. .a2dprc anlegen (gedit ~/.a2dprc) und mit diesem Inhalt füllen:
    [a2dpd]
    rate=44100
    sbcbitpool=53
    flags=0
    enablereversestereo=1
    enableautoconnect=1
    timeout=2000
    cmdplay=xmms --play
    cmdpause=xmms --pause
    cmdprev=xmms --rew
    cmdnext=xmms --fwd
    cmdnew=xmms --play
    cmdstop=xmms --stop
    enableavrcp=1
    enablerereadconfig=1
    enabledebug=1
    flags=0
    enablestdin=1
    enableredirectalsa=0
    address=XX:XX:XX:XX:XX:XX
    alsaoutput=
     

    :!: unter address muss die korrekte MAC-Adresse eingetragen werden!

  3. .asoundrc (gedit ~/.asoundrc) und mit diesem Inhalt füllen:
      pcm.headset {
      @args [BDADDR TIMEOUT]
      @args.BDADDR {
        type string
        default "00:13:1B:00:1F:02"
      }
      @args.TIMEOUT {
        type integer
        default 6000
      
    }
      type sco
      bdaddr $BDADDR
      timeout $TIMEOUT
    }
    
    ctl.headset {
      type sco
    }
    
    pcm.a2dpd {
      type a2dpd
    } 
  4. das Abspielprogramm muss auf das richtige Ausgangsplugin konfiguriert werden. VLC muss in ~/.vlc/vlcrc folgende Zeilen enthalten: FIXME
  5. das Audio-streaming (mit a2dp) starten:
     sudo a2dpd 

Links

Profile sind einzelne Fähigkeiten die ein Gerät versteht:

Name (Kürzel) Funktion
Advanced Audio Distribution Profile (A2DP) Übermittlung von Audiodaten in hoher Qualität (gute Headsets und Musikwiedergabe) sehr wichtig. Geräte mit A2DP
Dial-up networking (DUN) Internet-Einwahlverbindung
File Transfer Profile (FTP) Dateiübertragung
Headset Profile (HSP) Sprachausgabe per Headset
Human Interface Device Profile (HID) Eingabe
Serial Port Profile (SPP) Serielle Datenübertragung
Synchronisation Profile (SYNCH) Datenabgleich

Eine komplette Liste befindet sich hier.

Für das Erstellen von (Pico-) Netzen über Bluetooth bietet sich das Paket grml-btnet (aus dem universe) an.

  • bdaddr: Ändert die Bluetooth-Geräteadresse
  • bluesnarfer: versucht persönliche Informationen aus Bluetooth-Geräten auszulesen
  • btscanner: Bluetooth-scanner
  • ghettotooth: ein Perl-Skript für das permanente Scannen nach Geräten
  • gnokii: tools für SMS, Telefonbuch, Kalender, Anrufverwaltung
  • Redfang findet versteckte (non-discoverable) Geräte durch ausprobieren der letzten 6 Bytes der Bluetooth-Adresse

FIXME Senden und empfangen von Dateien via Bluetooth

  • obexpushd: Als Dienst auf dem Rechner installiert und schon können mobile Geräte Dateien schicken, die dann im Home-Ordner abgelegt werden
  • obexfs
  • obexftp
  • p3nfs: Zugriff auf Dateisysteme von Symbian-Handys
  • MultiSync: Syncronisationstools (Gnome) für Adressbücher, Kalender, …
  • opensync-plugin-irmc
  • kdebluetooth-irmcsync
  • /usr/bin/ciptool - Bluetooth Common ISDN Access Profile (CIP)
  • /usr/bin/dund - Bluetooth LAP (LAN Access over PPP) daemon
  • /usr/bin/hcitool - HCI Tool (diverse Informationen u.a. auch Verbindungsqulität)
  • /usr/bin/l2ping - Ping Bluetoothgeräte über das L2CAP-Protokoll
  • /usr/bin/pand - BlueZ Bluetooth PAN daemon (connect to ethernet networks using Bluetooth)
  • /usr/bin/rfcomm - RFCOMM (Sub-System des Kernels) configuration utility
  • /usr/bin/sdptool - control and interrogate SDP servers (SDP bietet einen Mechanismus zum Auffinden von Diensten und deren Eigenschaften an)
  • /usr/sbin/hciattach - attach serial devices via UART HCI to BlueZ stack
  • /usr/sbin/hciconfig - konfiguriert Bluetooth-Geräte