欢迎入群共同学习交流
时间记录:2024/1/22
一、注意点
(1)pro文件中引入bluetooth模块
(2)安卓端运行时需要同步打开定位功能才能扫描到蓝牙设备
(3)mingw套件不能在Windows上运行,需要使用MSVC套件编译才能在Windows上运行
二、使用步骤
(1)设备蓝牙操作类QBluetoothLocalDevice
2.1.1 hostMode方法获取蓝牙打开状态
2.1.2 powerOn方法打开蓝牙
2.1.3 setHostMode方法关闭蓝牙
(2)蓝牙设备搜索类QBluetoothDeviceDiscoveryAgent
2.2.1 setLowEnergyDiscoveryTimeout方法设置扫描超时时间,如果设置为0,则一直进行扫描
2.2.2 为QBluetoothDeviceDiscoveryAgent对象的deviceDiscovered信号绑定槽,每发现一台蓝牙设备便会触发一次此信号,携带参数QBluetoothDeviceInfo,每台蓝牙设备的信息类
2.2.3 使用start方法,开始搜索蓝牙设备,参数可以传递QBluetoothDeviceDiscoveryAgent::LowEnergyMethod表示搜索低功耗蓝牙设备
(3)低功耗蓝牙控制器类QLowEnergyController
2.3.1 使用静态方法createCentral创建蓝牙控制器对象,参数为QBluetoothDeviceInfo对象
2.3.2 为serviceDiscovered信号绑定槽,每发现一个服务触发一次此信号,携带参数QBluetoothUuid
2.3.3 为connected信号绑定槽,用于判断是否已成功连接到蓝牙
2.3.4 使用connectToDevice方法连接蓝牙
2.3.5 使用disconnectFromDevice方法来断开连接
2.3.6 连接成功后调用discoverServices方法获取连接蓝牙下的所有服务
(4)低功耗蓝牙服务类QLowEnergyService
2.4.1 使用QLowEnergyController对象的createServiceObject方法创建QLowEnergyService对象
2.4.2 为stateChanged信号绑定槽,监听服务状态
2.4.3 为characteristicChanged信号绑定槽,收到信息时会触发此信号,信息为携带的参数newValue
2.4.4 为descriptorWritten信号绑定槽,监听描述符是否成功写入
2.4.5 使用discoverDetails方法获取服务详情
2.4.6 服务状态改变以后写入描述符激活notify,否则无法收到消息,使用characteristics方法获取服务下所有的特征对象
(5)低功耗蓝牙特征值类QLowEnergyCharacteristic
2.5.1 遍历特征值对象列表,使用isValid方法判断是否可用
2.5.2 使用descriptor方法创建描述符对象,参数传递QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration,表示描述符类型由客户端特征值自行配置
(6)低功耗蓝牙描述符对象QLowEnergyDescriptor
2.6.1 使用isValid方法判断描述符对象是否有效
2.6.2 使用QLowEnergyService类的writeDescriptor方法向蓝牙写入描述符,激活notify,参数第一个为描述符对象,第二个为QByteArray::fromHex(“0100”)
(7)使用QLowEnergyService类的writeCharacteristic方法写入数据
三、参考代码
(1)头文件
#ifndef MWIDGET_H
#define MWIDGET_H
#include <QWidget>
#include <QBluetoothDeviceDiscoveryAgent> //蓝牙设备搜索对象
#include <QBluetoothLocalDevice> //本机蓝牙操作
#include <QBluetoothDeviceInfo>
#include <QList>
#include <QListWidgetItem>
#include <QLowEnergyController> //蓝牙控制器对象
#include <QBluetoothUuid>
#include <QLowEnergyService>
#include <QLowEnergyCharacteristic>
#include <QByteArray>
//static const QLatin1String serviceUUID("0000FFF0-0000-1000-8000-00805F9B34FB");
//static const QLatin1String readUUID("0000FFF1-0000-1000-8000-00805F9B34FB");
//static const QLatin1String writeUUID("0000FFF2-0000-1000-8000-00805F9B34FB");
QT_BEGIN_NAMESPACE
namespace Ui {
class MWidget; }
QT_END_NAMESPACE
class MWidget : public QWidget
{
Q_OBJECT
public:
MWidget(QWidget *parent = nullptr);
~MWidget();
private:
Ui::MWidget *ui;
QBluetoothDeviceDiscoveryAgent *deviceDiscoveryAgent;
QBluetoothLocalDevice *localDevice;
QList<QBluetoothDeviceInfo> *deviceInfoList;
QList<QBluetoothUuid> uuidList;
QLowEnergyController *control;
QLowEnergyService *mService;
QLowEnergyCharacteristic mCharacter;
QList<QLowEnergyCharacteristic> charList;
private slots:
void mDeviceDiscovered(QBluetoothDeviceInfo deviceInfo);
void on_openLocalDeviceBtn_clicked();
void on_closeLocalDeviceBtn_clic