Qt笔记---使用Qt开发低功耗蓝牙BLE(Bluetooth low energy)程序

这篇具有很好参考价值的文章主要介绍了Qt笔记---使用Qt开发低功耗蓝牙BLE(Bluetooth low energy)程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Qt笔记---使用Qt开发BLE(Bluetooth low energy)程序

在Qt项目中开发BLE通信程序,即低功耗蓝牙设备通信,关于蓝牙设备的通信分为普通蓝牙设备和低功耗蓝牙设备,此文只介绍低功耗蓝牙设备的连接通信方式。

开发环境:

系统:win10

Qt:5.15.2

MSVC:2019

qt ble,Qt,qt,笔记,开发语言

注:使用此版本之前使用过其他低版本的Qt和MSVC,会出现搜索不到设备以及一些各种其他的问题,最后使用此版本功能正常。

使用方法

1.在工程的pro文件中添加对蓝牙模块的支持

QT += bluetooth

qt ble,Qt,qt,笔记,开发语言

2.开始扫描发现设备

扫描BLE设备需要用到QBluetoothDeviceDiscoveryAgent类,通过start(QBluetoothDeviceDiscoveryAgent::LowEnergyMethod)函数发现低功耗设备。将扫描出的设备信息放到链表中。

BluetoothDeviceService.h

#include <QBluetoothLocalDevice>
#include <QBluetoothDeviceDiscoveryAgent>
#include <QLowEnergyController>

class BluetoothDeviceService : public QObject
{
    Q_OBJECT
public:
    explicit BluetoothDeviceService(QObject *parent = nullptr);

private slots:
    // 发现的BLE设备信息
    void onDeviceDiscovered(const QBluetoothDeviceInfo &deviceInfo);
    // 搜索设备时出错
    void onDeviceDiscoverError(QBluetoothDeviceDiscoveryAgent::Error error);

private:
    // 设备发现对象
    QBluetoothDeviceDiscoveryAgent *m_deviceDiscoveryAgent;
    // 保存发现的BLE设备信息
    QList<QBluetoothDeviceInfo> *m_deviceInfoList;
    // 保存服务的uuid
    QList<QBluetoothUuid> m_uuidList;
    // 蓝牙控制器
    QLowEnergyController *m_control;
    // 控制器连接计时器
    QTimer m_controlTimer;
    // 蓝牙服务
    QLowEnergyService *m_service;
    QList<QLowEnergyCharacteristic> m_charList;
    QLowEnergyCharacteristic m_character;
    QLowEnergyDescriptor m_descriptor;
};

BluetoothDeviceService.cpp

#include "BluetoothDeviceService.h"

BluetoothDeviceService::BluetoothDeviceService(QObject *parent)
    : QObject{parent},
    m_control(NULL),
    m_service(NULL)
{
    m_deviceDiscoveryAgent = new QBluetoothDeviceDiscoveryAgent(this);
    m_deviceInfoList = new QList<QBluetoothDeviceInfo>();
    // 设置搜索设备超时 20s
    m_deviceDiscoveryAgent->setLowEnergyDiscoveryTimeout(20000);

    connect(m_deviceDiscoveryAgent, &QBluetoothDeviceDiscoveryAgent::deviceDiscovered,
            this, &BluetoothDeviceService::onDeviceDiscovered);
    connect(m_deviceDiscoveryAgent, SIGNAL(error(QBluetoothDeviceDiscoveryAgent::Error)), this, SLOT(onDeviceDiscoverError(QBluetoothDeviceDiscoveryAgent::Error)));
    connect(&m_controlTimer, &QTimer::timeout, [this](){
        emit sigDebugLog(QString::fromLocal8Bit("蓝牙控制器连接设备超时!"));
        disconnectDevice();
    });
}

