bluetoothd (BlueZ 5) não conectará com nenhum dispositivo

8

RESOLVIDO. Editado: veja abaixo.

Acho que vasculhei a internet o tempo suficiente para esse problema. Foi perguntado muitas vezes, mas nenhuma das soluções funciona para mim. Eu atualizei para o BlueZ 5 porque eu quero ser capaz de usar suas capacidades de baixa energia eventualmente. No momento, porém, não consigo nem mesclar meus dispositivos. Eu não posso usar uma GUI porque isso eventualmente será para um sistema Linux embutido. Portanto, acho que também não posso usar bluetoothctl, porque requer uma sessão interativa. (Eu posso estar errado nisso.) Então eu quero que tudo seja através de BASH, C ou python, nessa ordem. Além disso, como ele precisa ser automatizado, o emparelhamento e a conexão terão que ser iniciados a partir do dispositivo bluetooth, não da caixa linux. Por fim, todos os dispositivos precisam usar o perfil do a2dp.

Parece haver muitas abordagens, mas não estou claro onde um termina e o outro começa:

ABORDAGEM 1:

a) $ sudo bluetoothd -d -n # executa o bluetoothd no modo detalhado

b) $ hciconfig hci1 up #desvia o dispositivo em

$ hciconfig -a #ver as propriedades do 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) tente emparelhar a partir do dispositivo.

Resultado:     do 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()

O dispositivo diz que não foi possível emparelhar com o adaptador 1 devido a um PIN ou senha incorretos.

Com base nas respostas marcadas acima, analisei por que não havia um agente. O que é um agente? Quem sabe, mas eu inferi que era o intermediário entre o meu dispositivo e o daemon bluetooth.

d) $ ../bluey-5.15/test/simple-agent #Eu também tentei usar o sudo com esses comandos

ou $ ../bluey-5.15/test/simple-agent hci1

Este é um script python que lida com pedidos de emparelhamento recebidos. Se bem sucedido, ele também tenta 'confiar' e 'conectar'

saída: Agent registered

e) tente novamente parear a partir do dispositivo.

saída do agente simples:

RequestConfirmation (/org/bluez/hci1/dev_70_72_3C_62_49_7F, 110643)
Confirm passkey (yes/no): yes 

Eu toquei em par no dispositivo BT e ele diz emparelhado, mas o agente simples trava. Eu usei o BlueZ 4, e tenho certeza que ele deveria dizer algo como "Novo dispositivo XX_XX_XX_XX_XX_XX"

saída 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()

Então isso faz alguma coisa.

saída 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

Eu até tentei bluetoothctl, mas tem os mesmos resultados. O engraçado é que alguns scripts do BlueZ (como o dispositivo de teste) podem ver o dispositivo BT para alguns comandos, mas não outros. Por exemplo, o dispositivo de teste "confia" no dispositivo, mas quando tento "removê-lo", ele não existe.

ABORDAGEM 2:

DBUS usando diretamente os comandos -system-dbus-send. Eu não acho que nenhum desses comandos me fará bem até que eu possa emparelhar e conectar o dispositivo.

ABORDAGEM 3:

Eu tentei todas as sugestões sobre este postar . Não há /etc/bluetooth/hcid.conf no BlueZ 5. Preciso criar um? O comando rfcomm se conectará, mas depois se desconectará logo em seguida.

$ 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

saída 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()

saída 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

Alguma sugestão? Eu sou:

  • Esquecendo algo realmente óbvio?

  • Usando as ferramentas incorretamente?

  • Esquecendo de definir um arquivo de configuração?

Editar:

Como o agente simples bluez não estava me dando nenhum erro útil, eu escrevi meu próprio agente de emparelhamento. Depois disso, consegui parear, mas não conectei. O bluetoothd me deu este novo erro:

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

Este post apontou que talvez o meu O adaptador bluetooth LOCAL não estava suportando o perfil a2dp da minha fonte de áudio. (Não agindo como uma pia) Então eu vi que o mesmo problema foi experimentado por muitas pessoas atualizando do BlueZ4 para o BlueZ5. O problema também foi publicado na lista de discussão do BlueZ .

Até agora, não encontrei uma maneira de adicionar esse protocolo ao meu adaptador.

    
por MrUser 28.03.2014 / 17:39

2 respostas

8

Solução:

Depois de descobrir que o perfil (a2dp) não estava conectado e ver que outros tinham o mesmo problema, verifiquei se esse perfil já estava implementado no BlueZ5. Eu acho que não li o guia do porting perto o suficiente, porque explica que o a2dp foi movido para fora da pilha do BlueZ e para o GStreamer. Eu nunca tinha ouvido falar do GStreamer, mas também vi de esta postagem que o PulseAudio e o JACK também implementariam esse perfil. Eu tentei o PulseAudio, mas ele não carregaria os UUIDs adequados para o adaptador. Então eu finalmente encontrei uma postagem no wiki do ArchLinux. Eu devo ter estado nesta página um milhão vezes, mas foi provavelmente quando eu ainda estava usando BlueZ4.

Mais importante:

- transfira o novo código fonte do PulseAudio 5, que tem suporte para o BlueZ5, e compile-o. (Não é a versão mais recente nos repositórios apt.)

O

-compiling teve muitas dependências (JSON, libsndfile, libcap, etc)

- tenha em mente que o caminho para o PA5 é / usr / local não / usr / (Isso é importante, porque eu tive que colocá-lo em $ LD_LIBRARY_PATH para que o PA pudesse encontrar a libpulsecore-5.0 na inicialização)

-como diz o wiki do ArchLinux, mate o servidor pulseaudio que é executado na inicialização e inicie um novo. Não carrega os perfis na inicialização. Também certifique-se de que o daemon reaparece. (Defina em /usr/local//etc/pulse/client.conf)

Depois disso, os comandos usuais do pactl funcionam. Consegui obter uma fonte BT a2dp (ou seja, iPod) para transmitir para o PA5 e, depois, usando o módulo de loopback, transmitir para um coletor BT a2dp!

Eu não consegui executá-lo com o ALSA, mas li em algum lugar que o BlueZ5 pode não suportar mais os plugins pcm do ALSA.

    
por MrUser 04.04.2014 / 18:49
2

A chave para o problema acima é esta frase: "Quando a descoberta parar, os dispositivos que não estiverem conectados ou emparelhados serão automaticamente removidos pelo bluetoothd dentro de três minutos".

Por favor, leia a seção Detecção de dispositivos de link a>

Eu tive um problema parecido, mas o emparelhei e conectei. Para parear e conectar um dispositivo, ele deve ter sido descoberto nos últimos 3 minutos. O simple-agent e o bluetoothctl funcionam bem.

    
por vtmr 21.10.2014 / 17:26