Bluetooth
Cet article décrit la configuration et l'usage des contrôleurs Bluetooth et des appareils Bluetooth.
Prérequis
Installation
Noyau
Le plus souvent, il suffira d'activer les protocoles RFCOMM (CONFIG_RFCOMM), HIDP (CONFIG_BT_HIDP), HCI USB (CONFIG_BT_HCIBTUSB) et/ou HCI UART (CONFIG_BT_HCIUART). Le pilote d'entrée-sortie utilisateur pour les équipements récepteurs HID (CONFIG_UHID) doit être activé dans le cas des claviers et souris Bluetooth.
[*] Networking support --->
<M> Bluetooth subsystem support --->
[*] Bluetooth Classic (BR/EDR) features
<*> RFCOMM protocol support
[ ] RFCOMM TTY support
< > BNEP protocol support
[ ] Multicast filter support
[ ] Protocol filter support
<*> HIDP protocol support
[*] Bluetooth High Speed (HS) features
[*] Bluetooth Low Energy (LE) features
Bluetooth device drivers --->
<M> HCI USB driver
<M> HCI UART driver
<*> RF switch subsystem support --->
Device Drivers --->
HID support --->
<*> User-space I/O driver support for HID subsystem
Kernel may fail to initialize RFCOMM/BNEP being compiled as built-in. System log for bluetooth service in this case will mention the lack of RFCOMM/BNEP support. And this in turn for example may break HSP/HFP headset profile initialization. So if dmesg says nothing about RFCOMM, better recompile as a module.
Les micrologiciels
La plupart des contrôleurs Bluetooth ont besoin de micrologiciel (firmware) pour pouvoir fonctionner. Si le contrôleur est compatible avec Linux, dmesg indiquera la plupart du temps si un micrologiciel est nécessaire. Le paquet sys-kernel/linux-firmware doit, en règle générale, proposer un micrologiciel mais parfois certains équipements ne pourront fonctionner qu'avec un micrologiciel propriétaire.
root #
emerge --ask --noreplace sys-kernel/linux-firmware
Options de la variable USE
BlueZ est une implémentation du protocole Bluetooth pour Linux disponible en installant le paquet net-wireless/bluez.
USE flags for net-wireless/bluez Bluetooth Tools and System Daemons for Linux
+mesh
|
Add support for Bluetooth Mesh control application and advertising bearer. |
+obex
|
Enable OBEX transfer support |
+readline
|
Enable support for libreadline, a GNU line-editing library that almost everyone wants |
+udev
|
Enable virtual/udev integration (device discovery, power and storage device support, etc) |
btpclient
|
Enable BTP client |
cups
|
Add support for CUPS (Common Unix Printing System) |
debug
|
Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces |
deprecated
|
Build deprecated plugins |
doc
|
Add extra documentation (API, Javadoc, etc). It is recommended to enable per package instead of globally |
experimental
|
Build experimental plugins |
extra-tools
|
Install tools that upstream doesn't install on purpose by default. All this tools shouldn't be used. Then, please notify upstream about you still need them to let them know the situation. |
man
|
Build and install man pages |
midi
|
Enable MIDI support |
selinux
|
!!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur |
systemd
|
Enable use of systemd-specific libraries and features like socket activation or session tracking |
test
|
Enable dependencies and/or preparations necessary to run tests (usually controlled by FEATURES=test but can be toggled independently) |
test-programs
|
Install tools for testing of various Bluetooth functions |
Bluetooth peut être globalement activé en donnant la valeur bluetooth
à la variable USE :
USE="bluetooth"
Installation
Le système doit être mis à jour si la variable USE a été modifiée pour prendre la valeur bluetooth
:
root #
emerge --ask --changed-use --deep @world
Installer BlueZ:
root #
emerge --ask --noreplace net-wireless/bluez
Configuration
Droits d'accès
Les droits d'accès pour les équipements Bluetooth sont automatiquement gérés par D-Bus, et l'accès est automatiquement accordé à tous les utilisateurs par défaut.
Services
OpenRC
Démarrer Bluetooth :
root #
rc-service bluetooth start
Lancer Bluetooth au démarrage :
root #
rc-update add bluetooth default
systemd
Démarrer Bluetooth :
root #
systemctl start bluetooth
Lancer Bluetooth au démarrage :
root #
systemctl enable bluetooth
Enabling battery reporting
Using bluez's experimental mode may prevent some bluetooth microphones from connecting automatically.[1]
Bluez has a feature to report a devices battery level to upower. This feature is currently experimental and not stable. Enable experimental mode:
[General]
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
Experimental=true
Restart bluetooth to apply the configuration changes:
root #
rc-service bluetooth restart
Now upower should know the battery level of every device which supports sending its own battery level.
Utilisation
Configuration du contrôleur
Afficher l'information sur le contrôleur :
hciconfig et d'autres fonctionnalités peuvent être utilisées à la condition que le paquet net-wireless/bluez soit installé avec la valeur de la variable USE
deprecated
.root #
hciconfig -a
hci0: Type: BR/EDR Bus: USB BD Address: 00:02:72:2F:A9:33 ACL MTU: 1021:8 SCO MTU: 64:1 UP RUNNING PSCAN RX bytes:1166 acl:0 sco:0 events:43 errors:0 TX bytes:960 acl:0 sco:0 commands:43 errors:0 Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87 Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 Link policy: RSWITCH SNIFF Link mode: SLAVE ACCEPT Name: 'BlueZ 5.21' Class: 0x000104 Service Classes: Unspecified Device Class: Computer, Desktop workstation HCI Version: 4.0 (0x6) Revision: 0x1000 LMP Version: 4.0 (0x6) Subversion: 0x220e Manufacturer: Broadcom Corporation (15)
Où hci0
est le nom du contrôleur et UP
(3ème ligne) indique que le contrôleur est activé.
Activer le contrôleur si hciconfig indique (avec DOWN
) (3ème ligne) que le contrôleur est désactivé:
root #
hciconfig hci0 up
Au moment de l'essai d'activation du contrôleur, peut s'afficher le message suivant:
Can't init device hci0: Operation not possible due to RF-kill
Dans ce cas, requêter l'état de l'émetteur radio Bluetooth à l'aide de rfkill :
root #
rfkill list bluetooth
0: hci0: Bluetooth Soft blocked: no Hard blocked: no
rfkill est fourni par >=sys-apps/util-linux-2.31. Il peut aussi être installé par le paquet net-wireless/rfkill (non maintenu).
Si Bluetooth est bloqué ou désactivé dans le BIOS/UEFI, rfkill peut incorrectement indiquer que le contrôleur est dans l'état
Hard blocked: no
.Débloquer le contrôler si rfkill indique (par le message Soft blocked: yes
) que le contrôleur est bloqué :
root #
rfkill unblock bluetooth
Si rfkill indique (par le message Hard blocked: yes
) que le contrôleur est bloqué, débloquer le contrôleur en changeant la position d'un interrupteur physique ou en appuyant sur une touche de fonction du clavier.
Les contrôleurs Blutooth peuvent être automatiquement activés en spécifiant AutoEnable=true
dans le fichier /etc/bluetooth/main.conf:
[Policy]
AutoEnable=true
Il peut arriver que les contrôleurs Bluetooth aient été bloqués par l'action d'un des outils logiciels de gestion de l'énergie (udev). S'assurer dans ce cas que la valeur de state est fixée à 1
dans le fichier de règles correspondant ou sinon effacer complètement la ligne suivante :
SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="1"
Appairage
Les appareils Bluetooth doivent être appairés avec un contrôleur Bluetooth avant toute utilisation. Pour cela, il faut entrer un code PIN (ou tout autre type de code) dans les deux équipements par le biais d'un agent interactif. Certains appareils, comme les casques audio, ne permettent pas d'entrer un code PIN arbitraire. Ces appareils utilisent un code PIN statique, qui est d'habitude 0000, 1111, 1234 or 9999. D'autres appareils (par exemple La télécommande BD de Sony) ne demandent pas d'entrer un code PIN et, dans ce cas, essayer de rentrer un code PIN à l'invite fera échouer l'appairage. Avec ce type d'appareil, l'étape de l'appairage peut être sautée.
Cet article ne porte que sur l'appairage des appareils avec bluetoothctl, qui est un agent interactif en ligne de commande fourni avec le paquet net-wireless/bluez. Si un environnement de bureau graphique est utilisé, l'appairage peut être mené à bien à l'aide d'un agent interactif doté d'une interface graphique. Pour KDE, utiliser kde-plasma/bluedevil, pour GNOME, net-wireless/gnome-bluetooth, et pour GTK choisir entre net-wireless/blueman ou net-wireless/blueberry.
Les appareils antérieurement appairés devront l'être à nouveau après une mise à jour logicielle vers BlueZ 4.
Démarrer bluetoothctl :
user $
bluetoothctl
Lister les contrôleurs disponibles :
[bluetooth]#
list
Afficher l'information sur un contrôleur :
[bluetooth]#
show controller_mac_address
Etablir le contrôleur par défaut :
[bluetooth]#
select controller_mac_address
Mettre en route le contrôleur :
[bluetooth]#
power on
Activer l'agent et en faire l'agent par défaut :
[bluetooth]#
agent on
[bluetooth]#
default-agent
Rendre le contrôleur visible (pour une durée temporaire de 3 minutes) et appairable :
[bluetooth]#
discoverable on
[bluetooth]#
pairable on
Analyser l'environnement pour trouver des appareils appairables :
[bluetooth]#
scan on
Mettre l'appareil en mode d'appairage, ce qui en général nécessite d'appuyer sur un bouton ou une combinaison de boutons, d'habitude pour plusieurs secondes.
Découvrir l'adresse MAC de l'appareil :
[bluetooth]#
devices
Appairer avec l'appareil :
[bluetooth]#
pair mac_address_de_appareil
Entrer le PIN s'il est demandé :
[agent]
PIN code: ####
In case the pin is not prompted but needed, this command may need to be added before pairing with the device (see this post):
[bluetooth]#
agent NoInputNoOutput
Autoriser le service si cela est demandé :
[agent]
Authorize service uuid_du_service (yes/no): yes
Considérer l'appareil comme un appareil de confiance :
[bluetooth]#
trust address_mac_de_appareil
Connecter l'appareil :
[bluetooth]#
connect device_mac_address
Afficher l'information sur l'appareil :
[bluetooth]#
info adresse_mac_de_appareil
L'appareil est désormais appairé :
[bluetooth]#
quit
hciconfig
- Open and initialize HCI device:
root #
hciconfig -a <hci0> up
- Close HCI device:
root #
hciconfig -a <hci0> down
- Reset HCI device:
root #
hciconfig -a <hci0> reset
- Reset statistic counters:
root #
hciconfig -a <hci0> rstat
- Enable Authentication:
root #
hciconfig -a <hci0> auth
- Disable Authentication:
root #
hciconfig -a <hci0> noauth
- Enable Encryption:
root #
hciconfig -a <hci0> encrypt
- Disable Encryption:
root #
hciconfig -a <hci0> noencrypt
- Enable Page and Inquiry scan:
root #
hciconfig -a <hci0> piscan
- Disable scan:
root #
hciconfig -a <hci0> noscan
- Enable Inquiry scan:
root #
hciconfig -a <hci0> iscan
- Enable Page scan:
root #
hciconfig -a <hci0> pscan
- Get/Set default packet type:
root #
hciconfig -a <hci0> ptype [type]
- Get/Set default link mode:
root #
hciconfig -a <hci0> lm [mode]
- Get/Set default link policy:
root #
hciconfig -a <hci0> lp [policy]
- Get/Set local name:
root #
hciconfig -a <hci0> name [name]
- Get/Set class of device:
root #
hciconfig -a <hci0> class [class]
- Get/Set voice setting:
root #
hciconfig -a <hci0> voice [voice]
- Get/Set inquiry access code:
root #
hciconfig -a <hci0> iac [iac]
- Get/Set inquiry transmit power level:
root #
hciconfig -a <hci0> nqtpl [level]
- Get/Set inquiry mode:
root #
hciconfig -a <hci0> inqmode [mode]
- Get/Set inquiry data:
root #
hciconfig -a <hci0> inqdata [data]
- Get/Set inquiry scan type:
root #
hciconfig -a <hci0> inqtype [type]
- Get/Set inquiry scan window and interval:
root #
hciconfig -a <hci0> inqparms [win:int]
- Get/Set page scan window and interval:
root #
hciconfig -a <hci0> pageparms [win:int]
- Get/Set page timeout:
root #
hciconfig -a <hci0> ageto [to]
- Get/Set AFH mode:
root #
hciconfig -a <hci0> afhmode [mode]
- Get/Set Simple Pairing Mode:
root #
hciconfig -a <hci0> sspmode [mode]
- Set ACL MTU and number of packets:
root #
hciconfig -a <hci0> clmtu <mtu:pkt>
- Set SCO MTU and number of packets:
root #
hciconfig -a <hci0> scomtu <mtu:pkt>
- Delete link key from the device:
root #
hciconfig -a <hci0> delkey <bdaddr>
- Get local OOB data:
root #
hciconfig -a <hci0> oobdata
- Display supported commands:
root #
hciconfig -a <hci0> commands
- Display device features:
root #
hciconfig -a <hci0> features
- Display version information:
root #
hciconfig -a <hci0> version
- Display revision information:
root #
hciconfig -a <hci0> revision
- Add a device to the blacklist:
root #
hciconfig -a <hci0> block <bdaddr>
- Remove a device from the blacklist:
root #
hciconfig -a <hci0> unblock <bdaddr>
- Set LE Random Address:
root #
hciconfig -a <hci0> lerandaddr <bdaddr>
- Enable LE advertising:
root #
hciconfig -a <hci0> leadv [type]
- Show all commands device has support for:
root #
hciconfig get commands
Désactiver le Bluetooth
Pour désactiver Bluetooth pendant qu'il s'exécute, exécuter la commande suivante:
root #
rfkill block bluetooth
Pour désactiver Bluetooth automatiquement à chaque démarrage, choisir entre les possibilités suivantes :
Utiliser udev pour déactiver Bluetooth
En cas d'utilisation de UDEV, il suffit d'installer la règle suivante, ce qui va désactiver Bluetooth :
SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0"
Utiliser OpenRc pour déactiver Bluetooth
En cas d'utilisation de sys-apps/openrc, il faut installer le script suivant pour les services locaux ; ne pas oublier de le rendre exécutable :
#!/bin/sh
rfkill block bluetooth
root #
chmod o+x /etc/local.d/disable-bluetooth.start
Désactiver Bluetooth au niveau du noyau
Quand le noyau intègre Bluetooth comme fonctionnalité modulaire, il faut désactiver le chargement des modules Bluetooth :
blacklist bnep
blacklist bluetooth
blacklist btusb
En cas de problème
TLP et laptop_mode
TLP and laptop_mode
Si laptop-mode-tools est installé ou TLP, s'assurer qu'ils ne désactivent pas Bluetooth pour économiser de l'énergie.
XBOX ONE controller pairing
It's a known issue that XBOX ONE wireless controllers will refuse to pair out of the box on most linux systems. To solve this issue ERTM needs to be disabled.
To disable it manually:
root #
echo 'Y' > /sys/module/bluetooth/parameters/disable_ertm
This will disable ERTM only until the system is rebooted. To disable it permanently, install the xpadneo kernel module.
root #
emerge --ask games-util/xpadneo
In most cases, this will automatically solve the issue. If it doesn't, add this line into xpadneo config manually:
options bluetooth disable_ertm=Y
Notebook has a Synopsys DesignWare Controller
Bluetooth support for this controller needs also these options in kernel config[2]:
Device Drivers --->
Character devices --->
Serial drivers --->
[*] 8250/16550 and compatible serial support
[*] Support for Synopsys DesignWare 8250 quirks
Resolving firmware problems
It happens that the firmware of bluetooth adapters enters a state where it is unable to pair with a certain (or all) bluetooth devices. Resetting the adapter might solve such problems.
In the case of a laptop with a built-in bluetooth adapter this might be achieved by:
- Enter the laptop's firmware settings (BIOS) and disable the built-in adapter
- Save settings and restart the laptop
- Enter the firmware settings a second time and enable the bluetooth adapter again
- Save and restart
- Now try to pair the device again
Voir aussi
- Bluetooth headset — describes the configuration of Bluetooth headsets within Gentoo Linux.
- Bluetooth input devices — describes the setup of Bluetooth input devices, for example a bluetooth mouse, on a Linux system.
- Bluetooth Network Aggregation Point — covers the setup of a Bluetooth Network Aggregation Point (NAP) on Gentoo Linux.
- Broadcom Bluetooth — details setup for Broadcom Bluetooth 4.x devices mostly based on BCM20702, BCM4354, and BCM4356 chipsets.