Bluetooth

De ArchwikiFR


Pré-requis

Avoir un périphérique bluetooth ;-)

Certaines des commandes/utilisations de ce tutoriel peuvent ne pas fonctionner avec certains périphériques.

Installation

Pour l'utiliser, il suffit d'installer bluez (bien sûr, les dépendances suivent):

pacman -S bluez

Selon le cas, il peut être nécessaire d'installer bluez-utils, openobex, obexftp et obexfs.

Lancement et démarrage automatique:

systemctl enable bluetooth.service 
systemctl start bluetooth.service

Configuration

La configuration de base se fait depuis le fichier /etc/bluetooth/main.conf:

A compléter

Une modification de ce fichier nécessite un redémarrage du service:

systemctl restart bluetooth.service

Utilisation de base

Bluez Utils

bluez-utils contient un certain nombre de commandes offrant à l'utilisateur la possibilité de configurer le bluetooth en ligne de commande.

Informations du controlleur et détection des appareils

Connaître les infos sur son périphérique. (Comme pour le wifi, certaines cartes peuvent ne pas se charger automatiquement donc si vous avez rfkill) Vérifier l'activation de la carte et si le résultat donne:

$ rfkill list
0: acer-wireless: Wireless LAN
       Soft blocked: no
       Hard blocked: no
1: acer-bluetooth: Bluetooth
       Soft blocked: yes
       Hard blocked: no
2: phy0: Wireless LAN
       Soft blocked: no
       Hard blocked: no

exécuter(afin de tout mettre à no):

$ rfkill unblock all

ensuite,

$ hcitool dev
Devices:
	hci0	5C:AC:4C:FB:C8:33

$ hciconfig -a
hci0:	Type: USB
	BD Address: 5C:AC:4C:FB:C8:33 ACL MTU: 377:10 SCO MTU: 16:0
	UP RUNNING PSCAN ISCAN 
	RX bytes:157726 acl:879 sco:866 events:1027 errors:0
	TX bytes:865889 acl:2879 sco:0 commands:206 errors:0
	Features: 0xff 0xfe 0x0d 0x38 0x08 0x08 0x00 0x00
	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: 1.2 (0x2) HCI Rev: 0x0 LMP Ver: 1.2 (0x2) LMP Subver: 0x309
	Manufacturer: Broadcom Corporation (15)

Si, en lieu et place de la ligne :

UP RUNNING PSCAN ISCAN

se trouve :

DOWN

Il suffit alors d'allumer le périphérique :

hciconfig hci0 up

À présent, il est possible d'éffectuer un scan des appareils alentours :

$ hcitool inq
Inquiring ...
	00:xx:xx:xx:xx:xx	clock offset: 0x3c29	class: 0x500204

$ hcitool scan
Scanning ...
        00:xx:xx:xx:xx:xx       K750i 

Recherche de services

Le package bluez-utils permet également d'obtenir des informations sur les services des périphériques :

sdptool browse 00:xx:xx:xx:xx:xx

Pour rechercher par exemple les informations nécessaires pour l'envoi de fichiers:

$ sdptool search OPUSH
Inquiring ...
Searching for OPUSH on xx:xx:xx:xx:xx:xx ...
Service Name: OPP
Service RecHandle: 0x10004
Service Class ID List:
  "OBEX Object Push" (0x1105)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 5
  "OBEX" (0x0008)
Profile Descriptor List:
  "OBEX Object Push" (0x1105)
    Version: 0x0100

2 paramètres importants:

  • Adresse MAC: xx:xx:xx:xx:xx:xx
  • Canal OPUSH: 5 dans l'exemple (Channel: 5)

Apparier et connecter un appareil

bluez est livré avec une commande intéractive :

$ bluetoothctl
[NEW] Controller 5C:AC:4C:FB:C8:33 samus-0 [default]
[bluetooth]#

Remarquons dans un premier que le contrôleur est reconnu automatiquement lors du lancement de la commande.

On peut obtenir la liste des commandes disponibles à l'aide de :

[bluetooth]# help
Available commands:
  list                       List available controllers
  show [ctrl]                Controller information
  select <ctrl>              Select default controller
  devices                    List available devices
  power <on/off>             Set controller power
  pairable <on/off>          Set controller pairable mode
  discoverable <on/off>      Set controller discoverable mode
  agent <on/off/capability>  Enable/disable agent with given capability
  default-agent              Set agent as the default one
  scan <on/off>              Scan for devices
  info <dev>                 Device information
  pair <dev>                 Pair with device
  trust <dev>                Trust device
  remove <dev>               Remove device
  connect <dev>              Connect device
  disconnect <dev>           Disconnect device
  version                    Display version
  quit                       Quit program

