- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在使用运行 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”的特定广告接口(interface)。 gatt-server.py 脚本查找“org.bluez.GattManager1”。我可以通过运行以下命令检查该接口(interface)是否存在:
dbus-send --system --dest=org.bluez --print-reply / org.freedesktop.DBus.ObjectManager.GetManagedObjects
这些接口(interface)在我的家用电脑上找到并运行良好。脚本运行没有问题。
Raspberry Pi - 内核版本 4.4.38-v7+
使用相同的 bluez 版本并启用实验性功能,我在尝试运行 advertise.py 时遇到此错误:
LEAdvertisingManager1 interface not found.
当我执行命令“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
在“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
祝你好运!
关于linux - DBus.ObjectManager.GetManagedObjects 中缺少 LEAdvertisingManager1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41351514/
我正在使用运行 Ubuntu 和 Python 2.7 的家用计算机进行测试,希望 Raspberry Pi 3 使用具有自定义服务和特性的 BLE 进行广告宣传。我已经在两个设备和 dbus-pyt
我是一名优秀的程序员,十分优秀!