voltar

Como conectar ao Bluetooth pelo terminal

Motivação

Comprei um fone bluetooth! Achei tudo lindo e maravilhoso, rapidinho consegui conectar no celular. Pensei “ok, agora vamos testar no computador” e foi aí que a minha odisseia começou.

Eu não uso uma interface gráfica e sim um gerenciador de janelas, no caso o i3, o que me força a aprender algumas coisas. Eu não fazia ideia de como conectar o áudio do meu computador no bluetooth e, pior ainda, não sabia nem como ligar o bluetooth.

Em primeiro lugar, fui olhar na documentação do LARBS, que são os .dotfiles que eu uso pra configurar o i3 e todo o meu ambiente. Não achei nada lá e tive que usar minhas técnicas hackers (DuckDuckGo).

Bom, o meu sistema operacional é o Arch Linux e a maior vantagem disso é que a Wiki é a documentação mais incrível de todo o mundo e os fóruns também ajudam demais. Dito isso, fui lá procurar pelo Bluetooth. Outro link útil que achei, foi o tutorial (em inglês) de como ligar o fone no Bluetooth.

Como acessei fontes em inglês, cá está meu pequeno tutorial em português de como conectar ao bluetooth pelo terminal.

img


Requisitos

Bom, então pra rodar tudo você precisa em primeiro lugar do bluetoothctl instalado na sua máquina. Por interface gráfica existem várias outras formas, mas esse não é o objetivo dessa postagem.

Após baixar o bluetoothctl, a gente tem que ter certeza de que a componente de bluetooth está desbloqueada. Pra isso, a gente usa o comando rfkill.

[giovana@valefor ~]$ rfkill
ID TYPE      DEVICE         SOFT         HARD
 0 wlan      phy0   desbloqueado desbloqueado
 4 bluetooth hci0   bloqueado desbloqueado

Se o bluetooth aparecer como “bloqueado”, você deve usar o comando sudo rfkill unblock <ID do bluetooth> ou sudo rfkill unblock bluetooth. Rode novamente o rfkill e cheque se tudo aparece como desbloqueado.


Usando o bluetoothctl

Se você digitar no seu terminal bluetoothctl, você vai entrar em um novo consolezinho, cujo usuário agora é “bluetooth”. Para ver todos os comandos que são possíveis de serem utilizados, digite help.

[bluetooth]# help
Menu main:
Available commands:
-------------------
advertise                                         Advertise Options Submenu
scan                                              Scan Options Submenu
gatt                                              Generic Attribute Submenu
list                                              List available controllers
show [ctrl]                                       Controller information
select <ctrl>                                     Select default controller
devices                                           List available devices
paired-devices                                    List paired devices
system-alias <name>                               Set controller alias
reset-alias                                       Reset controller alias
power <on/off>                                    Set controller power
pairable <on/off>                                 Set controller pairable mode
discoverable <on/off>                             Set controller discoverable mode
discoverable-timeout [value]                      Set discoverable timeout
agent <on/off/capability>                         Enable/disable agent with given capability
default-agent                                     Set agent as the default one
advertise <on/off/type>                           Enable/disable advertising with given type
set-alias <alias>                                 Set device alias
scan <on/off>                                     Scan for devices
info [dev]                                        Device information
pair [dev]                                        Pair with device
trust [dev]                                       Trust device
untrust [dev]                                     Untrust device
block [dev]                                       Block device
unblock [dev]                                     Unblock device
remove <dev>                                      Remove device
connect <dev>                                     Connect device
disconnect [dev]                                  Disconnect device
menu <name>                                       Select submenu
version                                           Display version
quit                                              Quit program
exit                                              Quit program
help                                              Display help about this program
export                                            Print environment variables

A primeira coisa que é preciso fazer pro bluetoothctl funcionar é alimentar a plaquinha com energia, ou seja power on.

[bluetooth]# power on
Changing power on succeeded

Após isso, precisamos tornar o nosso dispositivo “descobrível” e pareável.

[bluetooth]# discoverable on
Changing discoverable on succeeded
[CHG] Controller 34:68:95:DF:29:3E Discoverable: yes