Pour pouvoir apparier son appareil, il va falloir déclarer un agent :

[bluetooth]# agent on
Agent registered

et mettre le contrôleur sous tension :

[bluetooth]# power on
Changing power on succeeded

Une fois ces étapes effectuées, on peut chercher les appareils à proximité :

[bluetooth]# scan on
Discovery started
[CHG] Controller 00:10:20:30:40:50 Discovering: yes
[NEW] Device 00:12:34:56:78:90 myLino
[CHG] Device 00:12:34:56:78:90 LegacyPairing: yes

Il ne reste plus qu'à apparier et connecter :

[bluetooth]# pair 00:12:34:56:78:90
Attempting to pair with 00:12:34:56:78:90
[CHG] Device 00:12:34:56:78:90 Connected: yes
[CHG] Device 00:12:34:56:78:90 Connected: no
[CHG] Device 00:12:34:56:78:90 Connected: yes
Request PIN code
[agent] Enter PIN code: 1234
[CHG] Device 00:12:34:56:78:90 Paired: yes
Pairing successful
[CHG] Device 00:12:34:56:78:90 Connected: no
[bluetooth]# connect 00:12:34:56:78:90
[CHG] Device 00:12:34:56:78:90 Connected: yes

Et voilà l'appareil est apparié et connecté.

Envoyer un fichier

Il vous faut pour cela le paquet openobex.

$ obex_test -b xx:xx:xx:xx:xx:xx 5
Using Bluetooth RFCOMM transport
OBEX Interactive test client/server.
> c
Connect OK!
Version: 0x10. Flags: 0x00
> p
PUT file (local, remote)> custom/avatar/tuxlogo.jpg logo.jpg
name=custom/avatar/tuxlogo.jpg, size=23710
Going to send 23710 bytes
Made some progress...
Made some progress...
Made some progress...
Made some progress...
PUT successful!
> q

Encore plus simplement avec le paquet obexftp:

obexftp -b 00:xx:xx:xx:xx:xx -p test.jpg 
Browsing 00:xx:xx:xx:xx:xx ...
Channel: 7
Connecting...done
Sending "test.jpg"...\done
Disconnecting...done

Parcourir et récupérer un fichier

On aura besoin de obexftp.

Lister les répertoires/fichiers disponibles:

obexftp -b 00:xx:xx:xx:xx:xx -l

Récupérer un fichier en particulier:

obexftp -b 00:xx:xx:xx:xx:xx -g test.jpg

On peut aussi monter le périphérique comme répertoire à l'aide de obexfs:

obexfs -b 00:xx:xx:xx:xx:xx repertoire_de_montage
A compléter

Recevoir un fichier envoyé

A compléter

Utilisation de RFCOMM

rfcomm permet de rattacher une connexion bluetooth au noyau.

Recherche de services

Pour exemple, on va prendre le service DUN qui permet d'établir une liaison ppp.

$ sdptool search DUN
Inquiring ...
Searching for DUN on 00:xx:xx:xx:xx:xx ...
Service Name: Dial-up networking
Service RecHandle: 0x10002
Service Class ID List:
  "Dialup Networking" (0x00001103)
Protocol Descriptor List:
  "L2CAP" (0x00000100)
  "RFCOMM" (0x00000003)
    Channel: 1
Profile Descriptor List:
  "Dialup Networking" (0x00001103)
    Version: 0x0100

Configuration

Pour configurer une liaison avec le périphérique, il faut d'abord modifier le fichier /etc/bluetooth/rfcomm.conf:

rfcomm0 {
        # Automatically bind the device at startup
        bind yes;
	channel 1;
        # Bluetooth address of the device
        device 00:xx:xx:xx:xx:xx;
}

Si on veut avoir une liaison au démarrage, il faut modifier le fichier /etc/rc.d/bluetooth pour avoir:

RFCOMM_ENABLE="true"

Utilisation

Maintenant, on est prêt à se connecter au périphérique en lancant en root:

rfcomm connect 0

ce qui est équivalent à

rfcomm connect 0 00:xx:xx:xx:xx:xx 1

