LEAdvertisingManager1从DBus.ObjectManager.GetManagedObjects丢失

问题描述:

我正在运行我的家庭计算机运行Ubuntu和Python 2.7的测试,希望让Raspberry Pi 3使用具有自定义服务和特性的BLE进行广告。我已经在两个设备以及dbus-python上安装了蓝牙版本5.42(使用推荐的方法)。我的电脑和Raspberry Pi都可以使用hci0 lescan 0命令做广告,但我想用bluez示例脚本做广告,example-gatt-client.py和example-advertisement.py找到here,因为我想用我的自己的习惯特征。LEAdvertisingManager1从DBus.ObjectManager.GetManagedObjects丢失

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

我可以创建自定义特性和运行example-gatt-server.py做广告,没有问题的example-advertise.py我的家用电脑。我遇到的一个问题是我需要启用Bluez实验模式,将--experimental添加到位于/lib/systemd/system/bluetooth.service的bluetooth.service文件。安装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 

这些接口被发现和我家里的电脑上正常工作。脚本运行没有问题。

树莓派 - 内核版本38年4月4日至V7 +

在相同的bluez版本并启用了实验性的功能,我试图运行advertise.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。

我解决了我的问题!经过很多调试并查看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 

添加--experimental行 “ExecStart =在/ usr /本地/ libexec目录/蓝牙/ bluetoothd” 后 所以它应该看起来像

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(这是我做的)例子,广告脚本,你必须更改线路例如,从做广告

import gobject 

from gi.repository import GObject as gobject 

如果你想添加自己的自定义特性,你需要同时运行应该无需修改即可运行例如总协定的服务器。

我也有一个小问题,即我的iPhone被卡住询问PI3并且将无法连接。这是通过简单地重置蓝牙来解决的。

sudo systemctl daemon-reload 
sudo systemctl restart bluetooth 

祝你好运!

+0

感谢您的详细说明。然而在Raspi 3,我得到:'须藤hciconfig hci0 up' - >'无法获取设备信息:没有这样的device'。我们是否应该在https://github.com/ukBaz/python-bluezero/issues/30中描述的运行'make'之前应用补丁? –

+0

现在这对我有用:我应用了hciattach-patch(不知道是否有必要),并且还运行'sudo/usr/bin/hciattach/dev/ttyAMA0 bcm43xx 921600 noflow -')。重启之间可能是必要的。'sudo hcitool lescan'发现外围设备。 –

+0

为我完美工作。重大进展。谢谢 – user462990

虽然这是越来越Bluetoothctl以配合bluez的最新版本,Bluetoothd保持在5.23这是旧版本。问题似乎是,当你安装PI-蓝牙将其安装5.23作为依赖。如何获得最新版本的Blueoothd?我注意到显然是从上面的步骤安装。重新启动后仍然在5.23。

PI @树莓派:〜/ bluez的-5.37 $ bluetoothd -v 5.23 PI @树莓派:〜/ bluez的-5.37 $ bluetoothctl -v 5.37

+0

你试过完整的路径吗? make文件在我运行时并没有替换原来的可执行文件,而是将它放在不同的文件夹中。你可以试试'/ usr/local/libexec/bluetooth/bluetoothd --version'。 – cloisteredmonkey