【问题标题】:LEAdvertisingManager1 missing from DBus.ObjectManager.GetManagedObjectsDBus.ObjectManager.GetManagedObjects 中缺少 LEAdvertisingManager1
【发布时间】:2017-05-12 02:45:29
【问题描述】:

我正在使用运行 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 通用

我可以通过在我的家用计算机上运行 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”。我可以通过运行以下命令来检查该接口是否存在:

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

这些接口在我的家用电脑上可以正常工作。脚本运行没有问题。

Raspberry Pi - 内核版本 4.4.38-v7+

使用相同的 bluez 版本并启用实验功能,我在尝试运行 Advertisement.py 时遇到此错误:

找不到LEAdvertisingManager1 接口。

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

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

但是,我可以毫无问题地运行 gatt-server.py 脚本,这意味着“org.bluez.GattManager1”已找到并正常工作。我在这里错过了什么?

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

【问题讨论】:

    标签: linux python-2.7 raspberry-pi dbus bluez


    【解决方案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
    

    最后,不要尝试从我原始帖子中的链接运行脚本。他们是如此令人难以置信的过时。相反,请运行您创建的目录中的示例脚本。

    cd bluez/bluez-5.43/tests
    

    在运行之前,您需要通过以下方式安装 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 运行 example-advertise 脚本(我这样做了),您必须将 example-advertise 中的行从

    import gobject
    

    from gi.repository import GObject as gobject
    

    如果您想添加自己的自定义特征,您需要同时运行 example-gatt-server,它应该无需修改即可运行。

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

    sudo systemctl daemon-reload 
    sudo systemctl restart bluetooth
    

    祝你好运!

    【讨论】:

    • 感谢您的详细说明。但是在 Raspi 3 上,我得到:sudo hciconfig hci0 up –> Can't get device info: No such device。我们是否应该在运行make 之前应用补丁,如github.com/ukBaz/python-bluezero/issues/30 中所述?
    • 这对我有用:我同时应用了 hciattach-patch(但不知道是否有必要),我还运行了sudo /usr/bin/hciattach /dev/ttyAMA0 bcm43xx 921600 noflow -)。在这之间可能需要重新启动。 sudo hcitool lescan 发现外围设备。
    • 谢谢。工作得很好!我不需要手动安装 bluez,只需添加 --experimental,然后 daemon-reload 并重新启动蓝牙!
    【解决方案2】:

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

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

    【讨论】:

    • 你试过完整路径吗?当我运行它时,make 文件没有替换原始的可执行文件,它把它放在不同的文件夹中。你可以试试/usr/local/libexec/bluetooth/bluetoothd --version
    猜你喜欢
    • 1970-01-01
    • 2012-10-23
    • 2011-12-11
    • 2011-05-29
    • 2012-06-12
    • 2016-09-30
    • 2020-05-08
    • 2013-06-21
    • 2018-02-27
    相关资源
    最近更新 更多