关于从零开始学习qt制作蓝牙app和PC端的记录

原文地址::关于从零开始学习qt制作蓝牙app和PC端的记录_RM小白的博客-CSDN博客_qt蓝牙传输文件

相关文章

1、QT软件开发-第十三章 基于QT5蓝牙设备开发 13.1~13.4----QT软件开发-第十三章 基于QT5蓝牙设备开发 13.1~13.4_mb5fe55afb6fa16的技术博客_51CTO博客 

2、Qt windows 蓝牙4.0开发----Qt windows 蓝牙4.0开发_专栏_易百纳技术社区

3、QT蓝牙开发----QT蓝牙开发 - 百度文库 

4、Qt Bluetooth 蓝牙系列开发----https://blog.csdn.net/clinuxf/category_10635175.html 

5、13.3.1 QBluetoothSocket类介绍----13.3.1 QBluetoothSocket类介绍_DS小龙哥的博客-CSDN博客 

6、电脑蓝牙在哪里打开 打开电脑蓝牙的两种方法----电脑蓝牙在哪里打开_打开电脑蓝牙的两种方法-系统城

7、qt蓝牙开发基本步骤----qt蓝牙开发基本步骤_遗失的古都秋的博客-CSDN博客_qt蓝牙通讯 

8、Qt开发简易蓝牙调试助手(低功耗蓝牙)----Qt开发简易蓝牙调试助手(低功耗蓝牙)_努力向前的小徐的博客-CSDN博客_蓝牙调试助手 

9、蓝牙 UUID 速查手册----https://www.jianshu.com/p/eb85cb690e86?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes

10、qt windows ble低功耗蓝牙----qt windows ble低功耗蓝牙_u010816417的博客-CSDN博客_qt 低功耗蓝牙 

11、https://gitee.com/jackee645467620/QtBluetootTool

1.提前准备学习
由于本人在此之前只学习过C语言,了解到QT制作会用到C++的基础部分,所以提前学习了C++,大概花费三天
接下来学习QT 推荐B站学习 基本只需要学习基本使用 后面实践才是最重要的
好啦,进入自我实践
2.开始实践
2.1各种库文件的添加
由于QT自带蓝牙库,但需要加入以下代码在.pro文件里

QT       += bluetooth
1
然后需要加入以下蓝牙头文件

#include <QtBluetooth/qtbluetoothglobal.h>
#include <QtBluetooth/qbluetoothlocaldevice.h>
#include <QtBluetooth/qbluetoothsocket.h>
#include <QtBluetooth/qbluetoothservicediscoveryagent.h>
#include <QtBluetooth/qbluetoothaddress.h>
1
2
3
4
5
需要用到的数组和各种控件

#include <QByteArray>
#include <QMainWindow>
#include <QListWidgetItem>
#include <QTextEdit>
1
2
3
4
2.2蓝牙的三个对象

    QBluetoothDeviceDiscoveryAgent *discoveryAgent;//用来对周围蓝牙进行搜寻
    QBluetoothLocalDevice *localDevice;//对本地设备进行操作,比如进行设备的打开,设备的关闭等等
    QBluetoothSocket *socket;//就是用来进行蓝牙配对链接和数据传输的
首先进行实例化

localDevice = new QBluetoothLocalDevice();  //本地操作
discoveryAgent = new QBluetoothDeviceDiscoveryAgent();//用来发现扫描周围设备
socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);//用来与蓝牙的连接和数据传输
1
2
3
4
5
6
7
8
这里设置了一个按键去触发扫描蓝牙

void MainWindow::on_BtnScan_clicked()
{
    ui->BtnScan->setText("开始扫描...");
    ui->listWidget->clear();
    if( localDevice->hostMode() == QBluetoothLocalDevice::HostPoweredOff)//判断开机有没有打开蓝牙
    {
        localDevice->powerOn();//调用打开本地的蓝牙设备

    }
    discoveryAgent->setInquiryType(QBluetoothDeviceDiscoveryAgent::GeneralUnlimitedInquiry);  //开启无限制搜寻模式
    discoveryAgent->start();//开始扫描蓝牙设备
    emit emit_refresh();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
当扫描完成之后,需要将发现的设备打印到listWidget

connect(discoveryAgent,SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),this,SLOT(addBlueToothDevicesToList(QBluetoothDeviceInfo)));//发现设备后打印到addBluetoothDevicestoList的ListWidget
void MainWindow::addBlueToothDevicesToList(const QBluetoothDeviceInfo &info)
{
    QString label = QString("%1 %2").arg(info.address().toString()).arg(info.name());  //打印蓝牙的地址和名字到label
    //listWidget的finbditems用于查找列表部件是否有满足条件的项     返回值为一个满足条件的QT::MatchExactly列表  满足于上面的格式
    QList<QListWidgetItem *> items = ui->listWidget->findItems(label, Qt::MatchExactly);  //label填入到listWidget

    if (items.empty())
    {
        QListWidgetItem *item = new QListWidgetItem(label);
        QBluetoothLocalDevice::Pairing pairingStatus = localDevice->pairingStatus(info.address());
        /* 蓝牙状态pairingStatus,Pairing枚举类型
         * 0:Unpaired没配对
         * 1:Paired配对但没授权
         * 2:AuthorizedPaired配对且授权 */
        if (pairingStatus == QBluetoothLocalDevice::Paired || pairingStatus == QBluetoothLocalDevice::AuthorizedPaired )
            item->setForeground(QColor(Qt::red));
        else
            item->setForeground(QColor(Qt::black));
        ui->listWidget->addItem(item); //添加item项
    }
}

