我面临以下问题:我有一个用 Go 编写的应用程序,它使用蓝牙 api。当针对 Windows 进行编译并运行时,该应用程序可以运行。当为我的树莓派编译时,应用程序失败。我在互联网上查找有关问题可能是什么的一些提示。该应用程序抛出以下错误:
Properties.GetAll org.bluez.Device1: Method "GetAll" with signature "s" on interface "org.freedesktop.DBus.Properties" doesn't exist
显然,在阅读 dbus 文档时,该方法应该存在于具有给定签名的接口上。因此,可能是 dbus 安装出了问题。
我发现发生该错误的一些实例 - 但没有一个实例描述解决方案:
- https://github.com/blueman-project/blueman/issues/460
- https://www.linuxquestions.org/questions/slackware-14/pc-config-for-bluetooth-not-able-to-dl-anything-4175656862/
为了帮助找到解决方案,我运行了 linuxquestions 论坛中给出的命令:
$ dbus-send --system --dest=org.bluez --type=method_call --print-reply /org/bluez/hci0/dev_xx_xx_xx_xx_xx_xx org.freedesktop.DBus.Properties.GetAll string:org.bluez.Device1
Error org.freedesktop.DBus.Error.UnknownObject: Method "GetAll" with signature "s" on interface "org.freedesktop.DBus.Properties" doesn't exist
这表明,这不是我正在运行的应用程序的问题,而是树莓派本身的问题。另一个应用程序(用 Python 编写)能够成功创建蓝牙连接,因此我排除了硬件问题。
以下是有关我的系统的更多信息:
$ rfkill
ID TYPE DEVICE SOFT HARD
0 wlan phy0 blocked unblocked
1 bluetooth hci0 unblocked unblocked
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye
$ apt -qq list bluez
bluez/oldstable,now 5.55-3.1+rpt2+deb11u1 armhf [installed,automatically]
我的安装有什么问题吗?我该如何解决它?
答案1
我怀疑您的请求中仅定义了错误的对象路径。最好使用以下代码片段来获取 bluez 服务中的所有对象并检查是否/org/bluez/hci0/dev_xx_xx_xx_xx_xx_xx
确实存在
dbus-send --system --dest=org.bluez --print-reply / org.freedesktop.DBus.ObjectManager.GetManagedObjects
答案2
发现问题:虽然在 Windows 上不需要,但 bluez 实现仅在发现 BT 设备后创建 dbus 路径。
为了使用 bluez 连接到设备,程序必须首先扫描设备。一旦发现设备,就会创建所有必要的接口。