Resuelto Editado: ver abajo.
Creo que he buscado en Internet el tiempo suficiente para este problema. Se ha preguntado muchas veces, pero ninguna de las soluciones funciona para mí. Actualicé a BlueZ 5 porque quiero poder usar sus capacidades de baja energía eventualmente. Sin embargo, en este momento, ni siquiera puedo emparejar mis dispositivos. No puedo usar una GUI porque eventualmente será para un sistema Linux integrado. Por lo tanto, creo que tampoco puedo usar bluetoothctl, porque requiere una sesión interactiva. (Puedo estar equivocado en eso). Entonces quiero que todo sea a través de BASH, C o Python, en ese orden. Además, debido a que necesita ser automatizado, el emparejamiento y la conexión deberán iniciarse desde el dispositivo Bluetooth, no desde la caja de Linux. Por último, todos los dispositivos deben usar el perfil a2dp.
Parece que hay muchos enfoques, pero no tengo claro dónde termina uno y dónde comienza el otro:
ENFOQUE 1:
a) $ sudo bluetoothd -d -n
#runs bluetoothd en modo detallado
b) $ hciconfig hci1 up
# enciende el dispositivo
$ hciconfig -a
#ver las propiedades del dispositivo
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) intente emparejar desde el dispositivo.
Resultado: de 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()
El dispositivo dice que no se pudo emparejar con el Adaptador-1 debido a un PIN o contraseña incorrectos
Basado en las respuestas destacadas arriba, analicé por qué no había un agente. ¿Qué es un agente? Quién sabe, pero deduje que era el intermediario entre mi dispositivo y el demonio bluetooth.
d) $ ../bluey-5.15/test/simple-agent
# También intenté usar sudo con estos comandos
o $ ../bluey-5.15/test/simple-agent hci1
Este es un script de Python que maneja las solicitudes de emparejamiento entrantes. Si tiene éxito, también trata de 'confiar' y 'conectarse'
salida: Agent registered
e) luego intento nuevamente emparejar desde el dispositivo.
salida de agente simple:
RequestConfirmation (/org/bluez/hci1/dev_70_72_3C_62_49_7F, 110643)
Confirm passkey (yes/no): yes
Golpeé el par en el dispositivo BT y dice emparejado, pero el agente simple se cuelga. He usado BlueZ 4, y estoy bastante seguro de que se supone que debe decir algo como "Nuevo dispositivo XX_XX_XX_XX_XX_XX"
salida bluetoothd:
** 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()
Entonces esto hace algo.
salida de hcidump:
$ 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
Incluso probé bluetoothctl, pero tiene los mismos resultados. Lo curioso es que algunos scripts de BlueZ (como test-device) pueden ver el dispositivo BT para algunos comandos, pero no para otros. Por ejemplo, test-device 'confiará' en el dispositivo, pero cuando trato de 'eliminarlo', no existe.
ENFOQUE 2:
DBUS directamente usando los comandos del sistema dbus-send. No creo que ninguno de estos comandos me sirva de nada hasta que pueda emparejar y conectar el dispositivo.
ENFOQUE 3:
Intenté todas las sugerencias en esta publicación . No hay /etc/bluetooth/hcid.conf en BlueZ 5. ¿Necesito crear uno? El comando rfcomm se conectará, pero luego se desconectará inmediatamente.
$ 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
salida bluetoothd:
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()
salida de hcidump:
$ 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
¿Alguna sugerencia? Soy yo:
¿Olvidando algo realmente obvio?
¿Usa las herramientas incorrectamente?
¿Olvidaste configurar un archivo de configuración?
Editar:
Como el agente simple bluez no me estaba dando ningún error útil, escribí mi propio agente de emparejamiento. Una vez que lo hice, pude emparejar pero no conectarme. bluetoothd me dio este nuevo error:
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
Esta publicación señaló que tal vez mi adaptador bluetooth LOCAL no era compatible con el perfil a2dp de mi fuente de audio. (No actúa como un sumidero) Luego vi que muchas personas han experimentado el mismo problema al actualizar de BlueZ4 a BlueZ5. El problema también se publicó en la lista de correo de BlueZ .
Hasta ahora, no he encontrado una manera de agregar este protocolo a mi adaptador.
Respuestas:
Solución:
Después de descubrir que el perfil (a2dp) no estaba conectado y ver que otros tenían el mismo problema, investigué si este perfil se implementó en BlueZ5 todavía. Supongo que no leí la guía de portabilidad lo suficiente, porque explica que a2dp se movió de la pila de BlueZ a GStreamer. Nunca había oído hablar de GStreamer, pero también vi en esta publicación que PulseAudio y JACK también implementarían este perfil. Intenté PulseAudio, pero no cargaba los UUID adecuados para el adaptador. Luego, finalmente encontré una publicación en la wiki de ArchLinux. Debo haber estado en esta página un millón de veces, pero probablemente fue cuando todavía estaba usando BlueZ4.
Más importante:
-Descargue el nuevo código fuente de PulseAudio 5, que tiene soporte para BlueZ5, y compílelo. (No es la versión más nueva en los repositorios de apt).
-compilación tomó MUCHAS dependencias (JSON, libsndfile, libcap, etc.)
Tenga en cuenta que la ruta para PA5 es / usr / local not / usr / (Esto es importante, porque tuve que ponerlo en $ LD_LIBRARY_PATH para que PA pudiera encontrar libpulsecore-5.0 al inicio)
-como dice la wiki de ArchLinux, elimine el servidor pulseaudio que se ejecuta al inicio e inicie uno nuevo. No carga los perfiles al inicio. También asegúrate de que el demonio reaparece. (Establecer en /usr/local//etc/pulse/client.conf)
Después de eso, los comandos habituales de pactl funcionan. Pude obtener una fuente BT a2dp (es decir, iPod) para transmitir a PA5, y luego, usando el módulo loopback, transmitir a un receptor BT a2dp.
No pude ejecutarlo con ALSA, pero leí en alguna parte que BlueZ5 ya no es compatible con los complementos pcm de ALSA.
fuente
La clave del problema anterior es esta frase: "Una vez que se detiene el descubrimiento, los dispositivos que no estén conectados o emparejados serán eliminados automáticamente por bluetoothd en tres minutos".
Lea la sección de descubrimiento de dispositivos en http://www.bluez.org/bluez-5-api-introduction-and-porting-guide/
Tuve un problema similar, pero lo emparejé y conecté. Para emparejar y conectar un dispositivo, debe haberse descubierto en los últimos 3 minutos. Tanto el agente simple como bluetoothctl funcionan bien.
fuente