Această pagină poate fi doar citită. Poți vedea sursa, dar nu poți modifica pagina. Consultă administratorul dacă ești de părere că ceva este în neregulă. ====== Bluetooth în Linux ====== Bluetooth-ul în Linux este gestionat prin stiva [[https://www.bluez.org/|BlueZ]], care include serviciul de sistem ''bluetooth'', utilitarul în linie de comandă ''bluetoothctl'' și suportul la nivel de kernel prin modulele ''bluetooth'' și ''btusb''. Articolul de față urmează structura Arch Wiki și adaptează informația pentru toate distribuțiile principale. ===== Instalare ===== ==== BlueZ și modulul kernel ==== Driverul generic de Bluetooth este modulul kernel ''btusb''. Verifică dacă este încărcat: <code bash> lsmod | grep btusb </code> Dacă nu apare, încarc-ă manual: <code bash> sudo modprobe btusb </code> Instalează pachetele de bază. ''bluez'' furnizează stiva de protocol, ''bluez-utils'' furnizează ''bluetoothctl'': <tab-group> <tab title="Debian/Ubuntu/Mint"> <code bash> sudo apt install bluez bluez-tools </code> </tab> <tab title="Arch"> <code bash> sudo pacman -S bluez bluez-utils </code> </tab> <tab title="Fedora"> <code bash> sudo dnf install bluez bluez-tools </code> </tab> <tab title="openSUSE"> <code bash> sudo zypper install bluez bluez-tools </code> </tab> <tab title="Gentoo"> <code bash> sudo emerge --ask net-wireless/bluez </code> </tab> <tab title="Alpine"> <code bash> sudo apk add bluez bluez-deprecated </code> </tab> <tab title="Void"> <code bash> sudo xbps-install -S bluez </code> </tab> </tab-group> Pe **Gentoo**, activează mai întâi suportul Bluetooth global prin USE flag dacă nu l-ai activat deja, apoi actualizează sistemul: <code bash> # În /etc/portage/make.conf: USE="bluetooth" sudo emerge --ask --changed-use --deep @world </code> Pornește și activează serviciul: **systemd** (Debian, Ubuntu, Mint, Arch, Fedora, openSUSE): <code bash> sudo systemctl enable --now bluetooth </code> **OpenRC** (Gentoo cu OpenRC, Alpine cu OpenRC): <code bash> sudo rc-update add bluetooth default sudo rc-service bluetooth start </code> **runit** (Void Linux): <code bash> sudo ln -s /etc/sv/bluetoothd /var/service/ </code> > **Notă:** Câteva situații speciale de reținut: > * Unele adaptoare Bluetooth sunt integrate cu placa Wi-Fi (ex. Intel Centrino mai vechi). Pe acestea, Wi-Fi-ul trebuie activat primul (de obicei printr-o combinație de taste pe laptop) pentru ca kernelul să vadă adaptorul Bluetooth. > * Unele plăci Broadcom intră în conflict cu adaptorul de rețea - asigură-te că dispozitivul Bluetooth se conectează înaintea serviciului de rețea la boot. > * ''bluetooth.service'' necesită existența directorului ''/sys/class/bluetooth'', creat de modulul kernel ''bluetooth''. Dacă directorul nu există, verifică dacă modulul este încărcat: ''lsmod | grep bluetooth''. ==== Unelte depreciate BlueZ ==== Opt unelte BlueZ au fost depreciate și eliminate din ''bluez-utils'': ''hcitool'', ''hciconfig'', ''hcidump'', ''rfcomm'', ''ciptool'', ''sdptool'', ''gatttool'', ''hciattach''. Nu primesc actualizări și pot eșua silențios pe hardware modern. Înlocuitorul primar este ''bluetoothctl'', completat de ''btmgmt'' și ''btmon''. Tabel cu înlocuitorii recomandați: | Unealtă depreciată | Înlocuitor recomandat | | ''gatttool'' | ''btgatt-client'', D-Bus Gatt API | | ''hciattach'' | ''btattach'' | | ''hciconfig'' | ''btmgmt'' (și ''bluetoothctl'') | | ''hcidump'' | ''btmon'' (și ''btsnoop'') | | ''hcitool'' | lipsă; D-Bus Device API disponibil | | ''rfcomm'' | lipsă; implementează cu D-Bus Profile/ProfileManager API | | ''sdptool'' | lipsă; funcționalitate dispersată în D-Bus | Dacă ai nevoie totuși de ele (urmezi un tutorial mai vechi, ai un caz specific): <tab-group> <tab title="Debian/Ubuntu/Mint"> <code bash> sudo apt install bluez-hcidump </code> </tab> <tab title="Arch"> <code bash> sudo pacman -S bluez-deprecated-tools </code> </tab> <tab title="Fedora"> <code bash> sudo dnf install bluez-deprecated-tools </code> </tab> <tab title="openSUSE"> <code bash> sudo zypper install bluez-deprecated-tools </code> </tab> <tab title="Gentoo"> <code bash> # Activează USE flag: deprecated sudo emerge --ask net-wireless/bluez </code> </tab> </tab-group> ==== Transfer de fișiere (OBEX) ==== Începând din 2024, ''bluez-obex'' și ''bluez-mesh'' sunt separate de ''bluez''. Dacă vrei să trimiți sau să primești fișiere prin Bluetooth, trebuie instalat separat și serviciul de utilizator ''obex.service'' activat: <tab-group> <tab title="Debian/Ubuntu/Mint"> <code bash> sudo apt install bluez-obexd systemctl --user enable --now obex.service </code> </tab> <tab title="Arch"> <code bash> sudo pacman -S bluez-obex systemctl --user enable --now obex.service </code> </tab> <tab title="Fedora"> <code bash> sudo dnf install bluez-obexd systemctl --user enable --now obex.service </code> </tab> <tab title="openSUSE"> <code bash> sudo zypper install bluez-obexd systemctl --user enable --now obex.service </code> </tab> <tab title="Gentoo"> <code bash> # Activează USE flag: obex sudo emerge --ask net-wireless/bluez </code> </tab> </tab-group> ==== Interfețe grafice ==== * **[[https://wiki.gnome.org/Projects/GnomeBluetooth|GNOME Bluetooth]]** - integrat în GNOME; ''gnome-bluetooth-3.0'' furnizează backend-ul, ''gnome-shell'' furnizează applet-ul, ''gnome-control-center'' furnizează panoul grafic. Poți lansa direct ''bluetooth-sendto'' pentru a trimite fișiere. Primirea de fișiere funcționează numai cât timp panoul Bluetooth este deschis. * **[[https://invent.kde.org/plasma/bluedevil|BlueDevil]]** - unealta KDE Plasma; dacă nu apare iconița în system tray, activeaz-o din opțiunile tray-ului sau adaugă un widget. * **[[https://github.com/linuxmint/blueberry|Blueberry]]** - spin-off Linux Mint al GNOME Bluetooth, funcționează în orice mediu desktop. Nu suportă primirea fișierelor prin Obex Object Push. * **[[https://github.com/blueman-project/blueman|Blueman]]** - manager complet, independent de desktop. Recomandat pentru XFCE, LXDE, Openbox, i3, Sway etc. * **[[https://github.com/darkhz/bluetuith|bluetuith]]** - manager TUI cu suport OBEX și mouse. * **[[https://github.com/pythops/bluetui|bluetui]]** - manager TUI simplu. * **[[https://github.com/kaii-lb/overskride|Overskride]]** - client Bluetooth simplu și performant. * **[[https://github.com/Relz/bluetooth-manager-sidebar|Bluetooth Manager Sidebar]]** - manager GTK4/libadwaita pentru sesiuni Wayland, se deschide ca sidebar. * **[[https://github.com/emericg/toolBLEx|toolBLEx]]** - scanner și analizor pentru dispozitive BLE și Bluetooth clasic. <tab-group> <tab title="Debian/Ubuntu/Mint"> <code bash> sudo apt install blueman </code> </tab> <tab title="Arch"> <code bash> sudo pacman -S blueman # sau pentru KDE: sudo pacman -S bluedevil </code> </tab> <tab title="Fedora"> <code bash> sudo dnf install blueman </code> </tab> <tab title="openSUSE"> <code bash> sudo zypper install blueman </code> </tab> <tab title="Gentoo"> <code bash> sudo emerge --ask net-wireless/blueman </code> </tab> <tab title="Alpine"> <code bash> sudo apk add blueman </code> </tab> <tab title="Void"> <code bash> sudo xbps-install -S blueman </code> </tab> </tab-group> ===== Asocierea dispozitivelor ===== > **Notă:** Înainte de a folosi un dispozitiv Bluetooth, asigură-te că nu este blocat de rfkill: ''rfkill list bluetooth''. Dacă apare ''Soft blocked: yes'', rulează ''sudo rfkill unblock bluetooth''. Această secțiune descrie configurarea directă a BlueZ prin ''bluetoothctl''. Dacă folosești o interfață grafică (GNOME Bluetooth, Blueman etc.), pașii următori nu sunt necesari. Procedura exactă depinde de dispozitivele implicate și de capacitățile lor de intrare. Mai jos este conturul general al asocierii unui dispozitiv cu ''bluetoothctl''. Pornești sesiunea interactivă și tastezi ''help'' pentru lista de comenzi disponibile: <code bash> bluetoothctl </code> Pașii în cadrul promptului ''[bluetooth]#'': - (opțional) Selectează un controller implicit cu ''select MAC_address'' - (opțional) Pornește controllerul cu ''power on'' dacă este oprit - vezi [[#Starea implicită a adaptorului]] - ''devices'' pentru a vedea adresele MAC ale dispozitivelor cunoscute deja - ''scan on'' dacă dispozitivul nu este încă în listă - ''agent on'' sau alege un agent specific (apasă Tab de două ori după ''agent'' pentru lista agenților disponibili); agentul gestionează codul de asociere Bluetooth - ''pair MAC_address'' pentru asociere (Tab completează adresa) - ''trust MAC_address'' dacă dispozitivul nu are PIN, pentru a-i permite reconectarea automată - ''connect MAC_address'' pentru a stabili conexiunea O sesiune completă de exemplu: <code> $ bluetoothctl [NEW] Controller 00:10:20:30:40:50 hostname [default] [bluetooth]# agent KeyboardOnly Agent registered [bluetooth]# default-agent Default agent request successful [bluetooth]# power on Changing power on succeeded [CHG] Controller 00:10:20:30:40:50 Powered: yes [bluetooth]# scan on Discovery started [CHG] Controller 00:10:20:30:40:50 Discovering: yes [NEW] Device 00:12:34:56:78:90 device name [CHG] Device 00:12:34:56:78:90 LegacyPairing: yes [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 Attempting to connect to 00:12:34:56:78:90 [CHG] Device 00:12:34:56:78:90 Connected: yes Connection successful </code> > **Sfat:** Pentru a automatiza comenzi ''bluetoothctl'', folosești ''echo -e "command1\ncommand2\n" | bluetoothctl'' sau ''bluetoothctl -- command''. ===== Salvarea configurației ===== Toată configurația BlueZ - dispozitivele asociate, cheile de pairing, setările trust - se află în ''/var/lib/bluetooth/''. Structura directorului: <code> /var/lib/bluetooth/ └── AA:BB:CC:DD:EE:FF/ ← MAC-ul adaptorului tău Bluetooth ├── settings ← setările controlerului ├── cache/ ← cache cu dispozitivele descoperite └── XX:XX:XX:XX:XX:XX/ ← câte un director per dispozitiv asociat └── info ← cheile și metadata dispozitivului </code> Backup și restaurare completă: <code bash> # Backup sudo cp -r /var/lib/bluetooth/ ~/bluetooth-backup-$(date +%Y%m%d)/ # Restaurare (după reinstalare, pe alt sistem cu același adaptor) sudo cp -r ~/bluetooth-backup-20250101/ /var/lib/bluetooth/ sudo systemctl restart bluetooth </code> Dispozitivele asociate anterior se vor reconecta automat fără re-pairing. ===== Dual boot pairing (Linux + Windows/macOS) ===== Pe sisteme cu dual boot Linux+Linux, copierea sau symlinking-ul întregului director ''/var/lib/bluetooth/MAC_ADAPTOR/'' face toate dispozitivele să funcționeze pe ambele instalări fără re-pairing. Pe sisteme cu Windows sau macOS, problema este că fiecare sistem de operare generează propria cheie de asociere și o suprascrie pe cea de pe dispozitiv. Soluția este sincronizarea cheilor. > **Notă:** Unele dispozitive, precum Logitech MX Master și Logitech 604 Lightspeed, incrementează un octet al adresei MAC (de obicei ultimul) la fiecare nouă asociere. Verifică dacă dispozitivul tău face asta pentru a ține cont la final. ==== Procedura generală ==== - Asociezi dispozitivul în Linux (se creează fișierele în ''/var/lib/bluetooth/'') - Repornești în Windows/macOS și asociezi același dispozitiv - Oprești dispozitivul Bluetooth pentru a preveni tentative de conexiune automată - Extragi cheile generate de Windows/macOS - Repornești în Linux și aplici cheile - Repornești ''bluetooth.service'' ==== Extragerea cheilor din Windows ==== Cheia de pairing poate fi extrasă fie din Windows, fie direct din Linux (fără a porni Windows). **Extragere din Windows cu PsExec:** Cheia din registru este accesibilă numai prin contul SYSTEM, deci ai nevoie de ''PsExec'' din [[https://learn.microsoft.com/en-us/sysinternals/downloads/psexec|Microsoft Sysinternals]]. Dintr-un terminal de administrator: <code> .\PsExec64.exe -s -i regedit.exe </code> Navighezi în registry la: <code> HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys </code> Există câte un subkey per adaptor Bluetooth (după adresa MAC). În subkey-ul adaptorului găsești perechi nume-valoare pentru fiecare dispozitiv asociat. Dacă dispozitivul are și propriul subkey (cu valori de tipul LTK, IRK etc.), este un dispozitiv Bluetooth 5.1. Dacă are numai o pereche nume-valoare simplă, este un dispozitiv clasic. Exportezi subkey-ul adaptorului ca fișier ''.reg'' și îl muți în Linux. **Extragere din Linux cu chntpw:** <tab-group> <tab title="Debian/Ubuntu/Mint"> <code bash> sudo apt install chntpw </code> </tab> <tab title="Arch"> <code bash> sudo pacman -S chntpw </code> </tab> <tab title="Fedora"> <code bash> sudo dnf install chntpw </code> </tab> <tab title="openSUSE"> <code bash> sudo zypper install chntpw </code> </tab> </tab-group> > **Notă:** Dacă partiția Windows este criptată cu BitLocker, nu poți accesa registrul din Linux cu ''chntpw''. Montezi partiția Windows, navighezi la registry hive și pornești ''chntpw'': <code bash> cd /path/to/windows/Windows/System32/config chntpw -e SYSTEM </code> În consola ''chntpw'': <code> > cd CurrentControlSet\Services\BTHPORT\Parameters\Keys # (sau ControlSet001 în loc de CurrentControlSet - verifică cu ls) > ls > cd MAC_adaptor > ls > cd MAC_dispozitiv > ls </code> Dacă dispozitivul **nu** este Bluetooth 5.1, vei vedea o singură valoare. Afișezi hexdump-ul cheii: <code> > hex ab12cd34ef56 :00000 XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX </code> Dacă dispozitivul **este** Bluetooth 5.1, vei vedea mai multe valori: ''LTK'', ''KeyLength'', ''ERand'', ''EDIV'', ''IRK'', ''Address'' etc. Afișezi cu ''hex VALOARE'' fiecare în parte. ==== Extragerea cheilor din macOS ==== **macOS Monterey sau mai nou:** Deschizi Keychain Access (pe Tahoe și mai nou: Passwords), cauți ''Bluetooth'', sortezi după dată. Deschizi intrarea, dai click pe "Show password", copiezi conținutul XML și îl salvezi în ''~/bt_keys.txt''. **High Sierra sau mai nou:** <code bash> sudo defaults read /private/var/root/Library/Preferences/com.apple.bluetoothd.plist LinkKeys > ~/bt_keys.txt </code> **Sierra sau mai vechi:** <code bash> sudo defaults read /private/var/root/Library/Preferences/blued.plist LinkKeys > ~/bt_keys.txt </code> > **Notă:** Pe versiunile mai vechi de macOS (High Sierra și anterioare), cheile sunt stocate în format inversat și trebuie inversate înainte de aplicare. Exemplu: ''98 54 2f aa bb cc dd ee ff gg hh ii jj kk ll mm'' devine ''MM LL KK JJ GG FF EE DD CC BB AA 2F 54 98''. Inversare cu Python: ''key = "98 54 2f..."; " ".join(reversed(key.split()))'' ==== Aplicarea cheilor în Linux ==== Devii root și navighezi la directorul adaptorului: <code bash> sudo -i cd /var/lib/bluetooth/MAC_ADAPTOR/MAC_DISPOZITIV </code> > **Notă:** Dacă dispozitivul incrementează adresa MAC la fiecare asociere (Logitech MX Master etc.), mută directorul la noua adresă: ''mv MAC_VECHI MAC_NOU''. Copiezi adresa din Windows sau o incrementezi manual - fiecare octet este un număr hexazecimal de două cifre. **Dispozitive clasice (Bluetooth ≤ 4.0, fără subkey 5.1):** Editezi fișierul ''info'' și modifici valoarea ''Key'' din secțiunea ''[LinkKey]''. Toate literele trebuie să fie majuscule, fără spații: <code ini> [LinkKey] Key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX </code> **Dispozitive Bluetooth 5.1:** Transformările necesare diferă în funcție de dispozitiv. Mai jos sunt regulile generale și cele pentru cele mai comune dispozitive. Utilitare Python pentru conversii: <code python> # Eliminare spații "key_value".replace(" ", "") # Inversare octeți ERand = " 63 02 84 B8 5D 40 44 DF " ERand = list(reversed(ERand.strip().split())) # Conversie la decimal (după inversare) int("".join(ERand), 16) # => 16088054540146049635 # Conversie base64 → hex (macOS) import base64, binascii binascii.hexlify(base64.decodebytes(b'...')).upper() # Conversie macOS Encrypted Diversifier import struct, base64 struct.unpack('<H', base64.decodebytes(b'...')) # Conversie macOS Random Number struct.unpack('<Q', base64.decodebytes(b'...')) </code> Exemplu general: un LTK ''48 4D AF CD 0F 92 22 88 0A 52 9A F4 76 DA 8B 94'' devine ''Key=484DAFCD0F9222880A529AF476DA8B94''; un ERand ''63 02 84 B8 5D 40 44 DF'' devine ''Rand=16088054540146049635''; un EDIV ''37520'' devine ''EDiv=37520''. Tabel cu transformările per categorie de dispozitiv: ^ Dispozitiv ^ Cheie Windows ^ Fișier destinație ^ | Logitech MX Anywhere 3S, MX Master 3/3S, MX Keys, MX Keys Mini, MX Mechanical, Xbox One S Wireless | IRK: elimini spațiile | ''IdentityResolvingKey.Key'' | | (același grup) | LTK: elimini spațiile | ''SlaveLongTermKey.Key'' și ''PeripheralLongTermKey.Key'' | | Logitech MX Anywhere 2S, ELECOM Bitra | IRK: elimini spațiile | ''IdentityResolvingKey.Key'' | | (același grup) | CSRK: elimini spațiile | ''LocalSignatureKey.Key'' | | (același grup) | LTK: elimini spațiile | ''LongTermKey.Key'' | | (același grup) | KeyLength: decimal | ''LongTermKey.EncSize'' | | (același grup) | EDIV: decimal | ''LongTermKey.EDiv'' | | (același grup) | ERand: inversezi octeții, convertești la decimal | ''LongTermKey.Rand'' | | ThinkPad TrackPoint Keyboard II, Pebble M350, Logitech G604 | IRK: inversezi octeții | ''IdentityResolvingKey.Key'' | | (același grup) | LTK: elimini spațiile | ''LongTermKey.Key'' | | (același grup) | ERand: inversezi octeții, convertești la decimal | ''LongTermKey.Rand'' | | (același grup) | EDIV: inversezi octeții, convertești la decimal | ''LongTermKey.EDiv'' | | Alte dispozitive | LTK: elimini spațiile | ''LongTermKey.Key'' | | Xbox wireless controller | LTK: elimini spațiile | ''SlaveLongTermKey.Key'' | Exemplu pentru un controller Xbox One S (fișierul ''info'' după modificare): <code ini> [IdentityResolvingKey] Key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX [PeripheralLongTermKey] Key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX [SlaveLongTermKey] Key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX </code> Repornești serviciul bluetooth (și PulseAudio dacă îl folosești): <code bash> sudo systemctl restart bluetooth # dacă folosești PulseAudio: pulseaudio -k && pulseaudio --start </code> > **Notă:** În funcție de managerul Bluetooth folosit, poate fi necesară repornirea completă a sistemului pentru reconectare. ==== Unelte automate pentru dual boot ==== * [[https://github.com/x2es/bt-dualboot|bt-dualboot]] - automatizează sincronizarea cheilor Linux↔Windows; **nu** suportă Bluetooth Low Energy * [[https://github.com/x2es/bt-dualboot|bluetooth-dualboot script]] - proces semi-automat, nu modifică fișiere direct, dar ajută la formatarea valorilor ===== Configurare ===== ==== Starea implicită a adaptorului ==== Începând cu BlueZ 5.65, comportamentul implicit este pornirea automată a tuturor adaptoarelor la pornirea serviciului sau la revenirea din suspend. Dacă vrei să dezactivezi (ex. pentru a economisi baterie pe laptop), editează ''/etc/bluetooth/main.conf'': <code ini> [Policy] AutoEnable=false </code> Adaptorul poate fi pornit manual oricând cu ''power on'' din ''bluetoothctl''. ==== Vizibilitate permanentă ==== Dacă dispozitivul trebuie să fie mereu vizibil și direct conectabil: <code ini> [General] DiscoverableTimeout = 0 </code> ==== Trezirea sistemului din suspend ==== Pentru a permite tastaturii, mouse-ului sau altor dispozitive Bluetooth să trezească sistemul din suspend, verifică mai întâi că ''Wake from USB'' este activat în BIOS/UEFI (în multe cazuri, Bluetooth-ul de pe placă este un dispozitiv USB intern). Adaugă o regulă udev pentru adaptoare Bluetooth USB (Wireless Controller Base Class, Bluetooth Programming Interface): <code bash> sudo tee /etc/udev/rules.d/91-bluetooth-wakeup.rules << 'EOF' ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", \ ATTR{bDeviceClass}=="e0", \ ATTR{bDeviceProtocol}=="01", \ ATTR{bDeviceSubClass}=="01", \ ATTR{power/wakeup}="enabled" EOF sudo udevadm control --reload-rules </code> ==== Transport implicit (BR/EDR vs LE) ==== Implicit, BlueZ folosește modul dual (''ControllerMode=dual'') - atât Bluetooth clasic (BR/EDR) cât și Low Energy (LE). Dacă vrei să forțezi protocolul clasic (ex. pentru a simplifica dual boot pairing cu un dispozitiv Bluetooth 3.0): <code ini> [General] ControllerMode=bredr </code> ==== Funcții experimentale ==== BlueZ ține funcțiile noi în spatele unor opțiuni experimentale. Printre cele disponibile astfel: raportarea nivelului de baterie pentru căști mai vechi. Activează în ''/etc/bluetooth/main.conf'': <code ini> [General] # Activează interfețele D-Bus experimentale Experimental = true # Activează funcțiile kernel experimentale KernelExperimental = true </code> Alternativ, prin fișier drop-in systemd: <code bash> sudo mkdir -p /etc/systemd/system/bluetooth.service.d/ sudo tee /etc/systemd/system/bluetooth.service.d/override.conf << 'EOF' [Service] ExecStart= ExecStart=/usr/lib/bluetooth/bluetoothd --experimental EOF sudo systemctl daemon-reload sudo systemctl restart bluetooth </code> > **Notă:** Modul experimental poate împiedica unele căști (ex. Sony WH-1000XM3) să se conecteze automat. ''bluez-mesh'' trebuie activat separat dacă îl folosești. ===== Audio Bluetooth ===== Audio Bluetooth necesită un pas suplimentar față de instalarea BlueZ de bază - integrarea cu serverul de sunet. Vezi și [[bluetooth_headset|pagina dedicată căștilor Bluetooth]] pentru mai multe detalii. ==== Profiluri audio ==== | Profil | Descriere | Calitate | Microfon | | **A2DP** | Redare stereo de calitate înaltă | Înaltă (SBC, SBC-XQ, AAC, LDAC, AptX, AptX HD) | Nu | | **HSP** | Headset Profile clasic, mono | Scăzută | Da | | **HFP** | Hands-Free Profile | Scăzută/medie (mSBC) | Da | | **LE Audio / BAP** | Standard nou, LC3 codec | Înaltă | Da | Kernelul, BlueZ 5 și PipeWire suportă toate trei profilele principale. PulseAudio și ALSA suportă numai A2DP și HFP/HSP. LE Audio (LC3) este experimental în BlueZ și dezactivat implicit (din feb. 2025). ==== PipeWire (recomandat) ==== PipeWire, începând cu v0.3.19, activează suportul Bluetooth implicit. Oferă suport A2DP cu SBC/SBC-XQ, AptX, LDAC, AAC și HFP/HSP out-of-the-box. <tab-group> <tab title="Debian/Ubuntu/Mint"> <code bash> sudo apt install pipewire pipewire-pulse libspa-0.2-bluetooth wireplumber systemctl --user enable --now pipewire pipewire-pulse wireplumber </code> </tab> <tab title="Arch"> <code bash> sudo pacman -S pipewire pipewire-pulse wireplumber # Se pornesc automat ca servicii de utilizator </code> </tab> <tab title="Fedora"> <code bash> # Inclus implicit, adaugă: sudo dnf install pipewire-pulseaudio wireplumber </code> </tab> <tab title="openSUSE"> <code bash> sudo zypper install pipewire pipewire-pulseaudio wireplumber </code> </tab> <tab title="Gentoo"> <code bash> sudo emerge --ask media-video/pipewire media-video/wireplumber </code> </tab> <tab title="Alpine"> <code bash> sudo apk add pipewire pipewire-pulse wireplumber </code> </tab> <tab title="Void"> <code bash> sudo xbps-install -S pipewire wireplumber </code> </tab> </tab-group> ==== PulseAudio ==== Dacă folosești PulseAudio în loc de PipeWire, instalează modulul Bluetooth și repornește daemonul: <tab-group> <tab title="Debian/Ubuntu/Mint"> <code bash> sudo apt install pulseaudio pulseaudio-module-bluetooth pulseaudio -k </code> </tab> <tab title="Arch"> <code bash> sudo pacman -S pulseaudio pulseaudio-bluetooth pulseaudio -k </code> </tab> <tab title="Fedora"> <code bash> sudo dnf install pulseaudio pulseaudio-module-bluetooth pulseaudio -k </code> </tab> </tab-group> Dacă folosești PulseAudio la nivel de sistem (''system-wide''), asigură-te că utilizatorul care rulează daemonul (de obicei ''pulse'') este în grupul ''lp'' și că modulele Bluetooth sunt încărcate în ''/etc/pulse/system.pa'': <code> load-module module-bluetooth-policy load-module module-bluetooth-discover </code> Adaugă opțional ''load-module module-switch-on-connect'' dacă vrei comutare automată pe dispozitivul Bluetooth la conectare. ==== ALSA (fără PulseAudio/PipeWire) ==== BlueZ 5 nu mai are integrare directă cu ALSA. Dacă nu poți sau nu vrei să folosești PulseAudio/PipeWire, instalează ''bluez-alsa'' (''bluez-alsa-git'' din AUR pe Arch), pornește serviciul ''bluealsa'' și adaugă utilizatorul în grupul ''audio''. Testezi cu: <code bash> aplay -D bluealsa:SRV=org.bluealsa,DEV=XX:XX:XX:XX:XX:XX,PROFILE=a2dp FILE.wav </code> Și adaugi în ''~/.asoundrc'': <code> defaults.bluealsa { service "org.bluealsa" device "XX:XX:XX:XX:XX:XX" profile "a2dp" } </code> ==== Bluetooth serial (module HC-05, HC-06) ==== Pentru comunicare serială Bluetooth cu module HC-05, HC-06: Asociezi dispozitivul cu ''bluetoothctl'' ca de obicei, instalezi ''bluez-deprecated-tools'' pentru ''rfcomm'', apoi legi adresa MAC la un terminal tty: <code bash> sudo rfcomm bind rfcomm0 MAC_address_of_Bluetooth_device </code> Acum poți deschide ''/dev/rfcomm0'' pentru comunicare serială: <code bash> picocom /dev/rfcomm0 -b 115200 </code> ===== Probleme frecvente ===== ==== Diagnosticare generală ==== Oprești serviciul și îl pornești manual cu debug: <code bash> sudo systemctl stop bluetooth sudo /usr/lib/bluetooth/bluetoothd -n -d </code> Sau folosești ''btmon'' pentru a urmări activitatea HCI în timp real: <code bash> sudo btmon </code> ==== systemd: serviciul bluetooth este sărit la boot ==== ''bluetooth.service'' necesită directorul ''/sys/class/bluetooth'', creat de modulul kernel ''bluetooth''. Acesta este autoîncărcat de ''systemd-udev'' numai dacă detectează hardware Bluetooth real. Dacă directorul nu există: <code bash> lsmod | grep bluetooth sudo modprobe bluetooth btusb sudo systemctl restart bluetooth </code> Modulele posibile în funcție de chipset: ''btusb'', ''btrtl'', ''btintel'', ''btbcm'', ''bnep''. Dacă serviciul a pornit cu succes dar ''bluetoothctl'' returnează ''org.Bluez.Error.NotReady'' la ''scan on'', încearcă un restart complet al sistemului și verifică dacă directoarele și modulele sunt prezente. ==== Bluetooth trezește imediat sistemul din suspend-to-idle ==== Pe sisteme cu suspend-to-idle/S2idle/S0ix/Modern Standby, controllerele Bluetooth rămân active în sleep și trezesc sistemul imediat dacă un dispozitiv este conectat. Soluție - dezactivează Bluetooth înainte de suspend cu un serviciu systemd: <code bash> sudo tee /etc/systemd/system/bluetooth-disable-before-sleep.service << 'EOF' [Unit] Description=Disable Bluetooth before going to sleep Before=sleep.target Before=suspend.target Before=hybrid-sleep.target Before=suspend-then-hibernate.target StopWhenUnneeded=yes [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/bluetoothctl power off ExecStop=/usr/bin/bluetoothctl power on [Install] WantedBy=sleep.target WantedBy=suspend.target WantedBy=hybrid-sleep.target WantedBy=suspend-then-hibernate.target EOF sudo systemctl enable bluetooth-disable-before-sleep.service </code> > **Notă:** Cu acest workaround activ, trezirea sistemului din suspend cu mouse/tastatură Bluetooth nu va funcționa. ==== Bluetooth se oprește la delogare (sistem headless/server) ==== Două cauze posibile: * PulseAudio și PipeWire rulează ca servicii de utilizator și se opresc la terminarea ultimei sesiuni. Activează //lingering// pentru utilizator: ''sudo loginctl enable-linger UTILIZATOR'' * WirePlumber rulează un ''logind-monitor'' care activează Bluetooth la login și îl dezactivează la logout. Vezi [[https://wiki.archlinux.org/title/WirePlumber#Keep_Bluetooth_running_after_logout_/_Headless_Bluetooth|WirePlumber - Keep Bluetooth running after logout]]. ==== hcitool scan: Device not found ==== * Pe unele laptop-uri (ex. Dell Studio 15, Lenovo ThinkPad X1) trebuie comutat modul de la HID la HCI. Instalează ''bluez-hid2hci'' - udev face asta automat. Sau manual: <code bash> sudo /usr/lib/udev/hid2hci </code> * Dacă dispozitivul tot nu apare și ai Windows pe același calculator, pornești Windows și activezi adaptorul Bluetooth de acolo, apoi revii în Linux. * Uneori ajunge pur și simplu: <code bash> bluetoothctl power on </code> ==== bluetoothctl: No default controller available ==== Mai întâi verifici că nu este blocat de ''rfkill''. Dacă folosești ''USBGuard'', verifică că nu blochează controllerul Bluetooth. Alte cauze posibile: * Unele controllere de pe placa de bază au un bug care provoacă această eroare. Verifici în jurnal: ''journalctl | grep hci''. Dacă apare ''command tx timeout'' sau ''Reading Intel version command failed'', oprește complet calculatorul și scoate cablul de alimentare câteva secunde (nu simplu restart) - asta forțează reîncărcarea firmware-ului. * Unele plăci Intel (ex. 8260) nu sunt preluate corect de serviciul Bluetooth. Încearcă cu ''bluez-deprecated-tools'' în loc de ''bluez-utils''. * Power saving poate cauza probleme - adaugă parametrul kernel ''btusb.enable_autosuspend=n'' (sau echivalentul prin modprobe: ''options btusb enable_autosuspend=0'' în ''/etc/modprobe.d/btusb.conf''). * Descărcarea și reîncărcarea modulului fără opțiuni ajută uneori: <code bash> sudo modprobe -r btusb sudo modprobe btusb </code> ==== Adaptor USB Bluetooth nu este recunoscut ==== Verifici recunoașterea la inserare: <code bash> journalctl -f # monitorizezi live la inserare </code> La inserarea unui dongle funcțional, ar trebui să apară: <code> kernel: usb 4-1: new full-speed USB device number 3 using uhci_hcd bluetoothd: HCI dev 0 registered bluetoothd: Listening for HCI events on hci0 bluetoothd: HCI dev 0 up bluetoothd: Adapter /org/bluez/4568/hci0 has been enabled </code> Dacă apar primele linii dar nu și ultimele (adaptorul este detectat dar nu inițializat), trebuie ridicat manual cu ''btmgmt'': <code bash> sudo btmgmt [mgmt]# select hci0 [hci0]# power up </code> Sau cu ''bluetoothctl'': <code bash> bluetoothctl power on </code> Verifici versiunea de Bluetooth a adaptorului (HCI version din ''btmgmt info'' mapează la versiunea Bluetooth conform specificației oficiale; ex. HCI version 6 = Bluetooth 4.0). ==== Audio skip la distanță mică de la dongle ==== Dacă alte dispozitive USB partajează același hub cu adaptorul Bluetooth, pot întrerupe comunicarea cu dispozitivele audio. Asigură-te că adaptorul Bluetooth este singurul dispozitiv pe bus-ul respectiv: <code bash> lsusb </code> > **Notă:** Dongle-ul CSR cu ID ''0a12:0001'' (Cambridge Silicon Radio, Bluetooth Dongle HCI mode) are un regression bug și funcționează numai în kernelul ≥5.17 și <6.0. Vezi [[https://bugzilla.kernel.org/show_bug.cgi?id=60824|Kernel Bug 60824]]. ==== Logitech Bluetooth USB Dongle ==== Dongle-urile Logitech (ex. MX5000) funcționează în două moduri: Embedded (emulează USB HID) și HCI. Pentru HCI, ții apăsat butonul roșu de pe dongle la inserare timp de 3-5 secunde. Alternativ, instalezi ''bluez-hid2hci'' care face comutarea automat prin udev. ==== Foxconn / Hon Hai / Lite-On Broadcom ==== Aceste dispozitive necesită uneori flash de firmware la boot. Pachetul ''broadcom-bt-firmware'' (din AUR pe Arch) furnizează fișierele pentru mai multe plăci. Alternativ, firmware-ul poate fi convertit dintr-un fișier Windows ''.hex'' cu utilitarul ''hex2hcd'' (inclus în ''bluez-utils''): <code bash> # Identifici device-ul lsusb # ex: Bus 002 Device 004: ID 04ca:2006 Lite-On... # Descarci driverul Windows corespunzător și extragi .hex # Conversia: hex2hcd fisier.hex fisier.hcd # Copiezi în locul potrivit (verifici dmesg pentru numele exact) sudo cp fisier.hcd /lib/firmware/brcm/BCM.hcd # Reîncarci modulul sudo modprobe -r btusb && sudo modprobe btusb </code> ==== MediaTek MT7921 sau MT7961 în dual boot cu Windows ==== Dacă versiunile de firmware Bluetooth diferă între Windows și Linux, adaptorul nu funcționează după reboot din Windows. Soluția recomandată este actualizarea driverelor Bluetooth la ultima versiune pe ambele sisteme. Dacă nu poți găsi firmware actualizat pentru Windows, poți copia fișierul din Linux: <code bash> /usr/lib/firmware/mediatek/BT_RAM_CODE_MT7961_1_2_hdr.bin.xz </code> Îl extragi și îl copiezi pe Windows în ''C:\WINDOWS\system32\DRIVERS\''. ==== Adaptorul dispare după suspend/resume ==== Identifici vendor ID și product ID-ul adaptorului: <code bash> lsusb -tv </code> Apoi folosești ''usb_modeswitch'' pentru a-l reseta: <code bash> sudo usb_modeswitch -R -v VENDOR_ID -p PRODUCT_ID </code> ==== Calculatorul nu este vizibil pentru alte dispozitive ==== <code bash> bluetoothctl discoverable on bluetoothctl show # verifici Discoverable: yes </code> Dacă calculatorul tot nu apare, încearcă să schimbi clasa dispozitivului în ''/etc/bluetooth/main.conf'': <code ini> [General] # Class = 0x000100 # implicit: Computer Class = 0x100100 # Object-Transfer Service + Computer </code> > **Notă:** În unele cazuri, ''Class'' din ''main.conf'' este suprascrisă după inițializarea dispozitivului. În acel caz, setează clasa direct: ''hciconfig hci0 class 100100'' (deprecated, dar funcțional). Televizoarele LG (și altele) descoperă dispozitive din categoria audio. Folosind clasa ''000414'' (soundbar) poți face calculatorul vizibil pentru astfel de dispozitive. Generatorul de clase: [[https://bluetooth-pentest.narod.ru/software/bluetooth_class_of_device-service_generator.html|bluetooth class generator]]. ==== Dispozitivul se conectează și se deconectează după câteva secunde ==== Un bug introdus în BlueZ 5.83 (prezent și în 5.86) provoacă o deconectare după o tentativă eronată de autentificare pe dispozitive cu suport multipoint. Workaround temporar: ''sudo systemctl restart bluetooth''. Pe KDE Plasma, oprirea sau dezactivarea ''KDE Connect'' poate rezolva problema. Dacă în jurnal apar: <code> bluetoothd: Unable to get connect data for Headset Voice gateway: getpeername: Transport endpoint is not connected (107) bluetoothd: connect error: Connection refused (111) </code> Cauza este probabil că dispozitivul a fost asociat și cu alt sistem de operare pe același adaptor Bluetooth. Urmează instrucțiunile din [[#Dual boot pairing]]. ==== Dispozitivele LE nu apar în scan ==== Unele dispozitive Bluetooth Low Energy (ex. Logitech MX Master) nu apar la scanarea normală. Folosești scanarea filtrată pe transport LE: <code bash> bluetoothctl [bluetooth]# menu scan [bluetooth]# transport le [bluetooth]# back [bluetooth]# scan on [bluetooth]# devices </code> ==== BLE nu funcționează pe Intel AX200 ==== Scanarea pasivă BLE este defectă pe acest adaptor. Vezi [[https://bugzilla.kernel.org/show_bug.cgi?id=208523|upstream bug report]]. ==== Nu se poate reconecta după sleep ==== Dacă în jurnal apar: <code> bluetoothd[487]: Authentication attempt without agent bluetoothd[487]: Access denied: org.bluez.Error.Rejected </code> Dispozitivul nu este marcat ca trusted. Rulezi ''bluetoothctl trust MAC_ADDRESS''. ==== Mouse Bluetooth lag / disconnect / nu răspunde ==== Poți ajusta parametrii de conexiune direct în fișierul ''info'' al dispozitivului, adăugând sau modificând secțiunea ''[ConnectionParameters]'': <code ini> [ConnectionParameters] MinInterval=6 MaxInterval=9 Latency=44 Timeout=216 </code> Valorile implicite sunt optimizate pentru economie de energie și pot introduce latență. Aceste setări se aplică și unor tastaturi Keychron BLE. Repornești Bluetooth sau faci re-pair după modificare. ==== Audio device nu se conectează: br-connection-profile-unavailable ==== Un dispozitiv audio Bluetooth eșuează la conectare dacă PipeWire este instalat dar nu rulează nicio instanță. Pornești manual serviciul sau redai orice sunet pentru a porni daemonul, apoi reîncerci conectarea: <code bash> systemctl --user start pipewire.service </code> ==== Interferențe între căști și mouse ==== Dacă audio se întrerupe când folosești simultan mouse Bluetooth și căști, poți încerca: <code bash> hciconfig hci0 lm ACCEPT,MASTER hciconfig hci0 lp HOLD,SNIFF,PARK </code> ==== Continual connect/disconnect cu TP-LINK UB400 și Xbox controller ==== Adaugă în ''/etc/bluetooth/main.conf'': <code ini> [General] JustWorksRepairing = always FastConnectable = true Class = 0x000100 [GATT] ReconnectIntervals=1,1,2,3,5,8,13,21,34,55 AutoEnable=true </code> Repornești ''bluetooth.service''. Driver-ul ''xpadneo'' nu este necesar. ==== rfkill unblock: nu deblocheaz pe sisteme cu ConnMan ==== <code bash> connmanctl enable bluetooth </code> ==== Fișiere primite eșuează din cauza symlink-urilor ==== Dacă transferurile primite eșuează și în jurnal apare ''open(...): Operation not permitted'' pe un path cu symlink-uri, adaugă un drop-in pentru ''obex.service'': <code bash> mkdir -p ~/.config/systemd/user/obex.service.d/ tee ~/.config/systemd/user/obex.service.d/10-symlink.conf << 'EOF' [Service] ExecStart= ExecStart=/usr/lib/bluetooth/obexd --symlinks EOF systemctl daemon-reload --user systemctl restart --user obex.service </code> ===== Dezactivarea Bluetooth-ului ===== Dezactivare temporară: <code bash> sudo rfkill block bluetooth </code> Dezactivare permanentă prin udev: <code bash> sudo tee /etc/udev/rules.d/80-disable-bluetooth.rules << 'EOF' SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0" EOF sudo udevadm control --reload-rules </code> Dezactivare prin blacklist modul kernel: <code bash> sudo tee /etc/modprobe.d/blacklist-bluetooth.conf << 'EOF' blacklist bluetooth blacklist btusb blacklist bnep blacklist btrtl blacklist btbcm blacklist btintel EOF </code> ===== Resurse ===== * [[https://wiki.archlinux.org/title/Bluetooth|Arch Wiki - Bluetooth]] * [[https://wiki.archlinux.org/title/Bluetooth_headset|Arch Wiki - Bluetooth headset]] * [[https://wiki.archlinux.org/title/Bluetooth_mouse|Arch Wiki - Bluetooth mouse]] * [[https://wiki.gentoo.org/wiki/Bluetooth|Gentoo Wiki - Bluetooth]] * [[https://linuxmint-user-guide.readthedocs.io/en/latest/bluetooth.html|Linux Mint User Guide - Bluetooth]] * [[https://pipewire.pages.freedesktop.org/wireplumber/daemon/configuration/bluetooth.html|WirePlumber - Bluetooth configuration]] * [[https://gist.github.com/leo-aa88/d082418f4da83b80701a8369f12f5f41|bluetoothctl guide (GitHub Gist)]] {{tag>bluetooth bluez hardware retea depanare audio dual-boot suspend pipewire obex}}