Qt开发简易蓝牙调试助手(低功耗蓝牙)

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

概述

Qt中是有蓝牙模块的,直接用此模块开发就行。但是注意使用的是低功耗蓝牙的类,连接方式和经典蓝牙会有区别

大致的连接步骤是:

  1. 搜索附近的蓝牙设备
  2. 连接指定的蓝牙设备
  3. 获取服务
  4. 指定服务进行连接(因为每一种下的特征对象的权限是不一样的,有的只有读取权限,没有写权限,有的则相反,必要时可以直接打印一下查看)
  5. 获取服务下可用的特征对象
  6. 监听特征对象的消息变化和向特征对象发送消息

界面设计

qt 蓝牙,Qt学习,qt,单片机,开发语言

qt 蓝牙,Qt学习,qt,单片机,开发语言

qt 蓝牙,Qt学习,qt,单片机,开发语言


代码设计

主界面的.cpp和.h

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QBluetoothLocalDevice"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //连接设备按钮点击事件
    this->btConnect = new BluetoothConnect();
    connect(ui->btnConnectDevice,&QPushButton::clicked,[=](){
        //this->hide();
        btConnect->show();
    });

    //监听连接设备窗口发送的连接服务信号
    connect(btConnect,&BluetoothConnect::toConectCharacteristic,this,&MainWindow::ConnectCharacteristic);

    //数据发送按钮点击事件
    connect(ui->btnSend,&QPushButton::clicked,[=](){
        //发送数据
        btConnect->m_service->writeCharacteristic(btConnect->m_characteristic,ui->leSendData->text().toUtf8(),QLowEnergyService::WriteMode::WriteWithoutResponse);
    });

    //关闭数据接收按钮点击事件
    connect(ui->btnClose,&QPushButton::clicked,[=](){
        if(this->isClose)
        {
            ui->btnClose->setText("开启");
            this->isClose = false;
        }
        else
        {
             ui->btnClose->setText("关闭");
             this->isClose = true;
        }
    });

    //清除数据接受区内容按钮点击事件
    connect(ui->btnClear,&QPushButton::clicked,[=](){
        ui->tbRevData->clear();
    });
}

