Bluetooth: Difference between revisions

From Alpine Linux
m (fix name of the package for file transfer)
(removed draft notice, changed heading and rearranged them, fixed link)
Line 1: Line 1:
{{Draft|work in progress}}
[https://en.wikipedia.org/wiki/Bluetooth Bluetooth] is a standard for the short-range wireless interconnection of cellular phones, computers, and other electronic devices. [https://www.bluez.org/ BlueZ] is an implementation of the Bluetooth protocol stack for Linux, and it is provided by the {{Pkg|bluez}} package.
[https://en.wikipedia.org/wiki/Bluetooth Bluetooth] is a standard for the short-range wireless interconnection of cellular phones, computers, and other electronic devices. [https://www.bluez.org/ BlueZ] is an implementation of the Bluetooth protocol stack for Linux, and it is provided by the {{Pkg|bluez}} package.


This article describes the basic installation of Bluetooth controllers and devices.
This article describes the basic installation of Bluetooth controllers and devices.


== Prerequisites and Basic Installation ==
== Prerequisites ==


=== Prerequisites ===
* Set up [[Include:Setup Device Manager|eudev]]
{{todo|test bluetooth with [[mdev]]}}


{{Pkg|eudev}} should be installed and setup:
== Installation ==
 
{{Cmd|# setup-devd udev}}
 
=== Basic Installation ===


Basic installation is as follows:
Basic installation is as follows:
Line 48: Line 41:


=== File transfer ===
=== File transfer ===
Install the {{Pkg|openobex}} package.
Install the {{Pkg|openobex}} package.


Line 60: Line 54:
* {{Pkg|gnome-bluetooth}}: the [[GNOME]] Bluetooth manager
* {{Pkg|gnome-bluetooth}}: the [[GNOME]] Bluetooth manager


== Pairing ==
== Configuration ==


=== Using <code>bluetoothctl</code> ===
=== Pairing with <code>bluetoothctl</code> ===


Begin by starting <code>bluetoothctl</code> and follow these basic steps:
Begin by starting <code>bluetoothctl</code> and follow these basic steps:
Line 131: Line 125:


  <span style="color:blue;">[bluetooth]</span># quit
  <span style="color:blue;">[bluetooth]</span># quit
== Configuration ==


=== Set adapter power state ===
=== Set adapter power state ===


If you would like the adapter to not be automatically enabled (e.g. on a portable device where you wish to save battery), set <code>AutoEnable=false</code> in <code>/etc/bluetooth/main.conf</code> in the <code>[Policy]</code> section:
If you would like the adapter to not be automatically enabled (e.g. on a portable device where you wish to save battery), set <code>AutoEnable=false</code> in <code>/etc/bluetooth/main.conf</code> in the <code>[Policy]</code> section: {{Cat|/etc/bluetooth/main.conf|[Policy]
 
 
{{Cat|/etc/bluetooth/main.conf|[Policy]
...
...
AutoEnable&#61;false
AutoEnable&#61;false
Line 146: Line 135:
=== Battery Reporting ===
=== Battery Reporting ===


An experimental feature can be enabled in order to report device battery level:
An experimental feature can be enabled in order to report device battery level: {{Cat|/etc/bluetooth/main.conf|[General]
 
 
{{Cat|/etc/bluetooth/main.conf|[General]
...
...
Experimental&#61;true
Experimental&#61;true
Line 168: Line 154:
One possible solution is that you are missing firmware drivers.
One possible solution is that you are missing firmware drivers.


Try running the following command to discover the source of the issue:
Try running the following command to discover the source of the issue: {{Cmd|# dmesg &#124; grep -i bluetooth &#124; grep -i firmware}}
 
{{Cmd|# dmesg &#124; grep -i bluetooth &#124; grep -i firmware}}


There are many firmware packages available that could likely solve the this problem (see {{Pkg|linux-firmware-*}}).
There are many firmware packages available that could likely solve the this problem (see {{Pkg|linux-firmware-*}}).


Another possible solution is to install {{Pkg|hidapi}} and add load the module:
Another possible solution is to install {{Pkg|hidapi}} and add load the module: {{Cmd|# apk add hidapi
 
{{Cmd|# apk add hidapi
&#35; modprobe uhid}}
&#35; modprobe uhid}}


It may also be necessary to create configuration to load the uhid and btusb kernel modules on boot:
It may also be necessary to create configuration to load the uhid and btusb kernel modules on boot: {{Cmd|cat <<EOF > /etc/modules-load.d/uhid.conf
 
{{Cmd|cat <<EOF > /etc/modules-load.d/uhid.conf
&#35;Load uhid kernel module:
&#35;Load uhid kernel module:
uhid
uhid
Line 199: Line 179:
Loading <code>uhid</code> with <code>modprobe</code> after encountering this error does not always fix the problem.
Loading <code>uhid</code> with <code>modprobe</code> after encountering this error does not always fix the problem.


Try setting up <code>uhid</code> to load at boot, and then rebooting:
Try setting up <code>uhid</code> to load at boot, and then rebooting: {{Cmd|# cat <<EOF > /etc/modules-load.d/uhid.conf
 
{{Cmd|# cat <<EOF > /etc/modules-load.d/uhid.conf
&#35;Load uhid kernel module:
&#35;Load uhid kernel module:
uhid
uhid
Line 207: Line 185:
&#35; reboot}}
&#35; reboot}}


Alternatively, the userspace HID feature can be disabled entirely in favour of kernel HIDP drivers in <code>/etc/bluetooth/input.conf</code>:
Alternatively, the userspace HID feature can be disabled entirely in favour of kernel HIDP drivers in <code>/etc/bluetooth/input.conf</code>: {{Cmd|1=UserspaceHID=false}}
 
{{Cmd|1=UserspaceHID=false}}


If running pipewire, you may also try installing {{Pkg|pipewire-spa-bluez}} to see if that solves the issue.
If running pipewire, you may also try installing {{Pkg|pipewire-spa-bluez}} to see if that solves the issue.
Line 219: Line 195:
This can solve the problem of controlling the speaker volume when switching between Bluetooth devices.
This can solve the problem of controlling the speaker volume when switching between Bluetooth devices.


Append the following lines at the end of the {{Path|/etc/pulse/default.pa}}:
Append the following lines at the end of the {{Path|/etc/pulse/default.pa}}: {{Cat|/etc/pulse/default.pa|...
 
 
{{Cat|/etc/pulse/default.pa|...
&#35;##Automatically switch audio to the most recently connected device (Bluetooth, HDMI, USB)
&#35;##Automatically switch audio to the most recently connected device (Bluetooth, HDMI, USB)
load-module module-switch-on-connect}}
load-module module-switch-on-connect}}

Revision as of 04:15, 26 June 2025

Bluetooth is a standard for the short-range wireless interconnection of cellular phones, computers, and other electronic devices. BlueZ is an implementation of the Bluetooth protocol stack for Linux, and it is provided by the bluez package.

This article describes the basic installation of Bluetooth controllers and devices.

Prerequisites

Installation

Basic installation is as follows:

  1. Install bluez
  2. Load the btusb kernel module
  3. Add user to the lp group
  4. Start and enable the Bluetooth service

# apk add bluez # apk add bluez-deprecated # modprobe btusb # adduser $USER lp # rc-service bluetooth start # rc-update add bluetooth default

Now, check the state of the Bluetooth radio transmitter using rfkill:

$ rfkill list bluetooth

It should return something similar to:

0: hci0: Bluetooth
        Soft blocked: no
        Hard blocked: no

If the device is listed as blocked, it can be unblocked using the same tool:

# rfkill unblock bluetooth

Note: It may be necessary to restart the Bluetooth service before continuing.

File transfer

Install the openobex package.

Front-ends

There are several front-ends available:

Configuration

Pairing with bluetoothctl

Begin by starting bluetoothctl and follow these basic steps:

$ bluetoothctl

The prompt should display:

[bluetooth]#

List the available controllers:

[bluetooth]# list

Display information about a controller:

[bluetooth]# show controller_mac_address

Set the default controller:

[bluetooth]# select controller_mac_address

Power on the controller:

[bluetooth]# power on

Enable the agent and set it as default:

[bluetooth]# agent on
[bluetooth]# default-agent

Set the controller as discoverable (temporarily for 3 minutes) and pairable:

[bluetooth]# discoverable on
[bluetooth]# pairable on

Scan for devices:

[bluetooth]# scan on

Put the device into pairing mode. This generally involves pressing a button or a combinations of buttons, usually for several seconds.

Discover the device MAC address:

[bluetooth]# devices

Pair with the device:

[bluetooth]# pair device_mac_address

Enter the PIN if prompted:

[agent] PIN code: ####

Trust the device:

[bluetooth]# #trust device_mac_address

Connect to the device:

[bluetooth]# connect device_mac_address

Display information about the device:

[bluetooth]# info device_mac_address

The device is now paired:

[bluetooth]# quit

Set adapter power state

If you would like the adapter to not be automatically enabled (e.g. on a portable device where you wish to save battery), set AutoEnable=false in /etc/bluetooth/main.conf in the [Policy] section:

Contents of /etc/bluetooth/main.conf

[Policy] ... AutoEnable=false ...

Battery Reporting

An experimental feature can be enabled in order to report device battery level:

Contents of /etc/bluetooth/main.conf

[General] ... Experimental=true ...

Troubleshooting

Due to the variety of available Bluetooth hardware it is possible that you receive errors while attempting to install, activate, or find your Bluetooth device.

"No default controller available" error

After having followed these instructions, or others, you run bluetoothctl and encounter the following scenario:

[bluetooth]# list
[bluetooth]# show
No default controller available

One possible solution is that you are missing firmware drivers.

Try running the following command to discover the source of the issue:

# dmesg | grep -i bluetooth | grep -i firmware

There are many firmware packages available that could likely solve the this problem (see linux-firmware-*).

Another possible solution is to install hidapi and add load the module:

# apk add hidapi # modprobe uhid

It may also be necessary to create configuration to load the uhid and btusb kernel modules on boot:

cat <<EOF > /etc/modules-load.d/uhid.conf #Load uhid kernel module: uhid EOF

cat <<EOF > /etc/modules-load.d/btusb.conf #Load btusb kernel module: btusb EOF

"org.bluez.Error.NotAvailable br-connection-profile-unavailable"

The error br-connection-profile-unavailable is sometimes produced when trying to connect a Bluetooth HID device but the uhid kernel module is not loaded. HID devices include keyboards and the volume buttons on headphones (which are sometimes presented to the OS as a keyboard), mice, game controllers, alphanumeric displays, etc.

The uhid kernel module is required for USB HID devices with drivers that are implemented in userspace, when userspace HID support is enabled.

Loading uhid with modprobe after encountering this error does not always fix the problem.

Try setting up uhid to load at boot, and then rebooting:

# cat <<EOF > /etc/modules-load.d/uhid.conf #Load uhid kernel module: uhid EOF # reboot

Alternatively, the userspace HID feature can be disabled entirely in favour of kernel HIDP drivers in /etc/bluetooth/input.conf:

UserspaceHID=false

If running pipewire, you may also try installing pipewire-spa-bluez to see if that solves the issue.

Unable to control Bluetooth speaker volume / Bluetooth output is muted (Pulseaudio)

It is possible to automatically switch audio output and volume control to last connected device.

This can solve the problem of controlling the speaker volume when switching between Bluetooth devices.

Append the following lines at the end of the /etc/pulse/default.pa:

Contents of /etc/pulse/default.pa

... ###Automatically switch audio to the most recently connected device (Bluetooth, HDMI, USB) load-module module-switch-on-connect

See Also