发现设备后连接设备
void MainWindow::on_listWidget_itemClicked(QListWidgetItem *item)
{
    ui->BtnLink->setEnabled(true);
    selItem = item;
}
void MainWindow::on_BtnLink_clicked()
{
    ui->BtnScan->setText("扫描蓝牙设备");

    if (selItem != NULL)
    {
        QString text = selItem->text();  //获取item文本
        int index = text.indexOf(' ');  //查找空格在字符串里面的位置  首次出现的位置
        if(index == -1){
            return;
        }
        //分离地址和名字
        QBluetoothAddress Address(text.left(index));
        QString name(text.mid(index + 1));

        //类型转换
        QString temp = QString("%1").arg(Address.toString());

        ui->editRecv->append(QStringLiteral("你链接的蓝牙地址是:")+temp);
        ui->editRecv->append(QStringLiteral("你链接的蓝牙名字:")+name);

        //蓝牙蓝牙连接 读写模式
        socket->connectToService(Address, QBluetoothUuid(serviceUuid) ,QIODevice::ReadWrite);
        //连接完成后跳到bltconnect 打印完成链接
        connect(socket,SIGNAL(connected()),this,SLOT(bltConnected()));
    }

}
void MainWindow::bltConnected()
{
    ui->editRecv->append(QStringLiteral("成功链接!"));
    connect(socket,SIGNAL(readyRead()),this,SLOT(bltReadMsg()));  //成功链接后,进入读模式,跳入bltReadMsg
    blt_connected  = true;


}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
然后写发送和接受数据的函数

void MainWindow::bltReadMsg()
{
    QByteArray get = socket->readAll();  //读到所有数据-》get 数组
    QTextCursor cursor = ui->editRecv->textCursor();   //设置游标
    cursor.movePosition(QTextCursor::End); // 末尾
    ui->editRecv->setTextCursor(cursor);
    if (ui->chkHexRecv->isChecked())
    {
        QString tstr, t;
        for (int i = 0; i < get.size(); ++i)
        {
            t.asprintf("%02X ", get.data()[i]);
            tstr += t;
        }
        ui->editRecv->insertPlainText(tstr);
    }
    else
        ui->editRecv->insertPlainText(QString(get));   //打印数据
}
void MainWindow::on_BtnSend_clicked()  //发送按钮
{
    QMessageBox *msg_box= new QMessageBox(QMessageBox::NoIcon,QStringLiteral("注意"),QStringLiteral("请链接BLT"));

    if(blt_connected ==true)
    {
        QString data = ui->editSend->toPlainText();
        QByteArray tba;
        if (ui->chkHexSend->isChecked())
            tba = HexStringToByteArray(data);
        else
            tba = data.toLatin1();
            socket->write(tba);
    }
    else
        msg_box->exec();
}
QByteArray MainWindow::HexStringToByteArray(QString HexString)  //Hex转
{
    bool ok;
    QByteArray ret;
    HexString = HexString.trimmed();
    HexString = HexString.simplified();
    QStringList sl = HexString.split(" ");

    foreach (QString s, sl) {
        if(!s.isEmpty())
        {
            uint32_t td = s.toUInt(&ok, 16);
            int pos = ret.size();
            if (ok)
            {
                do {
                    ret.insert(pos, td & 0xFF);
//                    ret.append(td & 0xFF);
                    td >>= 8;
                }while(td > 0);
            }
        }
    }
    qDebug()<<ret;
    return ret;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
效果图如下:

————————————————
版权声明:本文为CSDN博主「RM小白」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43643307/article/details/123516087

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值