原文地址::关于从零开始学习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