Si un code pin est nécessaire, il vous faudra lancer un agent (si ce n'est déjà fait):

bluez-simple-agent

Une fois les commandes exécutées, vous devriez avoir un fichier /dev/rfcomm0 que vous pouvez utiliser comme périphérique pour une connexion ppp par exemple.

Par défaut, le démarrage du service bluetooth ne fait qu'attacher le périphérique sans initier la connection, ce qui est équivalent à la commande suivante:

rfcomm bind 0
Note: Pour une utilisation en tant qu'utilisateur, il faut modifier les permissions de /dev/rfcommX pour y permettre l'accès. (avec un règle udev par exemple)

Utilisation d'un casque/oreillette bluetooth

Il existe plusieurs méthodes pour permettre la liaison audio en bluetooth. Nous en verrons deux ici : la première utilisant pulseaudio et la seconde utilisant bluez-alsa.

Avec pulseaudio

Dans le cas où vous utilisez pulseaudio, il faut tout d'abord installer le paquet supplémentaire pulseaudio-bluetooth. Démarrez le service bluetooth.service

Connectez ensuite votre périphérique audio en suivant les étapes de la section Apparier et connecter un appareil.

Si tout fonctionne correctement, une nouvelle sortie son est maintenant disponible dans PulseAudio.

Note: La sortie peut être désactivée par défaut. Il faut alors sélectionner le statut de la sortie (OFF, A2DP, HFP) dans l'onglet "Configuration" de pavucontrol.

Vous pouvez alors envoyer le son des applications vers cette sortie à l'aide de pavucontrol.

Avec bluez-alsa (ie sans pulseaudio)

Depuis sa version 5, Bluez ne supporte plus ALSA. Il faut un logiciel entre alsa et bluez. C'est ce qu'apporte bluez-alsa à l'instar du module bluetooth de pulseaudio. Le paquet est disponible sur AUR bluez-alsa-git.

Note: ce logiciel est récent et a potentiellement quelques bugs. N'héistez pas à les remonter

Ce paquet installe l'application bluealsa qui déclare au démon bluetooth qu'il peut se charger des périphériques audio et qui s'interface avec alsa pour créer un périphérique audio virtuel. Ensuite, il faut configurer alsa pour utiliser utiliser ce périphérique et spécifier le périphérique bluetooth.

Pour pouvoir l'utiliser, il va falloir être dans le groupe audio :

 # usermod -aG audio <user>

permettre à blueaudio de discuter avec bluez, pour cela, il faut ajouter au fichier /etc/dbus-1/system.d/bluetooth.conf les lignes suivantes

Fichier: /etc/dbus-1/system.d/bluetooth.conf
<policy user="bluealsa">
  <allow send_destination="org.bluez"/>
</policy>

Tout est bon pour démarrer le service bluealsa.service

Si la configuration est bonne, la commande journalctl -u bluealsa doit vous répondre un message ressemblant à celui ci :

 systemd[1]: Started BluezAlsa proxy.
 bluealsa[11362]: /usr/bin/bluealsa: ctl.c:353: Starting controller loop
 bluealsa[11362]: /usr/bin/bluealsa: bluez.c:677: Registering endpoint: 0000110A-0000-1000-8000-00805F9B34FB: /MediaEndpoint/A2DP_MPEG24_Source
 bluealsa[11362]: /usr/bin/bluealsa: bluez.c:677: Registering endpoint: 0000110A-0000-1000-8000-00805F9B34FB: /MediaEndpoint/A2DPSource
 bluealsa[11362]: /usr/bin/bluealsa: bluez.c:677: Registering endpoint: 0000110B-0000-1000-8000-00805F9B34FB: /MediaEndpoint/A2DP_MPEG24_Sink
 bluealsa[11362]: /usr/bin/bluealsa: bluez.c:677: Registering endpoint: 0000110B-0000-1000-8000-00805F9B34FB: /MediaEndpoint/A2DPSink
 bluealsa[11362]: /usr/bin/bluealsa: bluez.c:893: Registering profile: 00001108-0000-1000-8000-00805F9B34FB: /Profile/HSPHeadset
 bluealsa[11362]: /usr/bin/bluealsa: bluez.c:893: Registering profile: 00001112-0000-1000-8000-00805F9B34FB: /Profile/HSPAudioGateway
 bluealsa[11362]: /usr/bin/bluealsa: main.c:202: Starting main dispatching loop

Ensuite, il faut connecter le périphérique audio bluetooth en suivant les étapes de la section Apparier et connecter un appareil.

Pour tester, aplay est votre ami :

 aplay -D bluealsa:HCI=hci0,DEV=XX:XX:XX:XX:XX:XX,PROFILE=a2dp NeverGonnaGiveYouUp.wav

en remplaçant XX:XX:XX:XX:XX:XX par l'adresse MAC du périphérique bluetooth.

Pour ensuite avoir une configuration utilisable pour le commun des logiciels, il faut configurer alsa, avec le fichier ~/.asoundrc par exemple, en y mettant :

 defaults.bluealsa.interface "hci0"
 defaults.bluealsa.device "XX:XX:XX:XX:XX:XX"
 defaults.bluealsa.profile "a2dp"

Pour régler le son :

 alsamixer -D bluealsa

Utilisation d'une souris bluetooth

De plus en plus d'ordinateurs sont livrés avec le bluetooth intégré, autant en profiter et libérer un port USB en s'affranchissant du dongle usb.
On peut éventuellement se passer de la configuration au niveau système et utiliser une configuration au niveau utilisateur -> GUI

Test

Par rapport à la configuration par défaut, il nous faut charger le module hidp et utiliser la commande hidd, nous verrons par la suite comment rendre ceci automatique.
Mais avant d'utiliser cette commande, il faut que votre souris soit en mode associatif, ce dernier est le plus souvent activé par la pression d'un bouton sous la souris.

modprobe hidp
hidd --search
Searching ...
        Connecting to device 00:0x:xx:xx:xx:xx

hidd --search recherche tous les périphériques en mode associatif et tente de s'y connecter. Si la souris est détecté mais qu'il n'est pas arrivé à se connecter, vous pouvez tenter:

hidd --connect 00:0x:xx:xx:xx:xx

Si tout s'est bien passé, vous devriez avoir votre souris qui fonctionne.

Configuration au démarrage

Pour faire fonctionner votre souris dès le démarrage, il vous faut dans le fichier /etc/conf.d/bluetooth:

  • activer le daemon hidd:
HIDD_ENABLE="true"
  • et lui demander de se connecter:
HIDD_OPTIONS="--connect 00:0x:xx:xx:xx:xx"

Il ne faut pas, bien sûr, oublier de lancer le service bluetooth au démarrage.

Connexion PAN

Utilisation

On peut utiliser le Bluetooth pour se connecter à un réseau à l'aide du mode PAN (Personnal Area Network) du périphérique, cette fonctionnalité est activé par défaut, il suffit de la configurer.

Dans le cas où ce n'est pas activé:

modprobe bnep

Prenons par exemple un périphérique tel un smartphone qui dispose de cette fonctionnalité, afin de s'y connecter, il suffit de lancer:

pand --connect 00:0x:xx:xx:xx:xx

Cette commande aura pour conséquence de créer un périphérique réseau bnep0 (ou x si ce n'est pas le premier).

Configuration du nouveau périphérique:

dhcpcd bnep0

Et vous voilà connecté pour peu que votre téléphone soit lui même connecté au net.

Configuration au démarrage

Pour se connecter dès le démarrage, il vous faut dans le fichier /etc/conf.d/bluetooth:

  • activer le daemon pand:
PAND_ENABLE="true"
  • et lui demander de se connecter:
PAND_OPTIONS="--connect 00:0x:xx:xx:xx:xx"

Et lancer le service bluetooth au démarrage.

Avancé

Il est possible de configurer le périphérique bluetooth après le démarrage en utilisant les commandes hciconfig, hcitool. Ces commandes sont à lancer en tant que root, certaines actions sont néanmoins possibles pour l'utilisateur normal à travers DBUS.

-> API DBUS de BlueZ.

Pour appeler une fonction de l'api DBUS de BlueZ, la faire précéder par:

dbus-send --system --type=method_call --print-reply --dest=org.bluez /org/bluez/hci0 


Pour modifier les modes de l'appareil:

Commande Fonction DBUS Visible Nouvelles connections? Période
org.bluez.Adapter.GetMode retourne le mode de l'appareil.
hciconfig hci0 noscan org.bluez.Adapter.SetMode string:off - - -
hciconfig hci0 pscan org.bluez.Adapter.SetMode string:connectable - x -
hciconfig hci0 piscan org.bluez.Adapter.SetMode string:discoverable x x x

GUI

A compléter

Liens externes

OpenObex (en)
Bluez (en)