void BluetoothDeviceService::onDeviceDiscovered(const QBluetoothDeviceInfo &deviceInfo)
{
     if (deviceInfo.coreConfigurations() & QBluetoothDeviceInfo::LowEnergyCoreConfiguration)
    {
        // 添加对发现的BLE设备名称过滤,只保留需要名称的设备
        if (deviceInfo.name().contains(QString::fromLocal8Bit("过滤名称")))
        {
            emit sigDebugLog(QString::fromLocal8Bit("发现一个蓝牙设备:%1--地址:%2").arg(deviceInfo.name()).arg(deviceInfo.address().toString()));
            // 保存设备信息
            m_deviceInfoList->append(deviceInfo);
            emit sigDiscovered(deviceInfo);
        }
    }
}

void BluetoothDeviceService::disconnectDevice()
{
    if(m_controlTimer.isActive())
        m_controlTimer.stop();

    if(m_control) {
        m_control->disconnectFromDevice();
        delete m_control;
        m_control = NULL;
    }

    if(m_service){
        delete m_service;
        m_service = NULL;
    }
}

qt ble,Qt,qt,笔记,开发语言

3.连接指定的BLE设备

通过双击界面上的设备列表,将设备列表的索引传到设备信息链表中,创建对应的蓝牙控制器。

void BluetoothDeviceService::connectDevice(int iRow)
{
    // 只保存当前选中设备的服务uuid,删除其他
    m_uuidList.clear();
    
    //创建蓝牙控制器对象
    m_control = QLowEnergyController::createCentral(m_deviceInfoList->at(iRow));
    if (m_control == NULL) 
    {
        emit sigDebugLog(QString::fromLocal8Bit("创建蓝牙控制器失败!"));
    }
    else 
    {
        emit sigDebugLog(QString::fromLocal8Bit("创建蓝牙控制器成功!"));
    }

    connect(m_control, SIGNAL(connected()), this, SLOT(onControlConnected()));
        connect(m_control, SIGNAL(disconnected()), this, SLOT(onControlDisconnected()));
        connect(m_control, SIGNAL(serviceDiscovered(QBluetoothUuid)), this, SLOT(onServiceDiscovered(QBluetoothUuid)));
        connect(m_control, SIGNAL(discoveryFinished()), this, SLOT(onControlDiscoveryFinished()));
        connect(m_control, SIGNAL(error(QLowEnergyController::Error)), this, SLOT(onControlError(QLowEnergyController::Error)));
        // 开始计时控制器的连接超时
        m_controlTimer.start(10000);
        // 发起连接
        m_control->connectToDevice();
}
4.发现蓝牙服务

发现蓝牙服务要在蓝牙控制器连接成功后进行,在搜索服务之前做了1秒的延时处理。

void BluetoothDeviceService::onControlConnected()
{
    // 停止连接计时
    m_controlTimer.stop();
    emit sigDebugLog(QString::fromLocal8Bit("蓝牙控制器连接成功,开始搜索蓝牙服务!"));
    m_uuidList.clear();
    QThread::msleep(1000);
    //搜索服务
    m_control->discoverServices();
}
5.发现蓝牙服务后保存其服务uuid
void BluetoothDeviceService::onServiceDiscovered(const QBluetoothUuid &newService)
{
    emit sigDebugLog(QString::fromLocal8Bit("发现一个蓝牙服务-uuid:").append(newService.toString()));
    m_uuidList.append(newService);
}
6.创建蓝牙服务

在发现蓝牙服务结束后,延时创建蓝牙服务。蓝牙服务创建成功以后开始获取服务详情,也加了延时。

void BluetoothDeviceService::onControlDiscoveryFinished()
{
    emit sigDebugLog(QString::fromLocal8Bit("蓝牙服务搜索结束!"));
    QThread::msleep(1000);
    createService(0);
}


