当前位置: 首页 > news >正文

蓝牙部分解析和代码建构

在这里插入图片描述
QT6.9版本,msvc2022编译器。BLE低功耗蓝牙通信扫描、连接、通信功能。

蓝牙mainwindow.cpp代码注释与架构分析

添加注释后的代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStatusBar>
#include <QScrollBar>
#include <QListWidgetItem> // 可选,如果需要操作列表项// 主窗口构造函数
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{// 初始化UIui->setupUi(this);// 创建BLE接口实例m_bleInterface = new BLEInterface(this);// 连接数据接收信号到处理槽函数connect(m_bleInterface, &BLEInterface::dataReceived,this, &MainWindow::dataReceived);// 连接设备列表变化信号到Lambda表达式处理connect(m_bleInterface, &BLEInterface::devicesNamesChanged,[this] (QStringList devices){ui->devicesListWidget->clear(); // 清空设备列表ui->devicesListWidget->addItems(devices); // 添加新设备列表ui->connectButton->setEnabled(!devices.isEmpty()); // 根据列表是否为空启用/禁用连接按钮});// 连接服务列表变化信号到Lambda表达式处理connect(m_bleInterface, &BLEInterface::servicesChanged,[this] (QStringList services){ui->servicesComboBox->clear(); // 清空服务下拉框ui->servicesComboBox->addItems(services); // 添加新服务列表});// 连接状态信息变化信号到Lambda表达式处理connect(m_bleInterface, &BLEInterface::statusInfoChanged,[this](QString info, bool isActive){this->statusBar()->showMessage(info); // 在状态栏显示信息// 根据设备列表和激活状态设置按钮可用性ui->connectButton->setEnabled(ui->devicesListWidget->count() > 0 && !isActive);ui->bleScanButton->setEnabled(!isActive);});// 连接连接状态变化信号到Lambda表达式处理connect(m_bleInterface, &BLEInterface::connectionStateChanged,[this](bool connected) {if (connected) {ui->connectButton->setText("Disconnect"); // 连接时显示"断开连接"ui->sendButton->setEnabled(true); // 启用发送按钮} else {ui->connectButton->setText("Connect"); // 断开时显示"连接"ui->sendButton->setEnabled(false); // 禁用发送按钮}});// 连接设备列表当前项变化信号到Lambda表达式处理connect(ui->devicesListWidget, &QListWidget::currentRowChanged,[this](int index) {ui->connectButton->setEnabled(index >= 0); // 有选中项时启用连接按钮});// 如果存在清除按钮,连接其点击信号if (ui->clearButton) {connect(ui->clearButton, &QPushButton::clicked, [this]() {ui->receivedTextEdit->clear(); // 清除接收文本框内容});}// 开始扫描设备m_bleInterface->scanDevices();// 初始状态禁用连接和发送按钮ui->connectButton->setEnabled(false);ui->sendButton->setEnabled(false);
}// 主窗口析构函数
MainWindow::~MainWindow()
{delete ui; // 释放UI资源
}// BLE扫描按钮点击槽函数
void MainWindow::on_bleScanButton_clicked()
{m_bleInterface->scanDevices(); // 调用扫描设备方法
}// 连接/断开连接按钮点击槽函数
void MainWindow::on_connectButton_clicked()
{if (m_bleInterface->isConnected()) {m_bleInterface->disconnectDevice(); // 如果已连接,则断开} else {// 获取当前选中的行索引并设置当前设备m_bleInterface->set_currentDevice(ui->devicesListWidget->currentRow());m_bleInterface->connectCurrentDevice(); // 连接当前设备}
}// 发送按钮点击槽函数
void MainWindow::on_sendButton_clicked()
{QByteArray data;// 根据选择的编码格式处理发送数据if(ui->asciiRadioButton->isChecked())data =  QByteArray(ui->sendTextEdit->toPlainText().toLatin1()); // ASCII编码elsedata = QByteArray::fromHex(ui->sendTextEdit->toPlainText().toLatin1()); // 十六进制编码m_bleInterface->write(data); // 写入数据ui->sendTextEdit->clear(); // 清空发送文本框
}// 数据接收处理槽函数
void MainWindow::dataReceived(QByteArray data)
{QScrollBar *scrollBar = ui->receivedTextEdit->verticalScrollBar();bool atBottom = scrollBar->value() == scrollBar->maximum(); // 检查是否在底部// 根据选择的编码格式显示接收数据if(ui->asciiRadioButton->isChecked()){QString text = QString::fromLatin1(data); // ASCII解码ui->receivedTextEdit->insertPlainText(text);}else{ui->receivedTextEdit->insertPlainText(data.toHex(' ') + " "); // 十六进制显示}// 如果之前已经在底部,保持滚动条在底部if (atBottom) {scrollBar->setValue(scrollBar->maximum());}
}// 服务下拉框选择变化槽函数
void MainWindow::on_servicesComboBox_currentIndexChanged(int index)
{m_bleInterface->setCurrentService(index); // 设置当前服务
}

代码架构与逻辑梳理

1. 整体架构

这是一个基于Qt的BLE(蓝牙低功耗)客户端应用程序,采用MVC模式设计:

  • Model层: BLEInterface类处理所有BLE通信逻辑
  • View层: MainWindow和对应的UI文件提供用户界面
  • Controller层: MainWindow作为控制器,协调View和Model之间的交互

2. 主要组件及功能

2.1 核心类
  • MainWindow: 主窗口类,负责UI管理和用户交互
  • BLEInterface: BLE通信接口类,封装了蓝牙操作(在头文件中声明)
2.2 UI组件
  • devicesListWidget: 显示发现的BLE设备列表
  • servicesComboBox: 显示连接设备的服务列表
  • connectButton: 连接/断开连接按钮
  • bleScanButton: 扫描设备按钮
  • sendButton: 发送数据按钮
  • sendTextEdit: 发送数据输入框
  • receivedTextEdit: 接收数据显示框
  • asciiRadioButton: ASCII编码选择按钮
  • clearButton: 清除接收数据按钮

3. 工作流程

  1. 初始化: 创建BLE接口,连接信号与槽,开始设备扫描
  2. 设备发现: 扫描并显示可用BLE设备
  3. 设备连接: 选择设备并建立连接,获取服务列表
  4. 数据通信: 选择服务后,可以发送和接收数据
  5. 连接管理: 可以断开连接或重新扫描设备

4. 主要接口/函数

4.1 BLEInterface类的主要接口(通过信号槽调用)
// 信号
void dataReceived(QByteArray data);          // 数据接收信号
void devicesNamesChanged(QStringList devices); // 设备列表变化信号
void servicesChanged(QStringList services);  // 服务列表变化信号
void statusInfoChanged(QString info, bool isActive); // 状态信息变化信号
void connectionStateChanged(bool connected); // 连接状态变化信号// 槽函数(通过MainWindow调用)
void scanDevices();                          // 扫描设备
void set_currentDevice(int index);           // 设置当前设备
void connectCurrentDevice();                 // 连接当前设备
void disconnectDevice();                     // 断开设备连接
void write(QByteArray data);                 // 写入数据
void setCurrentService(int index);           // 设置当前服务
bool isConnected();                          // 检查连接状态
4.2 MainWindow类的主要槽函数
void on_bleScanButton_clicked();             // 处理扫描按钮点击
void on_connectButton_clicked();             // 处理连接按钮点击
void on_sendButton_clicked();                // 处理发送按钮点击
void dataReceived(QByteArray data);          // 处理接收数据
void on_servicesComboBox_currentIndexChanged(int index); // 处理服务选择变化

5. 数据流

  1. 用户点击扫描按钮 → 调用m_bleInterface->scanDevices()
  2. BLE接口发现设备 → 发射devicesNamesChanged信号
  3. 主窗口更新设备列表UI
  4. 用户选择设备并点击连接 → 调用m_bleInterface->connectCurrentDevice()
  5. 连接成功后 → 发射servicesChanged信号
  6. 主窗口更新服务下拉框
  7. 用户选择服务并发送数据 → 调用m_bleInterface->write()
  8. 接收到数据 → 发射dataReceived信号
  9. 主窗口在接收文本框中显示数据

6. 编码支持

应用程序支持两种数据编码格式:

  • ASCII: 直接显示文本数据
  • 十六进制: 以十六进制格式显示数据,字节间用空格分隔

这个架构具有良好的模块化设计,BLE通信逻辑与UI表现分离,便于维护和扩展。

bleinterface.cpp代码注释与架构分析

添加注释后的代码

#include "bleinterface.h"
#include <QDebug>
#include <QEventLoop>
#include <QtBluetooth/QLowEnergyCharacteristic>
#include <QBluetoothUuid>
#include <QThread>// DeviceInfo类构造函数,初始化设备信息
DeviceInfo::DeviceInfo(const QBluetoothDeviceInfo &info):QObject(), m_device(info)
{
}// 获取设备信息
QBluetoothDeviceInfo DeviceInfo::getDevice() const
{return m_device;
}// 获取设备地址,不同平台使用不同方法
QString DeviceInfo::getAddress() const
{
#ifdef Q_OS_MAC// macOS使用设备UUIDreturn m_device.deviceUuid().toString();
#else// 其他平台使用设备地址return m_device.address().toString();
#endif
}// 设置设备信息并发出变化信号
void DeviceInfo::setDevice(const QBluetoothDeviceInfo &device)
{m_device = device;emit deviceChanged();
}// BLEInterface类构造函数,初始化BLE接口
BLEInterface::BLEInterface(QObject *parent) : QObject(parent),m_currentDevice(0),          // 当前设备索引m_control(0),               // 低能耗控制器m_service(0),               // 当前服务m_readTimer(0),             // 读取定时器m_connected(false),         // 连接状态m_currentService(0)         // 当前服务索引
{// 创建设备发现代理m_deviceDiscoveryAgent = new QBluetoothDeviceDiscoveryAgent(this);// 连接设备发现信号connect(m_deviceDiscoveryAgent, &QBluetoothDeviceDiscoveryAgent::deviceDiscovered,this, &BLEInterface::addDevice);// 连接设备扫描错误信号connect(m_deviceDiscoveryAgent, QOverload<QBluetoothDeviceDiscoveryAgent::Error>::of(&QBluetoothDeviceDiscoveryAgent::errorOccurred),this, &BLEInterface::onDeviceScanError);// 连接扫描完成信号connect(m_deviceDiscoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished,this, &BLEInterface::onScanFinished);
}// BLEInterface类析构函数
BLEInterface::~BLEInterface()
{// 清理设备列表qDeleteAll(m_devices);m_devices.clear();
}// 扫描BLE设备
void BLEInterface::scanDevices()
{// 清空设备列表m_devicesNames.clear();qDeleteAll(m_devices);m_devices.clear();emit devicesNamesChanged(m_devicesNames);// 开始扫描m_deviceDiscoveryAgent->start();emit statusInfoChanged("Scanning for devices...", true);
}// 读取特征值
void BLEInterface::read()
{if(m_service && m_readCharacteristic.isValid()){// 读取特征值m_service->readCharacteristic(m_readCharacteristic);qDebug() << "3333@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<<m_readCharacteristic.uuid().toString() ;//lm}
}// 等待写入完成
void BLEInterface::waitForWrite()
{QEventLoop loop;// 连接特征值写入完成信号connect(m_service, &QLowEnergyService::characteristicWritten,&loop, &QEventLoop::quit);loop.exec(); // 进入事件循环等待
}// 写入数据到特征值
void BLEInterface::write(const QByteArray &data)
{qDebug() << "BLEInterface::write: " << data;if(m_service && m_writeCharacteristic.isValid()){// 处理大数据分片发送if(data.length() > CHUNK_SIZE){int sentBytes = 0;while (sentBytes < data.length()) {QByteArray chunk = data.mid(sentBytes, CHUNK_SIZE);m_service->writeCharacteristic(m_writeCharacteristic, chunk, m_writeMode);sentBytes += CHUNK_SIZE;// 如果需要响应,等待写入完成if(m_writeMode == QLowEnergyService::WriteWithResponse){waitForWrite();if(m_service->error() != QLowEnergyService::NoError) {qWarning() << "Write error:" << m_service->error();return;}}QThread::msleep(10); // 短暂延迟}}else {// 直接发送小数据m_service->writeCharacteristic(m_writeCharacteristic, data, m_writeMode);if(m_writeMode == QLowEnergyService::WriteWithResponse){waitForWrite();if(m_service->error() != QLowEnergyService::NoError) {qWarning() << "Write error:" << m_service->error();}}}} else {qWarning() << "Cannot write: service or write characteristic not available";}
}// 添加发现的设备到列表
void BLEInterface::addDevice(const QBluetoothDeviceInfo &device)
{// 只处理低能耗设备if (device.coreConfigurations() & QBluetoothDeviceInfo::LowEnergyCoreConfiguration) {// 获取设备名称 lmlmQString deviceName = device.name();// 过滤无效设备名称if (deviceName.isEmpty() || deviceName.startsWith("Bluetooth", Qt::CaseInsensitive)) {return;}qWarning() << "Discovered LE Device name: " << device.name() << " Address: "<< device.address().toString();m_devicesNames.append(device.name());DeviceInfo *dev = new DeviceInfo(device);m_devices.append(dev);emit devicesNamesChanged(m_devicesNames);emit statusInfoChanged("Low Energy device found. Scanning for more...", true);}
}// 扫描完成处理
void BLEInterface::onScanFinished()
{if (m_devicesNames.size() == 0)emit statusInfoChanged("No Low Energy devices found", false);elseemit statusInfoChanged("Scan finished.", false);
}// 设备扫描错误处理
void BLEInterface::onDeviceScanError(QBluetoothDeviceDiscoveryAgent::Error error)
{if (error == QBluetoothDeviceDiscoveryAgent::PoweredOffError)emit statusInfoChanged("The Bluetooth adaptor is powered off, power it on before doing discovery.", false);else if (error == QBluetoothDeviceDiscoveryAgent::InputOutputError)emit statusInfoChanged("Writing or reading from the device resulted in an error.", false);elseemit statusInfoChanged("An unknown error has occurred.", false);
}// 连接当前选中的设备
void BLEInterface::connectCurrentDevice()
{if(m_devices.isEmpty())return;// 清理现有连接if (m_control) {m_control->disconnectFromDevice();delete m_control;m_control = 0;}// 创建中央设备控制器m_control = QLowEnergyController::createCentral(m_devices[m_currentDevice]->getDevice(), this);// 连接控制器信号connect(m_control, &QLowEnergyController::serviceDiscovered,this, &BLEInterface::onServiceDiscovered);connect(m_control, &QLowEnergyController::discoveryFinished,this, &BLEInterface::onServiceScanDone);connect(m_control, QOverload<QLowEnergyController::Error>::of(&QLowEnergyController::errorOccurred),this, &BLEInterface::onControllerError);connect(m_control, &QLowEnergyController::connected,this, &BLEInterface::onDeviceConnected);connect(m_control, &QLowEnergyController::disconnected,this, &BLEInterface::onDeviceDisconnected);// 连接到设备m_control->connectToDevice();
}// 设备连接成功处理
void BLEInterface::onDeviceConnected()
{// 清空服务列表m_servicesUuid.clear();m_services.clear();setCurrentService(-1);emit servicesChanged(m_services);// 发现服务m_control->discoverServices();
}// 设备断开连接处理
void BLEInterface::onDeviceDisconnected()
{update_connected(false);emit statusInfoChanged("Service disconnected", false);qWarning() << "Remote device disconnected";
}// 服务发现处理
void BLEInterface::onServiceDiscovered(const QBluetoothUuid &gatt)
{Q_UNUSED(gatt)emit statusInfoChanged("Service discovered. Waiting for service scan to be done...", true);
}// 服务扫描完成处理
void BLEInterface::onServiceScanDone()
{// 获取所有服务UUIDm_servicesUuid = m_control->services();if(m_servicesUuid.isEmpty())emit statusInfoChanged("Can't find any services.", true);else{// 转换UUID为字符串列表m_services.clear();foreach (auto uuid, m_servicesUuid)m_services.append(uuid.toString());emit servicesChanged(m_services);m_currentService = -1;setCurrentService(0); // 默认选择第一个服务emit statusInfoChanged("All services discovered.", true);}
}// 断开设备连接
void BLEInterface::disconnectDevice()
{// 停止读取定时器if (m_readTimer) {m_readTimer->stop();m_readTimer->deleteLater();m_readTimer = NULL;}if (m_devices.isEmpty()) {return;}// 禁用通知if (m_notificationDesc.isValid() && m_service) {m_service->writeDescriptor(m_notificationDesc, QByteArray::fromHex("0000"));} else {// 断开连接if (m_control) {m_control->disconnectFromDevice();}delete m_service;m_service = 0;}update_connected(false);
}// 控制器错误处理
void BLEInterface::onControllerError(QLowEnergyController::Error error)
{emit statusInfoChanged("Cannot connect to remote device.", false);qWarning() << "Controller Error:" << error;
}// 特征值变化处理(通知回调)
void BLEInterface::onCharacteristicChanged(const QLowEnergyCharacteristic &c, const QByteArray &value)
{Q_UNUSED(c)qDebug() << "Characteristic Changed: " << value;emit dataReceived(value); // 发出数据接收信号
}// 特征值写入完成处理
void BLEInterface::onCharacteristicWrite(const QLowEnergyCharacteristic &c, const QByteArray &value)
{Q_UNUSED(c)qDebug() << "Characteristic Written: " << value;
}// 更新当前服务
void BLEInterface::update_currentService(int indx)
{// 清理现有服务delete m_service;m_service = 0;// 创建新服务对象if (indx >= 0 && m_servicesUuid.count() > indx) {m_service = m_control->createServiceObject(m_servicesUuid.at(indx), this);}if (!m_service) {emit statusInfoChanged("Service not found.", false);return;}// 连接服务信号connect(m_service, &QLowEnergyService::stateChanged,this, &BLEInterface::onServiceStateChanged);connect(m_service, &QLowEnergyService::characteristicChanged,this, &BLEInterface::onCharacteristicChanged);connect(m_service, &QLowEnergyService::characteristicRead,this, &BLEInterface::onCharacteristicRead);connect(m_service, &QLowEnergyService::characteristicWritten,this, &BLEInterface::onCharacteristicWrite);connect(m_service, QOverload<QLowEnergyService::ServiceError>::of(&QLowEnergyService::errorOccurred),this, &BLEInterface::serviceError);// 发现服务详情if(m_service->state() == QLowEnergyService::RemoteService) {emit statusInfoChanged("Connecting to service...", true);m_service->discoverDetails();}else {searchCharacteristic();}
}// 特征值读取完成处理
void BLEInterface::onCharacteristicRead(const QLowEnergyCharacteristic &c, const QByteArray &value)
{Q_UNUSED(c)qDebug() << "Characteristic Read: " << value;emit dataReceived(value); // 发出数据接收信号
}// 搜索特征值
void BLEInterface::searchCharacteristic()
{if(m_service){m_writeCharacteristic = QLowEnergyCharacteristic();m_readCharacteristic = QLowEnergyCharacteristic();// 遍历所有特征值foreach (QLowEnergyCharacteristic c, m_service->characteristics()) {if(c.isValid()){qDebug() << "Characteristic UUID:" << c.uuid().toString();qDebug() << "Characteristic properties:" << c.properties();// 查找写入特征值if (c.properties() & QLowEnergyCharacteristic::WriteNoResponse ||c.properties() & QLowEnergyCharacteristic::Write) {if (!m_writeCharacteristic.isValid()) {m_writeCharacteristic = c;// 确定写入模式if(c.properties() & QLowEnergyCharacteristic::WriteNoResponse){m_writeMode = QLowEnergyService::WriteWithoutResponse;}elsem_writeMode = QLowEnergyService::WriteWithResponse;qDebug() << "Write characteristic found:" << c.uuid().toString();}}// 查找读取特征值if (c.properties() & QLowEnergyCharacteristic::Read) {if (!m_readCharacteristic.isValid()) {m_readCharacteristic = c;// 创建读取定时器if(!m_readTimer){m_readTimer = new QTimer(this);connect(m_readTimer, &QTimer::timeout, this, &BLEInterface::read);
#if BLE_READ_SUPPORTm_readTimer->start(READ_INTERVAL_MS);
#endif}qDebug() << "Read characteristic found:" << c.uuid().toString();// 立即读取一次m_service->readCharacteristic(m_readCharacteristic);}}// 查找通知特征值并启用通知if (c.properties() & QLowEnergyCharacteristic::Notify) {m_notificationDesc = c.descriptor(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);if (m_notificationDesc.isValid()) {m_service->writeDescriptor(m_notificationDesc, QByteArray::fromHex("0100"));qDebug() << ")))))))))))))Notification enabled for characteristic:" << c.uuid().toString();}}}}// 更新连接状态if (m_readCharacteristic.isValid()) {update_connected(true);qDebug() << "Connected with read characteristics";} else if (m_writeCharacteristic.isValid()) {update_connected(true);qDebug() << "Connected with write characteristics";} else {qDebug() << "No read or write characteristics found";}}
}// 服务状态变化处理
void BLEInterface::onServiceStateChanged(QLowEnergyService::ServiceState s)
{qDebug() << "serviceStateChanged, state: " << s;switch (s) {case QLowEnergyService::RemoteServiceDiscovering:emit statusInfoChanged("Discovering services...", true);break;case QLowEnergyService::RemoteServiceDiscovered:emit statusInfoChanged("Service discovered.", true);searchCharacteristic(); // 搜索特征值break;default:break;}
}// 服务错误处理
void BLEInterface::serviceError(QLowEnergyService::ServiceError e)
{QString errorStr;switch (e) {case QLowEnergyService::NoError:errorStr = "No error";break;case QLowEnergyService::OperationError:errorStr = "Operation error";break;case QLowEnergyService::CharacteristicWriteError:errorStr = "Characteristic write error";break;case QLowEnergyService::DescriptorWriteError:errorStr = "Descriptor write error";break;default:errorStr = "Unknown error";break;}qWarning() << "Service error:" << errorStr;emit statusInfoChanged("Service error: " + errorStr, false);
}// 设置当前服务
void BLEInterface::setCurrentService(int index)
{if (index == m_currentService)return;m_currentService = index;update_currentService(index);
}

代码架构与逻辑梳理

1. 整体架构

这是一个基于Qt的BLE(蓝牙低功耗)接口实现,提供了完整的BLE设备发现、连接、服务和特征值操作功能。代码采用面向对象设计,主要分为两个类:

  • DeviceInfo类: 封装蓝牙设备信息,提供设备数据的访问接口
  • BLEInterface类: 核心BLE功能实现,处理所有BLE通信逻辑

2. 主要组件及功能

2.1 DeviceInfo类
  • 作用: 包装QBluetoothDeviceInfo,提供跨平台的设备地址获取方法
  • 主要方法:
    • getDevice(): 获取设备信息
    • getAddress(): 获取设备地址(跨平台)
    • setDevice(): 设置设备信息并发出变化信号
2.2 BLEInterface类
  • 作用: 实现所有BLE相关功能,作为MainWindow和底层BLE栈之间的桥梁
  • 核心功能:
    • 设备扫描与发现
    • 设备连接与管理
    • 服务与特征值发现
    • 数据读写操作
    • 通知/指示处理

3. 工作流程

  1. 设备扫描: 调用scanDevices()启动设备发现,通过addDevice()添加发现的设备
  2. 设备连接: 调用connectCurrentDevice()连接选中的设备
  3. 服务发现: 连接成功后自动发现服务,通过onServiceScanDone()处理发现结果
  4. 特征值发现: 选择服务后自动发现特征值,通过searchCharacteristic()处理
  5. 数据通信: 使用write()发送数据,通过通知或读取接收数据
  6. 连接管理: 使用disconnectDevice()断开连接

4. 主要接口/函数

4.1 公共接口
void scanDevices();                      // 扫描BLE设备
void connectCurrentDevice();             // 连接当前选中的设备
void disconnectDevice();                 // 断开设备连接
void write(const QByteArray &data);      // 写入数据到特征值
void setCurrentService(int index);       // 设置当前服务
4.2 信号
void dataReceived(QByteArray data);              // 数据接收信号
void devicesNamesChanged(QStringList devices);   // 设备列表变化信号
void servicesChanged(QStringList services);      // 服务列表变化信号
void statusInfoChanged(QString info, bool isActive); // 状态信息变化信号
void connectionStateChanged(bool connected);     // 连接状态变化信号
4.3 内部处理函数
void addDevice(const QBluetoothDeviceInfo &device);  // 添加发现的设备
void onDeviceConnected();                            // 设备连接成功处理
void onServiceScanDone();                            // 服务扫描完成处理
void searchCharacteristic();                         // 搜索特征值
void onCharacteristicChanged(...);                   // 特征值变化处理(通知)
void onCharacteristicRead(...);                      // 特征值读取完成处理

5. 数据流

  1. 设备发现: scanDevices()addDevice()devicesNamesChanged信号
  2. 设备连接: connectCurrentDevice()onDeviceConnected() → 服务发现
  3. 服务发现: 服务发现完成 → onServiceScanDone()servicesChanged信号
  4. 特征值发现: 服务详情发现完成 → searchCharacteristic() → 确定读写特征值
  5. 数据发送: write() → 特征值写入 → 等待完成(如果需要响应)
  6. 数据接收: 通过通知或定期读取 → onCharacteristicChanged()onCharacteristicRead()dataReceived信号

6. 特性与优化

  1. 大数据分片: 支持大数据分片发送,避免超过MTU限制
  2. 多种写入模式: 支持带响应和不带响应两种写入模式
  3. 多种读取方式: 支持定期读取和通知两种数据接收方式
  4. 跨平台支持: 处理不同平台的设备地址获取差异
  5. 错误处理: 完善的错误处理和状态通知机制
  6. 资源管理: 正确的资源释放和连接管理

这个BLE接口实现提供了完整的功能封装,使上层应用可以专注于UI和业务逻辑,而不需要直接处理复杂的BLE协议细节。

我用夸克网盘给你分享了「Qt-BLE-0822new」,点击链接或复制整段内容,打开「夸克APP」即可获取。
/582237vUfA😕
链接:https://pan.quark.cn/s/f74c8540853a?pwd=qDVy
提取码:qDVy

http://www.xdnf.cn/news/1346653.html

相关文章:

  • set_disable_timing应用举例
  • OpenCV 图像边缘检测
  • 从“配置化思维”到“前端效率革命”:xiangjsoncraft 如何用 JSON 简化页面开发?
  • k8s 简介及部署方法以及各方面应用
  • 子类(派生类)使用父类(基类)的成员
  • 快速了解神经网络
  • AI赋能体育训练突破:AI动作捕捉矫正精准、战术分析系统提效率,运动员破瓶颈新路径
  • 数据结构之深入探索归并排序
  • go 常见面试题
  • NLP学习之Transformer(2)
  • 网络编程6(JVM)
  • 保护 PDF 格式:禁止转换为其他格式文件
  • html基本元素
  • C#_接口设计:角色与契约的分离
  • HTML5详篇
  • 自定义单线通信协议解析
  • Yapi中通过MongoDB修改管理员密码与新增管理员
  • 【Java后端】 Spring Boot 集成 Redis 全攻略
  • 软件设计师——计算机网络学习笔记
  • 华为网路设备学习-29(BGP协议 四)路由策略-实验
  • 分段渲染加载页面
  • 【LeetCode 热题 100】139. 单词拆分——(解法一)记忆化搜索
  • 浏览器开发CEFSharp+X86+win7(十三)之Vue架构自动化——仙盟创梦IDE
  • STM32F1 EXTI介绍及应用
  • 光耦合器:电子世界的 “光桥梁“
  • ZYNQ启动流程——ZYNQ学习笔记11
  • X00238-非GNSS无人机RGB图像卫星图像视觉定位python
  • 25年8月通信基础知识补充1:中断概率与遍历容量、Sionna通信系统开源库、各种时延区分
  • Android 16环境开发的一些记录
  • Prometheus+Grafana监控redis