void MainWindow::ConnectCharacteristic(QLowEnergyService * m_service)
{
    // 通过监听特征对象的变化
    //写的和读取到的都会进入到这个位置
    connect(m_service,&QLowEnergyService::characteristicChanged,[=](QLowEnergyCharacteristic c,QByteArray value) {
//        qDebug() << "characteristicChanged state change::";
//        qDebug() << "value length::" << value.length();
//        qDebug() << "value length::" << value;
        if(this->isClose)
        {
            ui->tbRevData->append(value);
        }
    });

    //没有写响应属性的Characteristic不会进入这个连接
//    connect(m_service,&QLowEnergyService::characteristicWritten,[=](QLowEnergyCharacteristic c,QByteArray value) {
        qDebug() << "characteristicChanged state change::";
        qDebug() << "value length::" << value.length();
        qDebug() << "value length::" << value;
//    });

    //service错误监听
    connect(m_service,&QLowEnergyService::errorOccurred,[=](QLowEnergyService::ServiceError newErrorr){
        if(QLowEnergyService::NoError == newErrorr)
            {
                  qDebug() <<"没有发生错误。";
            }
            if(QLowEnergyService::OperationError==newErrorr)
            {
                 qDebug() <<"错误: 当服务没有准备好时尝试进行操作!";
            }
            if(QLowEnergyService::CharacteristicReadError==newErrorr)
            {
                 qDebug() <<"尝试读取特征值失败!";
            }
            if(QLowEnergyService::CharacteristicWriteError==newErrorr)
            {
                 qDebug() <<"尝试为特性写入新值失败!";
            }
            if(QLowEnergyService::DescriptorReadError==newErrorr)
            {
                 qDebug() <<"尝试读取描述符值失败!";
            }
            if(QLowEnergyService::DescriptorWriteError==newErrorr)
            {
                 qDebug() <<" 尝试向描述符写入新值失败!";
            }
            if(QLowEnergyService::UnknownError==newErrorr)
            {
                 qDebug() <<"与服务交互时发生未知错误!";
            }

    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "bluetoothconnect.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    BluetoothConnect *btConnect;
    bool isClose = true;

    void ConnectCharacteristic(QLowEnergyService * m_service);

private:
    Ui::MainWindow *ui;

};
#endif // MAINWINDOW_H

连接界面的.cpp和.h

#include "bluetoothconnect.h"
#include "ui_bluetoothconnect.h"



BluetoothConnect::BluetoothConnect(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::BluetoothConnect)
{
    ui->setupUi(this);

    //设置设备列表的标题
    QListWidgetItem *item = new QListWidgetItem();
    //创建自定义的窗口 然后放入到listwidget中
    BtDevCell *bdc = new BtDevCell();
    //设置item的高
    item->setSizeHint(QSize(ui->lwShow->width(),bdc->height()));
    //设置label的显示
    bdc->btName->setText("名称");
    bdc->btAddr->setText("地址");
    bdc->btRssi->setText("信号强度");

    //把item加入到listwidget
    ui->lwShow->addItem(item);
    //设置item的窗口为自定义的窗口
    ui->lwShow->setItemWidget(item,bdc);

    //设置服务列表的标题
    QListWidgetItem *items = new QListWidgetItem();
    //创建自定义的窗口 然后放入到listwidget中
    BtDevCell *bdcs = new BtDevCell();
    //把item加入到listwidget
    items->setSizeHint(QSize(ui->lwService->width(),bdcs->height()));
    //设置label的显示
    bdcs->btName->setText("空");
    bdcs->btAddr->setText("服务Uuid");
    bdcs->btRssi->setText("空");
    //设置item的窗口为自定义的窗口
    ui->lwService->addItem(items);
    //设置item的窗口为自定义的窗口
    ui->lwService->setItemWidget(items,bdcs);

    //创建通信的socket 普通蓝牙使用
    //QBluetoothSocket *btSocket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol,this);


    //创建设备发现对象
    QBluetoothDeviceDiscoveryAgent *discoveryAgent = new QBluetoothDeviceDiscoveryAgent(this);

    //点击搜索设备后开始搜索设备
    connect(ui->btnSerachDevice,&QPushButton::clicked,[=](){
        qDebug() << "开始搜索设备";
        //如果已经搜索过一次了,那么设计列表可能就大于1,那么就清空设备列表
        //但是标题也会被清除,所以重新构建
        if(ui->lwShow->count()>1)
        {
            ui->lwShow->clear();

            //设置设备列表的标题
            QListWidgetItem *item = new QListWidgetItem();
            //创建自定义的窗口 然后放入到listwidget中
            BtDevCell *bdc = new BtDevCell();
            //设置item的高
            item->setSizeHint(QSize(ui->lwShow->width(),bdc->height()));
            //设置label的显示
            bdc->btName->setText("名称");
            bdc->btAddr->setText("地址");
            bdc->btRssi->setText("信号强度");

            //把item加入到listwidget
            ui->lwShow->addItem(item);
            //设置item的窗口为自定义的窗口
            ui->lwShow->setItemWidget(item,bdc);
        }

        //开始搜索设备
        discoveryAgent->start();

    });

    //搜索到设备后进入
    connect(discoveryAgent,&QBluetoothDeviceDiscoveryAgent::deviceDiscovered,[=](QBluetoothDeviceInfo devInfo){
        qDebug() << "搜索到设备";
        //名称不为空且是低功耗蓝牙
        if(devInfo.name() != "" && (devInfo.coreConfigurations() & QBluetoothDeviceInfo::LowEnergyCoreConfiguration))
        {
            QListWidgetItem *item = new QListWidgetItem();
            BtDevCell *bdc = new BtDevCell();

            item->setSizeHint(QSize(ui->lwShow->width(),bdc->height()));

            bdc->btName->setText(devInfo.name());
            bdc->btAddr->setText(devInfo.address().toString());
            bdc->btRssi->setText(QString::number(devInfo.rssi()));

            ui->lwShow->addItem(item);
            ui->lwShow->setItemWidget(item,bdc);

            devInfos.append(devInfo);
        }
    });

    //搜索设备发生错误
    connect(discoveryAgent,&QBluetoothDeviceDiscoveryAgent::errorOccurred,[=](QBluetoothDeviceDiscoveryAgent::Error error){
        qDebug() << error;
        //警告对话框
        QMessageBox::warning(this,"警告","搜索蓝牙设备发生错误,请检查蓝牙是否开启!");
    });

    //搜索设备完成
    connect(discoveryAgent,&QBluetoothDeviceDiscoveryAgent::finished,[=](){
        qDebug() << "搜索完成";
    });

    //设备列表被点击事件
    connect(ui->lwShow,&QListWidget::itemClicked,[=](QListWidgetItem *item){
        //这是经典蓝牙的连接方式
//        QWidget *widget = ui->lwShow->itemWidget(item);
//        BtDevCell *wbdc = (BtDevCell *)widget;
//        qDebug() << wbdc->btAddr->text().toUtf8().data();
//        btSocket->connectToService(QBluetoothAddress(wbdc->btAddr->text().toUtf8().data()),QBluetoothUuid("00001101-0000-1000-8000-00805F9B34FB"),QIODevice::ReadWrite);

        //这是低功耗蓝牙的连接方式
        //qDebug() << ui->lwShow->currentRow();
        //创建蓝牙控制器
        QLowEnergyController *lowBtControl = QLowEnergyController::createCentral(this->devInfos.at(ui->lwShow->currentRow()-1));
        //连接设备
        lowBtControl->connectToDevice();

        //连接成功后进入
        connect(lowBtControl,&QLowEnergyController::connected,[=](){
                qDebug() << "连接成功";
                //搜索服务
                lowBtControl->discoverServices();

        });

        //连接失败后进入
        connect(lowBtControl,&QLowEnergyController::errorOccurred,[=](QLowEnergyController::Error newError){
                qDebug() << newError;
        });

        //搜索到服务后进入
        connect(lowBtControl,&QLowEnergyController::serviceDiscovered, [=](QBluetoothUuid serviceUuid) {
            qDebug() << "发现服务";

            QListWidgetItem *item = new QListWidgetItem();
            BtDevCell *bdc = new BtDevCell();

            item->setSizeHint(QSize(ui->lwService->width(),bdc->height()));

            bdc->btName->setText("");
            bdc->btAddr->setText(serviceUuid.toString());
            bdc->btRssi->setText("");

            ui->lwService->addItem(item);
            ui->lwService->setItemWidget(item,bdc);

            btUuids.append(serviceUuid);
        });

        //服务uuid列表被点击事件
        connect(ui->lwService,&QListWidget::itemClicked,[=](){
            QBluetoothUuid serviceUuid = btUuids.at(ui->lwService->currentRow()-1);
            //创建服务
            this->m_service = lowBtControl->createServiceObject(QBluetoothUuid(serviceUuid),this);
            if(m_service==NULL)
            {
                qDebug() << "服务建立失败!";
            }
            else
            {
                qDebug() << "服务建立成功!";

                // 服务对象创建成功后,坚挺服务状态变化,如果状态变成已发现,则进行后续服务下特征对象获取
                connect(m_service,&QLowEnergyService::stateChanged, this, [this]() {
                    //qDebug() << "service state change" << m_service->state();
                    //发现服务, 建立characteristic对象实例
                    if(m_service->state() == QLowEnergyService::ServiceDiscovered) {

                        //获取特征对象
                        QList<QLowEnergyCharacteristic> list=m_service->characteristics();

                        for(int i=0;i<list.count();i++)
                        {
                            this->m_characteristic = list.at(i);

                            //qDebug() << c.properties();
                            /*如果QLowEnergyCharacteristic对象有效,则返回true,否则返回false*/
                            if(m_characteristic.isValid())
                            {
                                //描述符定义特征如何由特定客户端配置。
                                QLowEnergyDescriptor m_notificationDesc = m_characteristic.descriptor(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
                                if(m_notificationDesc.isValid())
                                {
                                    //写描述符
                                    m_service->writeDescriptor(m_notificationDesc, QByteArray::fromHex("0100"));
                                    //m_service->writeDescriptor(m_notificationDesc, QByteArray::fromHex("FEE1"));
                                }
                            }
                        }
                    }
                });

                //通知主窗口可以连接service了
                emit toConectCharacteristic(m_service);

                // 触发服务详情发现函数 ,不要忘记调用
                m_service->discoverDetails();
            }
        });
    });

//    //普通蓝牙使用
//    connect(btSocket,&QBluetoothSocket::connected,[=](){
//        qDebug() << "连接完成";
//    });

//    connect(btSocket,&QBluetoothSocket::errorOccurred,[=](QBluetoothSocket::SocketError error){
//        qDebug() << "连接失败:" <<error;
//    });

}


BluetoothConnect::~BluetoothConnect()
{
    delete ui;
}
#ifndef BLUETOOTHCONNECT_H
#define BLUETOOTHCONNECT_H

#include <QMainWindow>
#include "QLowEnergyController"
#include "QBluetoothLocalDevice"
#include "QBluetoothDeviceDiscoveryAgent"
#include "QBluetoothSocket"
#include "QDebug"
#include "QListWidgetItem"
#include "btdevcell.h"
#include "QLabel"
#include "QMessageBox"
#include "QLowEnergyDescriptor"
#include "QLowEnergyService"
#include "QBluetoothUuid"
#include "QTimer"

namespace Ui {
class BluetoothConnect;
}

class BluetoothConnect : public QMainWindow
{
    Q_OBJECT

public:
    explicit BluetoothConnect(QWidget *parent = nullptr);
    ~BluetoothConnect();

    QList<QBluetoothDeviceInfo> devInfos;
    QList<QBluetoothUuid> btUuids;

    QLowEnergyService * m_service;
    QLowEnergyCharacteristic m_characteristic;

    void searchCharacteristic();

private:
    Ui::BluetoothConnect *ui;

signals:
    void toConectCharacteristic(QLowEnergyService * m_service);

};

#endif // BLUETOOTHCONNECT_H

listWidget Item界面.cpp和.h

#include "btdevcell.h"
#include "ui_btdevcell.h"

BtDevCell::BtDevCell(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::BtDevCell)
{
    ui->setupUi(this);

    this->btName = ui->btName;
    this->btAddr = ui->btAddr;
    this->btRssi = ui->btRssi;
}

BtDevCell::~BtDevCell()
{
    delete ui;
}
#ifndef BTDEVCELL_H
#define BTDEVCELL_H

#include <QWidget>
#include "QLabel"

namespace Ui {
class BtDevCell;
}

class BtDevCell : public QWidget
{
    Q_OBJECT

public:
    explicit BtDevCell(QWidget *parent = nullptr);
    ~BtDevCell();
    QLabel *btName;
    QLabel *btAddr;
    QLabel *btRssi;

private:
    Ui::BtDevCell *ui;

};

#endif // BTDEVCELL_H

运行演示

qt 蓝牙,Qt学习,qt,单片机,开发语言

qt 蓝牙,Qt学习,qt,单片机,开发语言文章来源地址https://www.toymoban.com/news/detail-595789.html

到了这里,关于Qt开发简易蓝牙调试助手(低功耗蓝牙)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【C++ QT项目2】——高仿安信可串口调试助手

      串口调试助手是一种串口通讯测试工具,它可以用于打开、关闭、配置串口,读写串口数据等常见的串口通信操作。 在嵌入式系统调试、模块测试、通讯协议分析等领域都具有广泛的应用。   串口助手通常提供GUI界面,让用户可以更加方便、直观地进行串口通讯测试

    2024年02月19日
    浏览(36)
  • ubuntu20安装网络调试助手遇到缺少qt4相关库的问题

    最近需要做套接字通讯的工作,最好是有一个网络调试软件能够接受或者发送套接字,测试代码能够正常通讯。windows下有很多,但是linux下比较少,使用广泛的是下面这一款。 首先从网盘(链接: https://pan.baidu.com/s/1Zo-M9VUNp977xvYSMakv6A?pwd=Nv24)下载软件,或者搜索 ubuntu mNetAssi

    2024年01月25日
    浏览(37)
  • Qt开发上位机软件建立经典蓝牙通讯

    之前做了一个具有经典蓝牙通讯功能的Windows上位机软件,在网上学习了相关博客以及参考了官方经典蓝牙例程之后,总结出了使用Qt建立经典蓝牙通讯的步骤,附带相关源码,作为分享 我使用的 Qt 版本是5.15,使用的 CMake 构建项目。 整体开发使用的 IDE 是 Qt Creator ,采用的方

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

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

    2024年02月04日
    浏览(33)
  • PHY6222_手机上使用蓝牙调试助手交互

    PHY6222是蓝牙芯片,simpleBLEPeripheral这个工程就是含有蓝牙连接的例程,所以在学习外设的使用之前想先看下怎么在手机上连接这个蓝牙,进行数据收发。需要在手机上安装“BLE蓝牙助手”,直接在浏览器搜索下载即可。 到BUMBLE这个设备,点击连接; 连上之后,就会看到4个蓝

    2024年02月09日
    浏览(27)
  • 嵌入式开发板qt gdb调试

    1) 启动 gdbserver ssh 或者 telnet 登陆扬创平板 192.168.0.253, 进入命令行执行如下: chmod 777 /home/HelloWorld (2) 打 开 QTcreator-Debug-StartDebugging-Attach to Running Debug Server 进行如下设置,设置监听端口10000. 点击上图中的按钮,由于按钮中的函数设置了断点,则跳到断点,界面如下

    2024年02月04日
    浏览(84)
  • 蓝牙串口调试助手通过PC蓝牙发送数据给ESP32同时在串口上显示

    OK,好久没有更新Blog啦 今天把之前积累的代码放上,给需要学习的程序猿们使用 我还是不太喜欢写文字,倒是比较喜欢客套,哈哈 硬件图: ESP32和USB-micro-B数据线一根 蓝牙串口调试助手通过PC蓝牙发送数据给ESP32同时在串口上显示 具体代码如下:

    2024年02月09日
    浏览(33)
  • Android低功耗蓝牙(BLE)开发(二)

    在上一篇文章Android低功耗蓝牙(BLE)开发(一)中我们了解了BLE的相关概念,这里我们来实际用代码演示安卓进行BLE连接和通讯的功能。本文代码基于Android5.0以上(API 21) 1.声明权限 在AndroidManifest.xml文件中添加BLE相关的权限声明。 2.判断设备是否支持BLE以及蓝牙是否打开 3.进

    2024年02月09日
    浏览(36)
  • Python Qt学习(十)一个简易的POP3邮件客户端

    公司把126这类的邮箱网站都封了,正好现在无事,加之,算是一个对这俩周学习Qt的一个总结吧。遂写了这么一个简易的通过POP3协议接收126邮件的客户端。 源代码: 截图:

    2024年02月09日
    浏览(29)
  • C# 简易TCP网口调试助手(一) 客户端Client

      最近的上位机开发工作中开始频繁涉及到网口、串口的通讯,网上找了各种资料和帖子都没怎么找到好用的开源代码或者工具。目前找到几个好一点的方式来实现的网口和串口通讯工具包,先写个好用的TCP的negut包记录下来,将使用的步骤写下来做个记录。   本博客主要用

    2024年04月13日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包