void BluetoothDeviceService::createService(int iRow)
{
    // 创建服务
    m_service = m_control->createServiceObject(m_uuidList.at(iRow),this);
    if (m_service == NULL)
    {
        emit sigDebugLog(QString::fromLocal8Bit("创建蓝牙服务失败!"));
    } else {
        emit sigDebugLog(QString::fromLocal8Bit("创建蓝牙服务成功!"));

        //监听服务状态变化
        connect(m_service,SIGNAL(stateChanged(QLowEnergyService::ServiceState))
                ,this,SLOT(onServiceStateChanged(QLowEnergyService::ServiceState)));
        //服务的characteristic变化,有数据传来
        connect(m_service,SIGNAL(characteristicChanged(QLowEnergyCharacteristic,QByteArray))
                ,this,SLOT(onServiceCharacteristicChanged(QLowEnergyCharacteristic,QByteArray)));
        //描述符成功被写
        connect(m_service,SIGNAL(descriptorWritten(QLowEnergyDescriptor,QByteArray))
                ,this,SLOT(onDescriptorWritten(QLowEnergyDescriptor,QByteArray)));
        //
        connect(m_service, SIGNAL(error(QLowEnergyService::ServiceError)), this, SLOT(onServiceError(QLowEnergyService::ServiceError)));


        QThread::msleep(1000);
        //服务详情发现函数
        m_service->discoverDetails();
    }
}
7.在发现蓝牙服务后,对每个特征进行处理,包括配置描述符和存储具有写入权限的特征。
void BluetoothDeviceService::onServiceStateChanged(QLowEnergyService::ServiceState newState)
{
    Q_UNUSED(newState);
    QLowEnergyCharacteristic bleCharacteristic;
    //发现服务
    if(m_service->state() == QLowEnergyService::ServiceDiscovered){
        m_charList = m_service->characteristics();
        for(int i=0; i<m_charList.size(); i++){
            bleCharacteristic = m_charList.at(i);
            if(bleCharacteristic.isValid()){
                m_descriptor = bleCharacteristic.descriptor(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
                if(m_descriptor.isValid()){
                    m_service->writeDescriptor(m_descriptor,QByteArray::fromHex("0100"));
                }

                if (bleCharacteristic.properties() & QLowEnergyCharacteristic::WriteNoResponse || bleCharacteristic.properties() & QLowEnergyCharacteristic::Write)
                {
                    m_character = bleCharacteristic;
                }
            }
        }
    }
}
8.接收数据
void BluetoothDeviceService::onServiceCharacteristicChanged(QLowEnergyCharacteristic characteristic, QByteArray newValue)
{
    Q_UNUSED(characteristic);

    int len = newValue.size();
    if(len > 0){
        emit sigDebugLog(QString("rec:").append(newValue.toHex()));
    }

}
9.发送数据
void BluetoothDeviceService::sendCmd(const QByteArray &data)
{
    if (m_service)
    {
        m_service->writeCharacteristic(m_character, data, QLowEnergyService::WriteWithResponse);
    }
}
10.总结

关于一些延时的处理,发现运行时会出现崩溃的问题,因此加入了一些延时。最后附上一张完整执行过程。

qt ble,Qt,qt,笔记,开发语言文章来源地址https://www.toymoban.com/news/detail-852957.html

到了这里,关于Qt笔记---使用Qt开发低功耗蓝牙BLE(Bluetooth low energy)程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 物联网开发笔记(53)- 使用Micropython开发ESP32开发板之蓝牙BLE通信

    一、目的         这一节我们学习如何使用我们的ESP32开发板通过蓝牙和手机进行通信。 二、环境         ESP32 + 手机(笔者用的小米10) + Thonny IDE 三、蓝牙介绍         这个知识大家自行百度吧,这里不再赘述什么是蓝牙和蓝牙的历史,以及相关的专业知识。 四、

    2024年02月06日
    浏览(43)
  • 低功耗蓝牙(BLE)你入门了吗

            蓝牙低功耗(Bluetooth Low Energy,或称Bluetooth LE、BLE,旧商标Bluetooth Smart),用于医疗保健、运动健身、安防、工业控制、家庭娱乐等领域。在如今的物联网时代下大放异彩,扮演者重要一环,是无线通信的主流技术之一(常见的无线通信技术有NFC、GPRS、Zigbee、Wi

    2024年02月02日
    浏览(33)
  • Qt开发简易蓝牙调试助手(低功耗蓝牙)

    Qt中是有蓝牙模块的,直接用此模块开发就行。但是注意使用的是低功耗蓝牙的类,连接方式和经典蓝牙会有区别 大致的连接步骤是: 搜索附近的蓝牙设备 连接指定的蓝牙设备 获取服务 指定服务进行连接(因为每一种下的特征对象的权限是不一样的,有的只有读取权限,没

    2024年02月16日
    浏览(28)
  • windows+python+bleak+BLE低功耗蓝牙通讯连接

    1.为什么选bleak   参考这篇知乎:https://zhuanlan.zhihu.com/p/577687336   windows端使用python连接常规的BLE设备(蓝牙4.0),仅考虑bleak模块(排除pybluez、pybluez2、pygatt)。 2.本文主要参考   本文主要参考bleak的官方文档:https://github.com/hbldh/bleak 3.本文所用设备   应事先学习蓝

    2024年02月02日
    浏览(29)
  • 深入浅出蓝牙低功耗音频BLE Audio--4-3 CIS

            为了掌握核心规范中ISO新特性,先介绍单播且可连接的ISO流,即CIS,CIS的结构框架相当复杂,但是其建立在一些非常的原则之上。本节首先描述CIS如何被设计,解释组成模块如何配合工作,然后学习广播模式的不同之处,为学习蓝牙低功耗音频方案奠定基础。  

    2023年04月14日
    浏览(34)
  • 深入浅出蓝牙低功耗音频BLE Audio --4-2 ISO流和角色

    核心规范V5.2中增加ISO流特性是低功耗蓝牙协议中一个全新的概念。熟悉A2DP和HFP协议的读者都知道其拓扑结构局限不灵活。HFP具有双向一对一的链路,典型场景是电话和耳机或免提设备之间。A2DP是一个更简单的单播链路,定义Source设备产生音频数据,Sink设备通常是耳机,扬声

    2023年04月11日
    浏览(51)
  • Android Studio制作手机App:通过手机蓝牙(Bluetooth)与STM32上的低功耗蓝牙(HC-42)连接通信,实现手机端对单片机的控制。

    背景: 本文的内容是针对单片机蓝牙模块(HC-42)开发的手机App。在这之前,我想先声明一点,手机与手机间的蓝牙连接方式”与“手机与HC间的蓝牙连接方式”是不一样的。原因就是手机搭配的是“经典蓝牙”模块,HC等蓝牙属于“低功耗蓝牙”模块。(二者的区别想了解的

    2024年02月04日
    浏览(33)
  • 【STM32备忘录】【STM32WB系列的BLE低功耗蓝牙】一、测试广播配置搜不到信号的注意事项

    WB系列是双核单片机,用户写M4,无线协议栈使用M0 新买到手的单片机,需要自己刷入使用的无线协议栈 刷入无线协议栈的途径是通过一个叫FUS的东东,类似于bootloader,这个FUS新买的芯片通常已经刷好,但版本不一定是最新的(如果没有需要自己刷入) 刷入FUS和无线协议栈需要

    2024年03月16日
    浏览(42)
  • 【Bluetooth蓝牙开发】一、开篇词 | 打造全网最详细的Bluetooth开发教程

    我的圈子: 高级工程师聚集地 我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强企业! 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 大家好,我是董哥! 随着物联网技术的快速发展, WiFi 、蓝牙成了物联网通信主

    2024年01月18日
    浏览(22)
  • 【Android开发基础】蓝牙信息的获取(Bluetooth)

    描述:蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接。蓝牙使当前的一些便携移动设备和计算机设备能够不需要电缆就能连接到互联网,并且可以无线接入互联网。

    2024年02月09日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包