[bluetooth]# pairable on
Changing pairable on succeeded
[CHG] Controller 34:68:95:DF:29:3E Pairable: yes

Agora sim podemos procurar por dispositivos:

[bluetooth]# scan on
Discovery started
[CHG] Controller 34:68:95:DF:29:3E Discovering: yes

[bluetooth]# devices
Device 1C:52:16:DA:8E:2D Redmi AirDots_R

[bluetooth]# agent on
Agent is already registered

Tudo que a gente for fazer é usando o endereço MAC do dispositivo encontrado, então talvez você tenha que digitar isso muitas vezes. Provavelmente tem um jeito de usar os alias mas eu não fui tão a fundo pra descobrir isso. Fica aí pro leitor o desafio.

Após encontrar o dispositivo desejado, o Redmi AirDots_R, vamos “confiar” nele

[bluetooth]# trust 1C:52:16:DA:8E:2D
Changing 1C:52:16:DA:8E:2D trust succeeded

Antes de conectar, precisamos matar o daemon do pulseaudio e daí fazer a conexão:

$ pulseaudio -k
[bluetooth]# connect 1C:52:16:DA:8E:2D
Attempting to connect to 1C:52:16:DA:8E:2D
[CHG] Device 1C:52:16:DA:8E:2D Connected: yes
Connection successful
[CHG] Device 1C:52:16:DA:8E:2D ServicesResolved: yes

E pronto! Agora o seu fone deve funcionar. :heart:

A ordem completa dos comandos fica:

[bluetooth]# power on
Changing power on succeeded

[bluetooth]# discoverable on
Changing discoverable on succeeded
[CHG] Controller 34:68:95:DF:29:3E Discoverable: yes

[bluetooth]# pairable on
Changing pairable on succeeded
[CHG] Controller 34:68:95:DF:29:3E Pairable: yes

[bluetooth]# agent on
Agent is already registered

[bluetooth]# devices
Device 1C:52:16:DA:8E:2D Redmi AirDots_R

[bluetooth]# trust 1C:52:16:DA:8E:2D
Changing 1C:52:16:DA:8E:2D trust succeeded
[bluetooth]# exit

$ pulseaudio -k
$ bluetoothctl

[bluetooth]# connect 1C:52:16:DA:8E:2D
Attempting to connect to 1C:52:16:DA:8E:2D
[CHG] Device 1C:52:16:DA:8E:2D Connected: yes
Connection successful
[CHG] Device 1C:52:16:DA:8E:2D ServicesResolved: yes


Problemas

Eu conseguia parear o meu dispositivo ao meu fone, mas eu não conseguia conectar mesmo matando o daemon do pulseaudio. Fui dar uma olhada no meu log e

$ systemctl status bluetooth
● bluetooth.service - Bluetooth service
   Loaded: loaded (/usr/lib/systemd/system/bluetooth.service; enabled; vendor p
   Active: active (running) since Thu 2019-11-21 17:37:55 -03; 5 days ago
     Docs: man:bluetoothd(8)
 Main PID: 440 (bluetoothd)
    Tasks: 1 (limit: 4600)
   Memory: 2.2M
   CGroup: /system.slice/bluetooth.service
           └─440 /usr/lib/bluetooth/bluetoothd

nov 27 16:50:18 valefor bluetoothd[440]: a2dp-sink profile connect failed for
1C:52:16:DA:8E:2D: Protocol not available

Pra resolver isso, tive que instalar o pulseaudio-bluetooth e depois reiniciar o pulseaudio.

Depois disso eu achei que tudo estava bem, mas não estava. Apesar de o log me mostrar que estava conectando ao fone, o som não saia e eu não estava entendendo nada. O que eu fiz foi rodar o bluetoothctl como root e o som funcionou a partir disso. Reiniciei o pulseaudio (pulseaudio -k) e quando conectei de novo tudo funcionou sem usar o root mesmo. :relaxed:

Bom, acho que é isso. Em último caso, não se esqueça de olhar a Wiki na seção de Troubleshooting ou mesmo o seu log por meio de journalctl -u <nomeservico>.service.