web-dev-qa-db-ja.com

bluetoothd(BlueZ 5)はどのデバイスとも接続しません

解決しました。 編集済み:以下を参照してください。

私はこの問題に十分な時間インターネットを精査してきたと思います。何度も尋ねられましたが、解決策はありません。最終的にその低エネルギー機能を使用できるようにしたいので、BlueZ 5にアップグレードしました。ただし、現時点では、デバイスをペアにすることさえできません。これは最終的に組み込みLinuxシステム用になるため、GUIを使用することはできません。したがって、bluetoothctlはインタラクティブセッションを必要とするため、使用することもできないと思います。 (私はそれについて間違っているかもしれません。)だから、私はすべてがBASH、C、またはpythonのいずれかを介して行われることを望みます。また、自動化が必要なため、ペアリングと接続は、Linuxボックスからではなく、Bluetoothデバイスから開始する必要があります。最後に、すべてのデバイスでa2dpプロファイルを使用する必要があります。

多くのアプローチがあるように見えますが、一方がどこで終わり、もう一方がどこから始まるのか明確ではありません。

アプローチ1:

a)$ Sudo bluetoothd -d -n #verboseモードでbluetoothdを実行します

b)$ hciconfig hci1 up#デバイスの電源を入れます

$ hciconfig -a#デバイスのプロパティを見る

    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)デバイスからペアリングを試みます。

結果: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()

デバイスはと言いますPINまたはパスキーが正しくないため、Adapter-1とペアリングできませんでした。

上記のスター付きの回答に基づいて、エージェントがいない理由を調べました。エージェントとは何ですか?誰が知っているが、それは私のデバイスとbluetoothデーモンの仲介者だと推測した。

d)$ ../bluey-5.15/test/simple-agent#これらのコマンドでSudoを使用してみました

または$ ../bluey-5.15/test/simple-agent hci1

これは、着信ペアリング要求を処理するpythonスクリプトです。成功すると、「信頼」と「接続」も試みます

出力:Agent registered

e)その後、デバイスからペアリングを再試行します。

シンプルエージェント出力:

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

BTデバイスでペアをヒットすると、ペアになったと表示されますが、シンプルエージェントがハングします。 BlueZ 4を使用しましたが、「New Device XX_XX_XX_XX_XX_XX_XX」のように表示されるはずです。

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()

これが何かをします。

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

Bluetoothctlも試しましたが、同じ結果になります。面白いことに、BlueZの一部のスクリプト(テストデバイスなど)は、一部のコマンドでBTデバイスを表示できますが、他のコマンドでは表示できません。たとえば、test-deviceはデバイスを「信頼」しますが、「削除」しようとすると、デバイスは存在しません。

アプローチ2:

Dbus-send --systemコマンドを直接使用したDBUS。デバイスをペアリングして接続できるようになるまで、これらのコマンドが役に立たないと思います。

アプローチ3:

これに関するすべての提案を試しました post 。 BlueZ 5には/etc/bluetooth/hcid.confはありません。作成する必要がありますか? rfcommコマンドは接続しますが、その後すぐに切断します。

$ 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

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()

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

助言がありますか?私は:

  • 本当に明らかなことを忘れましたか?

  • ツールを誤って使用していますか?

  • 構成ファイルの設定を忘れましたか?

編集:

Bluez simple-agentから有用なエラーが返されなかったため、独自のペアリングエージェントを作成しました。一度接続すると、ペアリングできましたが、接続できませんでした。 bluetoothdは私にこの新しいエラーを与えました:

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

この投稿 多分、私のローカルBluetoothアダプターは私のオーディオソースのa2dpプロファイルをサポートしていなかったと指摘しました。 (シンクのように振る舞わない)その後、BlueZ4からBlueZ5にアップグレードする多くの人々が同じ問題を経験していることがわかりました。また、問題は BlueZメーリングリストに投稿 でした。

これまでのところ、このプロトコルを自分のアダプターに追加する方法を見つけていません。

9
MrUser

解決:

プロファイル(a2dp)が接続されていないことを発見し、他のユーザーにも同じ問題があることを確認した後、このプロファイルがBlueZ5にまだ実装されているかどうかを調べました。 a2dpがBlueZスタックからGStreamerに移動されたことを説明しているため、移植ガイドを十分に読んでいないと思います。 GStreamerのことを聞いたが、PulseAudioとJACKもこのプロファイルを実装することを この投稿 から見た。 PulseAudioを試しましたが、アダプターの適切なUUIDが読み込まれませんでした。そして、ついに ArchLinux wikiに投稿しました を見つけました。このページに何百回もアクセスしたに違いありませんが、おそらくBlueZ4をまだ使用していたときでしょう。

最も重要なこと:

-BlueZ5をサポートする新しいPulseAudio 5ソースコードをダウンロードし、コンパイルします。 (aptリポジトリの最新バージョンではありません。)

-コンパイルには多くの依存関係が必要でした(JSON、libsndfile、libcapなど)

-PA5のパスは/ usr /ではなく/ usr/localであることに注意してください(PAが起動時にlibpulsecore-5.0を見つけることができるように$ LD_LIBRARY_PATHに配置する必要があるため、これは重要です)

-ArchLinux wikiにあるように、起動時に実行されているpulseaudioサーバーを強制終了し、新しいサーバーを起動します。起動時にプロファイルをロードしません。また、デーモンが再起動することを確認してください。 (/usr/local//etc/Pulse/client.confに設定)

その後、通常のpactlコマンドが機能します。 a2dp BTソース(つまりiPod)を取得してPA5にストリーミングし、ループバックモジュールを使用してa2dp BTシンクにストリーミングできました!

ALSAで実行することはできませんでしたが、BlueZ5がALSA pcmプラグインをサポートしていない可能性があることをどこかで読みました。

8
MrUser

上記の問題の鍵は次のフレーズです。「検出が停止すると、接続もペアリングもされていないデバイスは、bluetoothdによって3分以内に自動的に削除されます。」

http://www.bluez.org/bluez-5-api-introduction-andのDevice discoveryセクションをお読みください-porting-guide /

同様の問題がありましたが、ペアリングして接続しました。デバイスをペアリングして接続するには、最後の3分以内にデバイスが検出されている必要があります。 simple-agentとbluetoothctlの両方が正常に機能します。

2
vtmr