一、环境介绍
QT版本: 5.12.6
编译环境: win10 64位
目标系统: Android
完整工程源码下载地址(包含APK文件): https://download.csdn.net/download/xiaolong1126626497/19051787
想学习QT的Android环境搭建看这里(win10版本): https://blog.csdn.net/xiaolong1126626497/article/details/117254453
(ubuntu版本): https://blog.csdn.net/xiaolong1126626497/article/details/117256660
想学习QT入门到精通编程的看这里:https://blog.csdn.net/xiaolong1126626497/article/details/116485145
二、功能介绍
设计本软件的目的是作为HC05/06系列蓝牙串口的调试助手,方便嵌入式工程师、电子工程师调试蓝牙串口模块,HC05/06是经典的2.0串口蓝牙模块。
三、软件核心源码
-
#include "mainwindow.h"
-
#include "ui_mainwindow.h"
-
-
-
/*
-
* 设置QT界面的样式
-
*/
-
void MainWindow::SetStyle(const QString &qssFile) {
-
QFile file(qssFile);
-
if (file.open(QFile::ReadOnly)) {
-
QString qss = QLatin1String(file.readAll());
-
qApp->setStyleSheet(qss);
-
QString PaletteColor = qss.mid(
20,
7);
-
qApp->setPalette(QPalette(QColor(PaletteColor)));
-
file.close();
-
}
-
else
-
{
-
qApp->setStyleSheet(
"");
-
}
-
}
-
-
-
static const QLatin1String serviceUuid("00001101-0000-1000-8000-00805F9B34FB");
-
//这个字符串里面的内容就是串口模式的Uuid
-
-
MainWindow::MainWindow(QWidget *parent) :
-
QMainWindow(parent),
-
ui(
new Ui::MainWindow)
-
{
-
ui->setupUi(
this);
-
-
this->SetStyle(
":/qss/blue.css");
//设置样式表
-
this->setWindowTitle(
"HC05蓝牙调试助手");
//设置标题
-
this->setWindowIcon(QIcon(
":/wbyq.ico"));
//设置图标
-
-
/*1. 实例化蓝牙相关的对象*/
-
discoveryAgent =
new QBluetoothDeviceDiscoveryAgent();
-
localDevice =
new QBluetoothLocalDevice();
-
socket =
new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
-
//RfcommProtocol表示该服务使用RFCOMM套接字协议。RfcommProtocol属于模拟RS232模式,就叫串口模式
-
-
/*2. 关联蓝牙设备相关的信号*/
-
/*2.1 关联发现设备的槽函数,当扫描发现周围的蓝牙设备时,会发出deviceDiscovered信号*/
-
connect(discoveryAgent,
-
SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
-
this,
-
SLOT(addBlueToothDevicesToList(QBluetoothDeviceInfo))
-
);
-
-
//蓝牙有数据可读
-
connect(socket,
-
SIGNAL(readyRead()),
-
this,
-
SLOT(readBluetoothDataEvent())
-
);
-
-
//蓝牙连接建立成功
-
connect(socket,
-
SIGNAL(connected()),
-
this,
-
SLOT(bluetoothConnectedEvent())
-
);
-
-
//蓝牙断开连接
-
connect(socket,
-
SIGNAL(disconnected()),
-
this,
-
SLOT(bluetoothDisconnectedEvent())
-
);
-
//蓝牙连接错误
-
connect(socket,
static_cast<
void(QBluetoothSocket::*)(QBluetoothSocket::SocketError)>(&QBluetoothSocket::error),
-
[=](QBluetoothSocket::SocketError error)
-
{
-
ui->plainTextEdit_BluetoothInfiShow->insertPlainText(socket->errorString());
//显示错误信息
-
-
if(QBluetoothSocket::UnknownSocketError ==error)
-
{
-
ui->plainTextEdit_BluetoothInfiShow->insertPlainText(
"位置错误\n");
//显示错误信息
-
}
-
-
if(QBluetoothSocket::NoSocketError ==error)
-
{
-
ui->plainTextEdit_BluetoothInfiShow->insertPlainText(
" 没有错误 用于测试\n");
//显示错误信息
-
}
-
-
if(QBluetoothSocket::HostNotFoundError ==error)
-
{
-
ui->plainTextEdit_BluetoothInfiShow->insertPlainText(
"找不到远程主机\n");
//显示错误信息
-
}
-
-
if(QBluetoothSocket::ServiceNotFoundError ==error)
-
{
-
ui->plainTextEdit_BluetoothInfiShow->insertPlainText(
" 无法在远程主机上找到服务UUID\n");
//显示错误信息
-
}
-
-
if(QBluetoothSocket::NetworkError ==error)
-
{
-
ui->plainTextEdit_BluetoothInfiShow->insertPlainText(
"尝试从套接字读取或写入返回错误\n");
//显示错误信息
-
}
-
-
if(QBluetoothSocket::UnsupportedProtocolError ==error)
-
{
-
ui->plainTextEdit_BluetoothInfiShow->insertPlainText(
" 该平台不支持该协议\n");
//显示错误信息
-
}
-
-
if(QBluetoothSocket::OperationError ==error)
-
{
-
ui->plainTextEdit_BluetoothInfiShow->insertPlainText(
"当套接字处于不允许的状态时尝试进行操作\n");
//显示错误信息
-
}
-
});
-
-
/*3. 检查蓝牙的状态,用于设置按钮的初始状态*/
-
/*3.1 检查蓝牙是否开启*/
-
if(localDevice->hostMode() == QBluetoothLocalDevice::HostPoweredOff)
-
{
-
//如果蓝牙处于关闭状态
-
ui->pushButton_OpenBluetooth->setEnabled(
true);
//打开按钮
-
ui->pushButton_CloseBluetooth->setEnabled(
false);
//关闭按钮
-
ui->pushButton_BluetoothScan->setEnabled(
false);
-
-
}
-
else
//如果蓝牙处于开启状态
-
{
-
ui->pushButton_OpenBluetooth->setEnabled(
false);
//打开按钮
-
ui->pushButton_CloseBluetooth->setEnabled(
true);
//关闭按钮
-
ui->pushButton_BluetoothScan->setEnabled(
true);
//设置扫描按钮可用
-
}
-
-
/*3.2 设置标签显示本地蓝牙的名称*/
-
QString name_info("本机蓝牙:");
-
name_info+=localDevice->name();
-
ui->label_BluetoothName->setText(name_info);
-
-
ui->pushButton_StopScan->setEnabled(
false);
//设置停止扫描蓝牙的按钮不可用
-
-
ui->plainTextEdit_BluetoothInfiShow->setEnabled(
false);
//设置不可编辑
-
}
-
-
-
MainWindow::~MainWindow()
-
{
-
delete ui;
-
delete discoveryAgent;
-
delete localDevice;
-
delete socket;
-
}
-
-
void MainWindow::on_pushButton_OpenBluetooth_clicked()
-
{
-
/*请求打开蓝牙设备*/
-
localDevice->powerOn();
-
ui->pushButton_OpenBluetooth->setEnabled(
false);
//打开按钮
-
ui->pushButton_CloseBluetooth->setEnabled(
true);
//关闭按钮
-
ui->pushButton_BluetoothScan->setEnabled(
true);
//设置扫描按钮可用
-
ui->pushButton_StopScan->setEnabled(
true);
-
}
-
-
void MainWindow::on_pushButton_CloseBluetooth_clicked()
-
{
-
/*关闭蓝牙设备*/
-
localDevice->setHostMode(QBluetoothLocalDevice::HostPoweredOff);
-
ui->pushButton_OpenBluetooth->setEnabled(
true);
//打开按钮
-
ui->pushButton_CloseBluetooth->setEnabled(
false);
//关闭按钮
-
ui->pushButton_BluetoothScan->setEnabled(
false);
//设置扫描按钮不可用
-
ui->pushButton_StopScan->setEnabled(
false);
-
-
}
-
-
-
void MainWindow::on_pushButton_BluetoothScan_clicked()
-
{
-
/*开始扫描周围的蓝牙设备*/
-
discoveryAgent->start();
-
ui->comboBox_BluetoothDevice->clear();
//清除条目
-
ui->pushButton_BluetoothScan->setEnabled(
false);
//设置扫描按钮不可用
-
ui->pushButton_StopScan->setEnabled(
true);
//设置停止扫描按钮可用
-
}
-
-
-
void MainWindow::on_pushButton_StopScan_clicked()
-
{
-
/*停止扫描周围的蓝牙设备*/
-
discoveryAgent->stop();
-
ui->pushButton_StopScan->setEnabled(
false);
//设置停止扫描按钮不可用
-
ui->pushButton_BluetoothScan->setEnabled(
true);
//设置扫描按钮可用
-
-
}
-
-
-
/*当扫描到周围的设备时会调用当前的槽函数*/
-
void MainWindow::addBlueToothDevicesToList(const QBluetoothDeviceInfo &info)
-
{
-
// QString label = QString("%1 %2").arg(info.name()).arg(info.address().toString());
-
QString label = QString(
"%1 %2").arg(info.address().toString()).arg(info.name());
-
ui->comboBox_BluetoothDevice->addItem(label);
//添加字符串到comboBox上
-
}
-
-
-
//有数据可读
-
void MainWindow::readBluetoothDataEvent()
-
{
-
QByteArray all = socket->readAll();
-
ui->plainTextEdit_BluetoothInfiShow->insertPlainText(QString::fromLocal8Bit(all));
-
}
-
-
-
//建立连接
-
void MainWindow::bluetoothConnectedEvent()
-
{
-
QMessageBox::information(
this,tr(
"连接提示"),
"蓝牙连接成功!");
-
-
/*停止扫描周围的蓝牙设备*/
-
discoveryAgent->stop();
-
ui->pushButton_StopScan->setEnabled(
false);
//设置停止扫描按钮不可用
-
ui->pushButton_BluetoothScan->setEnabled(
false);
//设置扫描按钮不可用
-
}
-
-
-
//断开连接
-
void MainWindow::bluetoothDisconnectedEvent()
-
{
-
QMessageBox::information(
this,tr(
"连接提示"),
"蓝牙断开连接!");
-
ui->pushButton_BluetoothScan->setEnabled(
true);
//设置扫描按钮可用
-
}
-
-
-
/*
-
在说蓝牙设备连接之前,不得不提一个非常重要的概念,就是蓝牙的Uuid,引用一下百度的:
-
在蓝牙中,每个服务和服务属性都唯一地由"全球唯一标识符" (UUID)来校验。
-
正如它的名字所暗示的,每一个这样的标识符都要在时空上保证唯一。
-
UUID类可表现为短整形(16或32位)和长整形(128位)UUID。
-
他提供了分别利用String和16位或32位数值来创建类的构造函数,提供了一个可以比较两个UUID(如果两个都是128位)的方法,还有一个可以转换一个UUID为一个字符串的方法。
-
UUID实例是不可改变的(immutable),只有被UUID标示的服务可以被发现。
-
在Linux下你用一个命令uuidgen -t可以生成一个UUID值;
-
在Windows下则执行命令uuidgen 。UUID看起来就像如下的这个形式:2d266186-01fb-47c2-8d9f-10b8ec891363。当使用生成的UUID去创建一个UUID对象,你可以去掉连字符。
-
*/
-
-
//发送数据
-
void MainWindow::on_pushButton_SendData_clicked()
-
{
-
QString text=ui->lineEdit_SendData->text();
-
QByteArray send_data=text.toLocal8Bit();
-
socket->write(send_data);
//发送数据
-
}
-
-
//清空收到的数据
-
void MainWindow::on_pushButton_Clear_clicked()
-
{
-
ui->plainTextEdit_BluetoothInfiShow->setPlainText(
"");
-
}
-
-
//连接蓝牙
-
void MainWindow::on_pushButton_ConnectDev_clicked()
-
{
-
QString text = ui->comboBox_BluetoothDevice->currentText();
-
int index = text.indexOf(
' ');
-
if(index ==
-1)
return;
-
-
QBluetoothAddress address(text.left(index));
-
-
QString connect_device=
"开始连接蓝牙设备:\n";
-
connect_device+=ui->comboBox_BluetoothDevice->currentText();
-
QMessageBox::information(
this,tr(
"连接提示"),connect_device);
-
-
//开始连接蓝牙设备
-
socket->connectToService(address, QBluetoothUuid(serviceUuid) ,QIODevice::ReadWrite);
-
}
-
-
-
//帮助提示
-
void MainWindow::on_pushButton_help_clicked()
-
{
-
QMessageBox::information(
this,tr(
"帮助提示"),
"本软件用于HC-05/06系列串口蓝牙调试!\n"
-
"不支持BLE4.0版本蓝牙调试!\n"
-
"软件作者:DS小龙哥\n"
-
"BUG反馈:1126626497@qq.com");
-
}
-
转载:https://blog.csdn.net/xiaolong1126626497/article/details/117249111
查看评论