[BlueZ] 2、使用bluetoothctl搜索、连接、配对、读写、使能notify蓝牙低功耗设备

本文介绍了如何使用bluetoothctl工具在Linux系统,特别是Raspberry Pi上搜索、连接、配对、读写和启用notify功能与蓝牙低功耗(BLE)设备交互。文章指出gatttool存在一些问题,推荐使用更新的bluetoothctl工具,并提供了具体的操作步骤和遇到的问题解决方案。

星期三, 05. 九月 2018 02:03上午 - beautifulzzzz

bar.png

1、前言

上一篇讲了如何编译安装BlueZ-5,本篇主要在于玩BlueZ,用命令行去操作BLE设备:

bar.png

2、gatttool —— 老工具趟坑

刚开始跟着 Get Started with Bluetooth Low Energy on Linux 操作gatttool,发现坑太多(主要原因是工具老了):

采用sudo gatttool -b 4D:69:98:0E:91:5E -I去连接
发现会报错:Error: connect error: Connection refused (111)
最终参考LINK-11发现需要加random选项(#1)

➜  ~  sudo gatttool -b 4D:69:98:0E:91:5E -I
[4D:69:98:0E:91:5E][LE]> connect
Attempting to connect to 4D:69:98:0E:91:5E
Error: connect error: Connection refused (111)
[4D:69:98:0E:91:5E][LE]> exit
➜  ~  sudo gatttool  -t random  -b 4D:69:98:0E:91:5E -I
[4D:69:98:0E:91:5E][LE]> connect
Attempting to connect to 4D:69:98:0E:91:5E
Connection successful
[4D:69:98:0E:91:5E][LE]> 
(gatttool:3104): GLib-WARNING **: Invalid file descriptor.

过一回会10S自动断开,网上说这个工具老了,不建议用了(

要在Qt中使用DBus与BlueZ实现打开低功耗蓝牙(BLE)、设置特征值并进行广播,可以分为以下几个步骤: 1. **连接BlueZ的DBus接口** BlueZ是Linux平台上的蓝牙协议栈,它通过DBus提供API。Qt提供了DBus模块来访问这些接口。 2. **启用LE Advertising(低功耗广播)** 你需要调用BlueZ提供的`StartAdvertising`方法来启动广播。 3. **添加GATT服务和特征值** 使用BlueZ的GATT管理接口创建自定义服务,并为该服务添加可读写的特征值。 4. **设置特征值数据** 在设备连接后,可以通过写入特征值来修改数据内容。 以下是一个基本的Qt代码示例,展示如何使用Qt D-Bus与BlueZ交互来实现BLE广播和特征值设置(需要Qt D-Bus模块支持): ```cpp #include <QDBusConnection> #include <QDBusInterface> #include <QDBusMessage> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); // 连接到系统总线 QDBusConnection bus = QDBusConnection::systemBus(); // 获取适配器接口 QDBusInterface adapterInterface("org.bluez", "/org/bluez/hci0", "org.bluez.Adapter1", bus); if (!adapterInterface.isValid()) { qDebug() << "无法获取适配器接口"; return -1; } // 启动BLE广告 QDBusMessage startAdvMsg = adapterInterface.call("StartAdvertising", "my_advertising"); if (startAdvMsg.type() == QDBusMessage::ErrorMessage) { qDebug() << "启动广告失败:" << startAdvMsg.errorMessage(); } else { qDebug() << "BLE广告已启动"; } // 创建GATT服务 QDBusInterface gattManager("org.bluez", "/org/bluez/hci0", "org.bluez.GattManager1", bus); if (!gattManager.isValid()) { qDebug() << "无法获取GattManager1接口"; return -1; } // 构建一个自定义GATT服务 QVariantMap serviceData; serviceData["UUID"] = "110A"; // 自定义UUID serviceData["Primary"] = true; QList<QVariant> args; args << "/org/bluez/hci0/my_service" << serviceData; QDBusMessage registerServiceMsg = gattManager.callWithArgumentList(QDBus::AutoDetect, "RegisterService", args); if (registerServiceMsg.type() == QDBusMessage::ErrorMessage) { qDebug() << "注册服务失败:" << registerServiceMsg.errorMessage(); } else { qDebug() << "GATT服务已注册"; } // 添加特征值(Characteristic) QDBusInterface characteristicManager("org.bluez", "/org/bluez/hci0/my_service", "org.bluez.GattService1", bus); if (!characteristicManager.isValid()) { qDebug() << "无法获取特征值管理接口"; return -1; } QVariantMap charData; charData["UUID"] = "220B"; charData["Value"] = QByteArray("Hello"); // 初始值 charData["Flags"] = QStringList() << "read" << "write"; args.clear(); args << "/org/bluez/hci0/my_service/char0" << charData; QDBusMessage registerCharMsg = characteristicManager.callWithArgumentList(QDBus::AutoDetect, "RegisterCharacteristic", args); if (registerCharMsg.type() == QDBusMessage::ErrorMessage) { qDebug() << "注册特征值失败:" << registerCharMsg.errorMessage(); } else { qDebug() << "特征值已注册,可读写"; } return app.exec(); } ``` ### 注意事项: - 需要root权限运行。 - 确保BlueZ版本5.48以上。 - 需要安装Qt DBus模块。 - `/org/bluez/hci0` 是默认的蓝牙适配器路径,如果有多个适配器请确认。 - UUID应为16位或128位格式(如 `0000110a-0000-1000-8000-00805f9b34fb`)。 ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值