Gelöst. Bearbeitet: siehe unten.
Ich glaube, ich habe das Internet lange genug nach diesem Problem durchsucht. Es wurde oft gefragt, aber keine der Lösungen funktioniert für mich. Ich habe auf BlueZ 5 aktualisiert, weil ich die Niedrigenergiekapazitäten irgendwann nutzen möchte. Im Moment kann ich jedoch nicht einmal meine Geräte koppeln lassen. Ich kann keine GUI verwenden, da dies möglicherweise für ein eingebettetes Linux-System gilt. Daher denke ich, dass ich Bluetoothctl auch nicht verwenden kann, da es eine interaktive Sitzung erfordert. (Da kann ich mich irren.) Ich möchte also, dass alles entweder über BASH, C oder Python in dieser Reihenfolge abläuft. Da es automatisiert werden muss, muss das Pairing und die Verbindung vom Bluetooth-Gerät und nicht von der Linux-Box aus initiiert werden. Schließlich müssen alle Geräte das a2dp-Profil verwenden.
Es scheint viele Ansätze zu geben, aber mir ist nicht klar, wo einer endet und der andere beginnt:
Ansatz 1:
a) $ sudo bluetoothd -d -n
#runs bluetoothd im ausführlichen Modus
b) $ hciconfig hci1 up
# schaltet das Gerät ein
$ hciconfig -a
# Siehe Geräteeigenschaften
Type: BR/EDR Bus: USB
BD Address: 00:02:72:C5:D8:E0 ACL MTU: 1021:8 SCO MTU: 64:1
UP RUNNING PSCAN ISCAN
RX bytes:32875 acl:761 sco:0 events:1037 errors:0
TX bytes:20178 acl:780 sco:0 commands:329 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: 'Adapter-1'
Class: 0x00010c
Service Classes: Unspecified
Device Class: Computer, Laptop
HCI Version: 4.0 (0x6) Revision: 0x1000
LMP Version: 4.0 (0x6) Subversion: 0x220e
Manufacturer: Broadcom Corporation (15)
c) Versuchen Sie, eine Verbindung zum Gerät herzustellen.
Ergebnis: von Bluetoothd:
bluetoothd[5359]: src/adapter.c:connected_callback() hci1 device 70:72:3C:62:49:7F connected eir_len 15
bluetoothd[5359]: src/adapter.c:user_confirm_request_callback() hci1 70:72:3C:62:49:7F confirm_hint 1
bluetoothd[5359]: src/device.c:new_auth() Requesting agent authentication for 70:72:3C:62:49:7F
** bluetoothd[5359]: No agent available for request type 2
** bluetoothd[5359]: device_confirm_passkey: Operation not permitted
bluetoothd[5359]: src/adapter.c:btd_adapter_confirm_reply() hci1 addr 70:72:3C:62:49:7F success 0
bluetoothd[5359]: src/adapter.c:bonding_attempt_complete() hci1 bdaddr 70:72:3C:62:49:7F type 0 status 0x5
bluetoothd[5359]: src/device.c:device_bonding_complete() bonding (nil) status 0x05
bluetoothd[5359]: src/device.c:device_bonding_failed() status 5
bluetoothd[5359]: src/adapter.c:resume_discovery()
bluetoothd[5359]: src/adapter.c:dev_disconnected() Device 70:72:3C:62:49:7F disconnected, reason 3
bluetoothd[5359]: src/adapter.c:adapter_remove_connection()
bluetoothd[5359]: src/adapter.c:bonding_attempt_complete() hci1 bdaddr 70:72:3C:62:49:7F type 0 status 0xe
bluetoothd[5359]: src/device.c:device_bonding_complete() bonding (nil) status 0x0e
bluetoothd[5359]: src/device.c:device_bonding_failed() status 14
bluetoothd[5359]: src/adapter.c:resume_discovery()
Gerät sagt, dass aufgrund einer falschen PIN oder eines falschen Passkeys kein Pairing mit Adapter-1 möglich ist.
Anhand der oben genannten Antworten habe ich untersucht, warum es keinen Agenten gibt. Was ist ein Agent? Wer weiß, aber ich folgerte, dass es der Mittelsmann zwischen meinem Gerät und dem Bluetooth-Daemon war.
d) $ ../bluey-5.15/test/simple-agent
#Ich habe auch versucht, sudo mit diesen Befehlen zu verwenden
oder $ ../bluey-5.15/test/simple-agent hci1
Dies ist ein Python-Skript, das eingehende Pairing-Anforderungen verarbeitet. Bei Erfolg wird auch versucht, zu vertrauen und eine Verbindung herzustellen.
Ausgabe: Agent registered
e) dann versuche ich erneut, vom Gerät zu koppeln.
Ausgabe eines einfachen Agenten:
RequestConfirmation (/org/bluez/hci1/dev_70_72_3C_62_49_7F, 110643)
Confirm passkey (yes/no): yes
Ich drücke auf dem BT-Gerät auf Pair und es heißt Paired, aber Simple-Agent hängt. Ich habe BlueZ 4 verwendet und bin mir ziemlich sicher, dass es so etwas wie "Neues Gerät XX_XX_XX_XX_XX_XX" sagen soll.
Bluetooth-Ausgabe:
** bluetoothd[5359]: src/agent.c:set_default_agent() Default agent set to :1.126 /test/agent
bluetoothd[5359]: src/adapter.c:connected_callback() hci1 device 70:72:3C:62:49:7F connected eir_len 15
bluetoothd[5359]: src/adapter.c:user_confirm_request_callback() hci1 70:72:3C:62:49:7F confirm_hint 0
bluetoothd[5359]: src/device.c:new_auth() Requesting agent authentication for 70:72:3C:62:49:7F
bluetoothd[5359]: src/agent.c:agent_ref() 0xa59290: ref=2
bluetoothd[5359]: src/agent.c:agent_request_confirmation() Calling Agent.RequestConfirmation: name=:1.126, path=/test/agent, passkey=110643
bluetoothd[5359]: src/agent.c:agent_ref() 0xa59290: ref=3
bluetoothd[5359]: src/adapter.c:btd_adapter_confirm_reply() hci1 addr 70:72:3C:62:49:7F success 1
bluetoothd[5359]: src/agent.c:agent_unref() 0xa59290: ref=2
bluetoothd[5359]: src/agent.c:agent_unref() 0xa59290: ref=1
bluetoothd[5359]: src/adapter.c:new_link_key_callback() hci1 new key for 70:72:3C:62:49:7F type 5 pin_len 0
bluetoothd[5359]: src/device.c:device_set_bonded()
bluetoothd[5359]: src/device.c:device_bonding_complete() bonding (nil) status 0x00
bluetoothd[5359]: src/adapter.c:resume_discovery()
bluetoothd[5359]: src/adapter.c:dev_disconnected() Device 70:72:3C:62:49:7F disconnected, reason 3
bluetoothd[5359]: src/adapter.c:adapter_remove_connection()
bluetoothd[5359]: src/adapter.c:bonding_attempt_complete() hci1 bdaddr 70:72:3C:62:49:7F type 0 status 0xe
bluetoothd[5359]: src/device.c:device_bonding_complete() bonding (nil) status 0x0e
bluetoothd[5359]: src/device.c:device_bonding_failed() status 14
bluetoothd[5359]: src/adapter.c:resume_discovery()
Das macht also etwas.
hcidump Ausgabe:
$ hcidump -i hci1
HCI sniffer - Bluetooth packet analyzer ver 5.15
device: hci1 snap_len: 1500 filter: 0xffffffffffffffff
> HCI Event: Connect Request (0x04) plen 10
bdaddr 70:72:3C:62:49:7F class 0x5a020c type ACL
> HCI Event: Command Status (0x0f) plen 4
Accept Connection Request (0x01|0x0009) status 0x00 ncmd 1
> HCI Event: Connect Complete (0x03) plen 11
status 0x00 handle 11 bdaddr 70:72:3C:62:49:7F type ACL encrypt 0x00
> HCI Event: Command Status (0x0f) plen 4
Read Remote Supported Features (0x01|0x001b) status 0x00 ncmd 1
> HCI Event: Read Remote Supported Features (0x0b) plen 11
status 0x00 handle 11
Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87
> HCI Event: Command Status (0x0f) plen 4
Read Remote Extended Features (0x01|0x001c) status 0x00 ncmd 1
> HCI Event: Command Complete (0x0e) plen 10
IO Capability Request Reply (0x01|0x002b) ncmd 1
status 0x00 bdaddr 70:72:3C:62:49:7F
> HCI Event: Read Remote Extended Features (0x23) plen 13
status 0x00 handle 11 page 1 max 1
Features: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
> HCI Event: Command Status (0x0f) plen 4
Remote Name Request (0x01|0x0019) status 0x00 ncmd 1
> HCI Event: Remote Name Req Complete (0x07) plen 255
status 0x00 bdaddr 70:72:3C:62:49:7F name 'Prism II'
> HCI Event: Command Complete (0x0e) plen 10
User Confirmation Request Reply (0x01|0x002c) ncmd 1
status 0x00 bdaddr 70:72:3C:62:49:7F
> HCI Event: Disconn Complete (0x05) plen 4
status 0x00 handle 11 reason 0x13
Reason: Remote User Terminated Connection
Ich habe sogar Bluetoothctl ausprobiert, aber es hat die gleichen Ergebnisse. Das Lustige ist, dass einige Skripte von BlueZ (wie das Testgerät) das BT-Gerät für einige Befehle sehen können, für andere jedoch nicht. Zum Beispiel wird das Testgerät dem Gerät "vertrauen", aber wenn ich versuche, es zu "entfernen", existiert es nicht.
Ansatz 2:
DBUS direkt mit den Befehlen dbus-send --system. Ich glaube nicht, dass einer dieser Befehle mir etwas nützt, bis ich das Gerät koppeln und verbinden kann.
Ansatz 3:
Ich habe alle Vorschläge in diesem Beitrag ausprobiert . In BlueZ 5 gibt es keine /etc/bluetooth/hcid.conf. Muss ich eine erstellen? Der Befehl rfcomm stellt eine Verbindung her, trennt sie jedoch direkt danach.
$ sudo rfcomm connect /dev/rfcomm0 70:72:3C:62:49:7F 1
Connected /dev/rfcomm0 to 70:72:3C:62:49:7F on channel 1
Press CTRL-C for hangup
Disconnected
Bluetooth-Ausgabe:
bluetoothd[5359]: src/adapter.c:connected_callback() hci1 device 70:72:3C:62:49:7F connected eir_len 10
bluetoothd[5359]: src/adapter.c:dev_disconnected() Device 70:72:3C:62:49:7F disconnected, reason 3
bluetoothd[5359]: src/adapter.c:adapter_remove_connection()
bluetoothd[5359]: src/adapter.c:bonding_attempt_complete() hci1 bdaddr 70:72:3C:62:49:7F type 0 status 0xe
bluetoothd[5359]: src/device.c:device_bonding_complete() bonding (nil) status 0x0e
bluetoothd[5359]: src/device.c:device_bonding_failed() status 14
bluetoothd[5359]: src/adapter.c:resume_discovery()
hcidump Ausgabe:
$ hcidump -i hci1
HCI sniffer - Bluetooth packet analyzer ver 5.15
device: hci1 snap_len: 1500 filter: 0xffffffffffffffff
> HCI Event: Command Status (0x0f) plen 4
Create Connection (0x01|0x0005) status 0x00 ncmd 1
> HCI Event: Connect Complete (0x03) plen 11
status 0x00 handle 11 bdaddr 70:72:3C:62:49:7F type ACL encrypt 0x00
> HCI Event: Command Status (0x0f) plen 4
Read Remote Supported Features (0x01|0x001b) status 0x00 ncmd 1
> HCI Event: Read Remote Supported Features (0x0b) plen 11
status 0x00 handle 11
Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87
> HCI Event: Command Status (0x0f) plen 4
Read Remote Extended Features (0x01|0x001c) status 0x00 ncmd 1
> HCI Event: Read Remote Extended Features (0x23) plen 13
status 0x00 handle 11 page 1 max 1
Features: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
> HCI Event: Command Status (0x0f) plen 4
Remote Name Request (0x01|0x0019) status 0x00 ncmd 1
> HCI Event: Remote Name Req Complete (0x07) plen 255
status 0x00 bdaddr 70:72:3C:62:49:7F name 'Prism II'
> HCI Event: Command Status (0x0f) plen 4
Authentication Requested (0x01|0x0011) status 0x00 ncmd 1
> HCI Event: Command Complete (0x0e) plen 10
Link Key Request Reply (0x01|0x000b) ncmd 1
status 0x00 bdaddr 70:72:3C:62:49:7F
> HCI Event: Auth Complete (0x06) plen 3
status 0x00 handle 11
> HCI Event: Command Status (0x0f) plen 4
Set Connection Encryption (0x01|0x0013) status 0x00 ncmd 1
> HCI Event: Encrypt Change (0x08) plen 4
status 0x00 handle 11 encrypt 0x01
> HCI Event: Command Status (0x0f) plen 4
Exit Sniff Mode (0x02|0x0004) status 0x0c ncmd 1
Error: Command Disallowed
> HCI Event: Disconn Complete (0x05) plen 4
status 0x00 handle 11 reason 0x13
Reason: Remote User Terminated Connection
Irgendwelche Vorschläge? Bin ich:
Etwas wirklich Offensichtliches vergessen?
Werkzeuge falsch verwenden?
Vergessen Sie eine Konfigurationsdatei zu setzen?
Bearbeiten:
Da mir der bluez simple-agent keine nützlichen Fehler gab, schrieb ich meinen eigenen Pairing-Agenten. Einmal konnte ich koppeln, aber keine Verbindung herstellen. Bluetooth hat mir diesen neuen Fehler gegeben:
bluetoothd[3078]: profiles/audio/a2dp.c:a2dp_source_connect() path /org/bluez/hci0/dev_70_72_3C_62_49_7F
bluetoothd[3078]: a2dp-source profile connect failed for 70:72:3C:62:49:7F: Protocol not available
In diesem Beitrag wurde darauf hingewiesen, dass mein LOKALER Bluetooth-Adapter möglicherweise das a2dp-Profil meiner Audioquelle nicht unterstützt. (Benimmt sich nicht wie ein Waschbecken) Dann habe ich gesehen, dass viele Leute, die ein Upgrade von BlueZ4 auf BlueZ5 durchgeführt haben, dasselbe Problem hatten. Das Problem wurde auch auf der BlueZ-Mailingliste veröffentlicht .
Bisher habe ich keine Möglichkeit gefunden, dieses Protokoll meinem Adapter hinzuzufügen.
Antworten:
Lösung:
Nachdem ich festgestellt hatte, dass das Profil (a2dp) nicht verbunden war und festgestellt hatte, dass andere das gleiche Problem hatten, prüfte ich, ob dieses Profil noch in BlueZ5 implementiert war. Ich glaube, ich habe die Portierungsanleitung nicht genau genug gelesen, weil sie erklärt, dass a2dp aus dem BlueZ-Stack in GStreamer verschoben wurde. Ich hatte noch nie von GStreamer gehört, aber ich habe in diesem Beitrag auch gesehen, dass PulseAudio und JACK dieses Profil ebenfalls implementieren würden. Ich habe PulseAudio ausprobiert, aber es wurden nicht die richtigen UUIDs für den Adapter geladen. Dann habe ich endlich einen Beitrag im ArchLinux-Wiki gefunden. Ich muss eine Million Mal auf dieser Seite gewesen sein, aber es war wahrscheinlich, als ich noch BlueZ4 benutzte.
Am wichtigsten:
- Laden Sie den neuen PulseAudio 5-Quellcode herunter, der BlueZ5 unterstützt, und kompilieren Sie ihn. (Es ist nicht die neueste Version in den apt-Repositories.)
Das Kompilieren erforderte viele Abhängigkeiten (JSON, libsndfile, libcap usw.)
- Beachten Sie, dass der Pfad für PA5 / usr / local not / usr / lautet (Dies ist wichtig, da ich ihn in $ LD_LIBRARY_PATH einfügen musste, damit PA beim Start libpulsecore-5.0 finden konnte.)
-wie das ArchLinux-Wiki sagt, beenden Sie den beim Start ausgeführten pulseaudio-Server und starten Sie einen neuen. Die Profile werden beim Start nicht geladen. Stellen Sie außerdem sicher, dass der Daemon erneut angezeigt wird. (In /usr/local//etc/pulse/client.conf einstellen)
Danach funktionieren die üblichen Pactl-Befehle. Ich konnte eine a2dp BT-Quelle (dh einen iPod) zum Streamen auf PA5 bringen und dann mit dem Loopback-Modul zu einer a2dp BT-Senke streamen!
Ich konnte es nicht mit ALSA zum Laufen bringen, aber ich habe irgendwo gelesen, dass BlueZ5 möglicherweise keine ALSA-PCM-Plugins mehr unterstützt.
quelle
Der Schlüssel zu dem oben genannten Problem ist der folgende Satz: "Sobald die Erkennung beendet ist, werden Geräte, die weder verbunden noch gekoppelt sind, innerhalb von drei Minuten automatisch per Bluetooth entfernt."
Bitte lesen Sie den Abschnitt zur Geräteerkennung unter http://www.bluez.org/bluez-5-api-introduction-and-porting-guide/.
Ich hatte ein ähnliches Problem, habe es aber gepaart und verbunden. Um ein Gerät zu koppeln und anzuschließen, muss es innerhalb der letzten 3 Minuten entdeckt worden sein. Sowohl Simple-Agent als auch Bluetoothctl funktionieren einwandfrei.
quelle