DBus.ObjectManager.GetManagedObjects 中缺少 LEAdvertisingManager1

LEAdvertisingManager1 missing from DBus.ObjectManager.GetManagedObjects

我运行正在用我的家用电脑测试 运行正在 Ubuntu 和 Python 2.7,希望 Raspberry Pi 3 使用具有定制服务和特性的 BLE。我已经在两个设备以及 dbus-python 上安装了 Bluez 版本 5.42(使用推荐的方法)。我的电脑和 Raspberry Pi 都可以使用 hci0 lescan 0 命令做广告,但我想用 bluez 示例脚本做广告,example-gatt-client.py 和 example-advertisement.py 发现 here,因为我想使用我自己的自定义特征。

家用电脑 - 内核版本 4.4.0-31 通用

我可以通过 运行ning example-gatt-server.py 和 example-advertise.py 创建自定义特征和做广告,在我的家用电脑上没有任何问题。我遇到的一个障碍是我需要通过将 --experimental 添加到位于 /lib/systemd/system/bluetooth.service 的 bluetooth.service 文件来启用 Bluez 实验模式。安装 dbus-python 库也有点麻烦,因为我必须自己为 Python2.

构建和安装它

advertise.py 脚本查找名为 "org.bluez.LEAdvertisingManager1" 的特定广告接口。 gatt-server.py 脚本查找 "org.bluez.GattManager1"。我可以通过 运行ning 以下命令检查该接口是否存在:

dbus-send --system --dest=org.bluez --print-reply / org.freedesktop.DBus.ObjectManager.GetManagedObjects

这些接口在我的家用电脑上找到并运行良好。脚本 运行 没有问题。

Raspberry Pi - 内核版本 4.4.38-v7+

使用相同的 bluez 版本并启用实验性功能,我 运行 在尝试 运行 advertise.py:

时遇到此错误

LEAdvertisingManager1 interface not found.

当我执行命令 "systemctl status bluetooth" 时,它显示实验标志已启用,但在 运行ning 时我没有看到 LEAdvertistingManager1。

dbus-send --system --dest=org.bluez --print-reply / org.freedesktop.DBus.ObjectManager.GetManagedObjects

不过我可以 运行 gatt-server.py 脚本没有问题,这意味着 "org.bluez.GattManager1" 已找到并正常工作。我在这里错过了什么?

我搜索过这个问题,但唯一的建议是启用实验性功能并确保我的内核 >= 4.1。

我的问题解决了!经过大量调试和查看 bluez 错误日志后,我意识到我没有在我的 Pi 上正确安装 bluez。以下是从 raspbian.

的全新安装正确安装 bluez 的步骤
sudo apt-get update 
sudo apt-get upgrade 
mkdir bluez 
cd bluez 
wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.43.tar.xz 
tar xvf bluez-5.43.tar.xz 
cd bluez-5.43/ 
sudo apt-get install -y libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev 
./configure 
sudo make 
sudo make install

然后,启用实验模式。 Bluez v5.23 可能不需要这样做,但我还是这样做了。

cd
sudo nano /lib/systemd/system/bluetooth.service

在 "ExecStart=/usr/local/libexec/bluetooth/bluetoothd" 行之后添加 --experimental 所以它应该看起来像

ExecStart=/usr/local/libexec/bluetooth/bluetoothd --experimental

然后获取蓝牙运行这个新配置

sudo systemctl daemon-reload 
sudo systemctl restart bluetooth

如果您想 运行 测试广告,您可以使用以下内容:

sudo hciconfig hci0 up
sudo hciconfig hcio leadv 0

您的 Pi3 应标示为 "raspberrypi",如果您尝试使用您最喜欢的 BLE 应用程序连接到它(我在 iOS 上使用 LiteBlue),它应该具有一些默认特征。

为了检查'LEAdvertisingManager1'是否存在,我们需要运行

dbus-send --system --dest=org.bluez --print-reply / org.freedesktop.DBus.ObjectManager.GetManagedObjects

最后,不要尝试运行我原来的link中的脚本post。他们太过时了。相反,运行 示例脚本位于您创建的目录中。

cd bluez/bluez-5.43/tests

在 运行ning 之前,您需要通过以下方式安装 dbus-python:

sudo apt-get install python-dev libdbus-1-dev libdbus-glib-1-dev 
sudo apt-get install python-pip 
sudo apt-get install --reinstall python-gi
sudo python2.7 -m pip install dbus-python

如果您想 运行 使用 python2.7 的示例广告脚本(我这样做了),您必须将示例广告中的行从

更改为
import gobject

from gi.repository import GObject as gobject

如果您想添加自己的自定义特征,您需要并发 运行 example-gatt-server 应该运行 无需修改.

我还有一个小问题,我的 iPhone 在询问 Pi3 时卡住了,无法连接。只需重置蓝牙即可解决此问题。

sudo systemctl daemon-reload 
sudo systemctl restart bluetooth

祝你好运!

虽然这是将 Bluetoothctl 升级到最新版本的 Bluez,但 Bluetoothd 仍停留在旧版本 5.23。问题似乎是,当您安装 pi-bluetooth 时,它会安装 5.23 作为依赖项。如何让 Blueoothd 也升级到最新版本?我注意到显然是从上面的步骤安装的。重新启动后仍然是 5.23。

pi@raspberrypi:~/bluez-5.37 $ bluetoothd -v 5.23 pi@raspberrypi:~/bluez-5.37 $ bluetoothctl -v 5.37