Bluez(蓝牙)在连接时没有发送 DBUS method_call SelectConfiguration 吗?如果是这样,我该如何抓住它?

Posted

技术标签:

【中文标题】Bluez(蓝牙)在连接时没有发送 DBUS method_call SelectConfiguration 吗?如果是这样,我该如何抓住它?【英文标题】:Is Bluez (bluetoothd) not sending DBUS method_call SelectConfiguration upon Connection? If so, how do I catch it? 【发布时间】:2014-04-29 04:44:07 【问题描述】:

更新:尚未解决,但已成为解决方案的一部分。见下文。

我正在尝试通过蓝牙将我的 iPod 或其他智能设备连接到我的笔记本电脑 (Kubuntu 13.10),并将 a2dp 编码的音乐流式传输到蓝牙扬声器。别介意我为什么不直接连接它们。我在让设备实际配对然后同时连接时遇到了很多麻烦,但现在我能够做到这一点。有一百万篇文章描述了通过更改 .asoundrc、/etc/bluetooth/audio.conf 并通过 PulseAudio 的控制器加载环回模块来连接 BT 耳机的不同方法。但是,我永远无法让 PulseAudio 始终如一地加载源和接收器,所以我放弃了这个想法并开始关注 James B 的这篇精彩文章:http://jamesbond3142.no-ip.org/blog/?viewCat=Bluetooth

我编译了代码。它使用(更新的?)用于 BlueZ 的 DBus API。按照他的指示,我能够将音乐导入或导出 a2dp“服务器”,但没有声音。在代码中,他等待两个 DBUS 方法调用 SelectConfiguration 和 SetConfiguration 以获得“传输”,我认为这是一个句柄或文件描述符,描述了音频应该去往/来自哪里。但是,这些事件的处理程序永远不会被调用。我使用本指南设置 dbus-monitor 在系统总线上监听这些调用:https://wiki.ubuntu.com/DebuggingDBus。但是,方法调用不显示。再一次,我尝试在系统总线上收听任何方法调用,并且有一些在我知道正在调用的 dbus-monitor 中没有显示。 (即RegisterEndpoint)

我看到来自 org.bluez 的信号,但没有方法调用。在详细模式下运行 bluetoothd 时,当我连接我的设备时会得到类似的结果:

蓝牙 [12118]: 音频/a2dp.c:setup_ref() 0x7f9e8ffbdac0: ref=2 蓝牙 [12118]: 音频/avdtp.c:avdtp_set_configuration() 0x7f9e8ffd03f0: int_seid=1, acp_seid=1 蓝牙 [12118]: 音频/a2dp.c:setup_unref() 0x7f9e8ffbdac0: ref=1 蓝牙 [12118]: 音频/avdtp.c:session_cb() bluetoothd[12118]: audio/avdtp.c:avdtp_parse_resp() SET_CONFIGURATION 请求成功 bluetoothd[12118]:音频/a2dp.c:setconf_cfm() 源 0x7f9e8ffa4600:Set_Configuration_Cfm bluetoothd[12118]:audio/avdtp.c:avdtp_sep_set_state() 流状态已更改:IDLE -> CONFIGURED 蓝牙 [12118]: 音频/avdtp.c:session_cb() bluetoothd[12118]: audio/avdtp.c:avdtp_parse_resp() OPEN 请求成功

但在另一篇文章中,我看到有人有这个:

蓝牙 [8315]: 音频/a2dp.c:setup_ref() 0x7f1f8300b000: ref=2 蓝牙 [8315]:音频/avdtp.c:avdtp_set_configuration() 0x7f1f83012250:int_seid=2,acp_seid=1 蓝牙 [8315]: 音频/a2dp.c:setup_unref() 0x7f1f8300b000: ref=1 蓝牙 [8315]: 音频/avdtp.c:session_cb() bluetoothd[8315]: 音频/avdtp.c:avdtp_parse_resp() SET_CONFIGURATION 请求成功 蓝牙 [8315]:音频/a2dp.c:setconf_cfm() 接收器 0x7f1f82fc3210:Set_Configuration_Cfm bluetoothd[8315]: audio/media.c:media_endpoint_async_call() 调用 SetConfiguration: name = :1.65 path = /MediaEndpoint/A2DPSink

bluetoothd[8315]:audio/avdtp.c:avdtp_sep_set_state() 流状态已更改:IDLE -> CONFIGURED 蓝牙 [8315]: 音频/avdtp.c:session_cb() bluetoothd[8315]: audio/avdtp.c:avdtp_parse_resp() OPEN 请求成功

此时我有两个理论: 1)当我的设备连接时,BlueZ 没有将它发送到我正在观看的总线 2)我看的不对(method_calls也需要加上dbus_bus_add_match()吗?)

我很难相信第二个,因为 James B 的代码为他工作,而我没有修改它。我正在使用 bluez 4.101 版。 (和他一样,我想) 很难找到 BlueZ 调用这些方法的确切条件。

当我启动程序时,我的系统日志会这样说:

bluetoothd[8519]:端点注册:sender=:1.166 path=/MediaEndpoint/A2DPSource

并在程序退出时注销。

目前我想不出要添加的其他细节,但如果我没有提供足够的信息,我很高兴。提前致谢。

更新 有点尴尬,但我今天绞尽脑汁想为什么 LINUX 系统不会得到文件句柄......嗯......所以我将 sudo 附加到程序调用(James B 的 a2dp-alsa程序),它的工作。至少对于输入设备。输出(BT 扬声器)仍然没有,但我会尽快弄清楚并在此处发布结果。

在哪里领取我的新手徽章? :(

【问题讨论】:

您是否偶然拥有了 James B 帖子的副本?该链接似乎已失效。 (或者我是唯一一个打印我正在从事的项目的重要参考资料的 PDF 格式的人吗?) 【参考方案1】:

我没有继续使用 BlueZ 4。我升级到了 BlueZ 5 和 PulseAudio 5,它们比以前的版本更好地协同工作。之后,我终于可以使用 pactl loopback 模块了。 (详情请参阅this post。)

【讨论】:

以上是关于Bluez(蓝牙)在连接时没有发送 DBUS method_call SelectConfiguration 吗?如果是这样,我该如何抓住它?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中使用 Bluez5 DBUS API 来配对和连接新设备?

如何使用 Bluez Profile1 DBus API 注册连接回调

Linux over BlueZ下的C++蓝牙耳机

BlueZ 显示 DBUS 上的旧缓存数据

在 Bluez 中创建 dbus 接口

你如何通过 dbus 执行蓝牙发现?