我正在使用运行Ubuntu和Python 2.7的家庭计算机运行testing,希望Raspberry Pi 3能够使用具有自定义服务和特性的BLE进行广告宣传。 我已经在两个设备上安装了蓝牙版本5.42(使用推荐的方法)以及dbus-python。 我的电脑和Raspberry Pi都能够使用hci0 lescan 0
命令做广告,但是我想用bluez示例脚本做广告,例如example-gatt-client.py和example-advertisement.py,这是我想要的使用我自己的自定义特征。
家用电脑 – 内核版本4.4.0-31通用
我能够创build自定义特征和广告运行example-gatt-server.py和example-advertise.py在我的家用电脑上没有问题。 我遇到的一个问题是我需要启用Bluez实验模式, --experimental
是在位于/lib/systemd/system/bluetooth.service
的bluetooth.service文件中添加/lib/systemd/system/bluetooth.service
。 另外安装dbus-python库也有点麻烦,因为我必须自己为Python2构build和安装它。
advertise.py脚本查找名为“org.bluez.LEAdvertisingManager1”的特定广告界面。 gatt-server.py脚本查找“org.bluez.GattManager1”。 我可以通过运行以下命令来检查该接口是否存在:
dbus-send --system --dest=org.bluez --print-reply / org.freedesktop.DBus.ObjectManager.GetManagedObjects
这些接口被发现,并在我的家用电脑上正常工作。 脚本运行没有问题。
树莓派 – 内核版本4.4.38-V7 +
使用相同的bluez版本和启用的实验性function,运行advertise.py时遇到此错误:
LEAdvertisingManager1界面未find。
而当我执行命令“systemctl status bluetooth”时,显示启用了实验标志,但运行时没有看到LEAdvertistingManager1。
dbus-send --system --dest=org.bluez --print-reply / org.freedesktop.DBus.ObjectManager.GetManagedObjects
然而,我可以运行gatt-server.py脚本而不发出问题,这意味着“org.bluez.GattManager1”被发现并正常工作。 我在这里错过了什么?
我已经search了这个问题,但唯一的build议是启用实验function,并确保我的内核是> = 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”之后的实验
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
祝你好运!
虽然这是Bluetoothctl到最新版本的蓝牙,Bluetoothd保持在旧版本的5.23。 问题似乎是,当你安装pi-bluetooth它安装5.23作为依赖。 如何得到最新的版本BlueUSD? 我注意到显然是从上面的步骤安装。 重启后仍然在5.23。
pi @ raspberrypi:〜/ bluez-5.37 $ bluetoothd -v 5.23 pi @ raspberrypi:〜/ bluez-5.37 $ bluetoothctl -v 5.37