飞道的博客

QT应用编程: 编写HC05串口蓝牙调试助手(Android系统APP)

855人阅读  评论(0)

一、环境介绍

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串口蓝牙模块。

三、软件核心源码


  
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. /*
  4. * 设置QT界面的样式
  5. */
  6. void MainWindow::SetStyle(const QString &qssFile) {
  7. QFile file(qssFile);
  8. if (file.open(QFile::ReadOnly)) {
  9. QString qss = QLatin1String(file.readAll());
  10. qApp->setStyleSheet(qss);
  11. QString PaletteColor = qss.mid( 20, 7);
  12. qApp->setPalette(QPalette(QColor(PaletteColor)));
  13. file.close();
  14. }
  15. else
  16. {
  17. qApp->setStyleSheet( "");
  18. }
  19. }
  20. static const QLatin1String serviceUuid("00001101-0000-1000-8000-00805F9B34FB");
  21. //这个字符串里面的内容就是串口模式的Uuid
  22. MainWindow::MainWindow(QWidget *parent) :
  23. QMainWindow(parent),
  24. ui( new Ui::MainWindow)
  25. {
  26. ui->setupUi( this);
  27. this->SetStyle( ":/qss/blue.css"); //设置样式表
  28. this->setWindowTitle( "HC05蓝牙调试助手"); //设置标题
  29. this->setWindowIcon(QIcon( ":/wbyq.ico")); //设置图标
  30. /*1. 实例化蓝牙相关的对象*/
  31. discoveryAgent = new QBluetoothDeviceDiscoveryAgent();
  32. localDevice = new QBluetoothLocalDevice();
  33. socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
  34. //RfcommProtocol表示该服务使用RFCOMM套接字协议。RfcommProtocol属于模拟RS232模式,就叫串口模式
  35. /*2. 关联蓝牙设备相关的信号*/
  36. /*2.1 关联发现设备的槽函数,当扫描发现周围的蓝牙设备时,会发出deviceDiscovered信号*/
  37. connect(discoveryAgent,
  38. SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
  39. this,
  40. SLOT(addBlueToothDevicesToList(QBluetoothDeviceInfo))
  41. );
  42. //蓝牙有数据可读
  43. connect(socket,
  44. SIGNAL(readyRead()),
  45. this,
  46. SLOT(readBluetoothDataEvent())
  47. );
  48. //蓝牙连接建立成功
  49. connect(socket,
  50. SIGNAL(connected()),
  51. this,
  52. SLOT(bluetoothConnectedEvent())
  53. );
  54. //蓝牙断开连接
  55. connect(socket,
  56. SIGNAL(disconnected()),
  57. this,
  58. SLOT(bluetoothDisconnectedEvent())
  59. );
  60. //蓝牙连接错误
  61. connect(socket, static_cast< void(QBluetoothSocket::*)(QBluetoothSocket::SocketError)>(&QBluetoothSocket::error),
  62. [=](QBluetoothSocket::SocketError error)
  63. {
  64. ui->plainTextEdit_BluetoothInfiShow->insertPlainText(socket->errorString()); //显示错误信息
  65. if(QBluetoothSocket::UnknownSocketError ==error)
  66. {
  67. ui->plainTextEdit_BluetoothInfiShow->insertPlainText( "位置错误\n"); //显示错误信息
  68. }
  69. if(QBluetoothSocket::NoSocketError ==error)
  70. {
  71. ui->plainTextEdit_BluetoothInfiShow->insertPlainText( " 没有错误 用于测试\n"); //显示错误信息
  72. }
  73. if(QBluetoothSocket::HostNotFoundError ==error)
  74. {
  75. ui->plainTextEdit_BluetoothInfiShow->insertPlainText( "找不到远程主机\n"); //显示错误信息
  76. }
  77. if(QBluetoothSocket::ServiceNotFoundError ==error)
  78. {
  79. ui->plainTextEdit_BluetoothInfiShow->insertPlainText( " 无法在远程主机上找到服务UUID\n"); //显示错误信息
  80. }
  81. if(QBluetoothSocket::NetworkError ==error)
  82. {
  83. ui->plainTextEdit_BluetoothInfiShow->insertPlainText( "尝试从套接字读取或写入返回错误\n"); //显示错误信息
  84. }
  85. if(QBluetoothSocket::UnsupportedProtocolError ==error)
  86. {
  87. ui->plainTextEdit_BluetoothInfiShow->insertPlainText( " 该平台不支持该协议\n"); //显示错误信息
  88. }
  89. if(QBluetoothSocket::OperationError ==error)
  90. {
  91. ui->plainTextEdit_BluetoothInfiShow->insertPlainText( "当套接字处于不允许的状态时尝试进行操作\n"); //显示错误信息
  92. }
  93. });
  94. /*3. 检查蓝牙的状态,用于设置按钮的初始状态*/
  95. /*3.1 检查蓝牙是否开启*/
  96. if(localDevice->hostMode() == QBluetoothLocalDevice::HostPoweredOff)
  97. {
  98. //如果蓝牙处于关闭状态
  99. ui->pushButton_OpenBluetooth->setEnabled( true); //打开按钮
  100. ui->pushButton_CloseBluetooth->setEnabled( false); //关闭按钮
  101. ui->pushButton_BluetoothScan->setEnabled( false);
  102. }
  103. else //如果蓝牙处于开启状态
  104. {
  105. ui->pushButton_OpenBluetooth->setEnabled( false); //打开按钮
  106. ui->pushButton_CloseBluetooth->setEnabled( true); //关闭按钮
  107. ui->pushButton_BluetoothScan->setEnabled( true); //设置扫描按钮可用
  108. }
  109. /*3.2 设置标签显示本地蓝牙的名称*/
  110. QString name_info("本机蓝牙:");
  111. name_info+=localDevice->name();
  112. ui->label_BluetoothName->setText(name_info);
  113. ui->pushButton_StopScan->setEnabled( false); //设置停止扫描蓝牙的按钮不可用
  114. ui->plainTextEdit_BluetoothInfiShow->setEnabled( false); //设置不可编辑
  115. }
  116. MainWindow::~MainWindow()
  117. {
  118. delete ui;
  119. delete discoveryAgent;
  120. delete localDevice;
  121. delete socket;
  122. }
  123. void MainWindow::on_pushButton_OpenBluetooth_clicked()
  124. {
  125. /*请求打开蓝牙设备*/
  126. localDevice->powerOn();
  127. ui->pushButton_OpenBluetooth->setEnabled( false); //打开按钮
  128. ui->pushButton_CloseBluetooth->setEnabled( true); //关闭按钮
  129. ui->pushButton_BluetoothScan->setEnabled( true); //设置扫描按钮可用
  130. ui->pushButton_StopScan->setEnabled( true);
  131. }
  132. void MainWindow::on_pushButton_CloseBluetooth_clicked()
  133. {
  134. /*关闭蓝牙设备*/
  135. localDevice->setHostMode(QBluetoothLocalDevice::HostPoweredOff);
  136. ui->pushButton_OpenBluetooth->setEnabled( true); //打开按钮
  137. ui->pushButton_CloseBluetooth->setEnabled( false); //关闭按钮
  138. ui->pushButton_BluetoothScan->setEnabled( false); //设置扫描按钮不可用
  139. ui->pushButton_StopScan->setEnabled( false);
  140. }
  141. void MainWindow::on_pushButton_BluetoothScan_clicked()
  142. {
  143. /*开始扫描周围的蓝牙设备*/
  144. discoveryAgent->start();
  145. ui->comboBox_BluetoothDevice->clear(); //清除条目
  146. ui->pushButton_BluetoothScan->setEnabled( false); //设置扫描按钮不可用
  147. ui->pushButton_StopScan->setEnabled( true); //设置停止扫描按钮可用
  148. }
  149. void MainWindow::on_pushButton_StopScan_clicked()
  150. {
  151. /*停止扫描周围的蓝牙设备*/
  152. discoveryAgent->stop();
  153. ui->pushButton_StopScan->setEnabled( false); //设置停止扫描按钮不可用
  154. ui->pushButton_BluetoothScan->setEnabled( true); //设置扫描按钮可用
  155. }
  156. /*当扫描到周围的设备时会调用当前的槽函数*/
  157. void MainWindow::addBlueToothDevicesToList(const QBluetoothDeviceInfo &info)
  158. {
  159. // QString label = QString("%1 %2").arg(info.name()).arg(info.address().toString());
  160. QString label = QString( "%1 %2").arg(info.address().toString()).arg(info.name());
  161. ui->comboBox_BluetoothDevice->addItem(label); //添加字符串到comboBox上
  162. }
  163. //有数据可读
  164. void MainWindow::readBluetoothDataEvent()
  165. {
  166. QByteArray all = socket->readAll();
  167. ui->plainTextEdit_BluetoothInfiShow->insertPlainText(QString::fromLocal8Bit(all));
  168. }
  169. //建立连接
  170. void MainWindow::bluetoothConnectedEvent()
  171. {
  172. QMessageBox::information( this,tr( "连接提示"), "蓝牙连接成功!");
  173. /*停止扫描周围的蓝牙设备*/
  174. discoveryAgent->stop();
  175. ui->pushButton_StopScan->setEnabled( false); //设置停止扫描按钮不可用
  176. ui->pushButton_BluetoothScan->setEnabled( false); //设置扫描按钮不可用
  177. }
  178. //断开连接
  179. void MainWindow::bluetoothDisconnectedEvent()
  180. {
  181. QMessageBox::information( this,tr( "连接提示"), "蓝牙断开连接!");
  182. ui->pushButton_BluetoothScan->setEnabled( true); //设置扫描按钮可用
  183. }
  184. /*
  185. 在说蓝牙设备连接之前,不得不提一个非常重要的概念,就是蓝牙的Uuid,引用一下百度的:
  186. 在蓝牙中,每个服务和服务属性都唯一地由"全球唯一标识符" (UUID)来校验。
  187. 正如它的名字所暗示的,每一个这样的标识符都要在时空上保证唯一。
  188. UUID类可表现为短整形(16或32位)和长整形(128位)UUID。
  189. 他提供了分别利用String和16位或32位数值来创建类的构造函数,提供了一个可以比较两个UUID(如果两个都是128位)的方法,还有一个可以转换一个UUID为一个字符串的方法。
  190. UUID实例是不可改变的(immutable),只有被UUID标示的服务可以被发现。
  191. 在Linux下你用一个命令uuidgen -t可以生成一个UUID值;
  192. 在Windows下则执行命令uuidgen 。UUID看起来就像如下的这个形式:2d266186-01fb-47c2-8d9f-10b8ec891363。当使用生成的UUID去创建一个UUID对象,你可以去掉连字符。
  193. */
  194. //发送数据
  195. void MainWindow::on_pushButton_SendData_clicked()
  196. {
  197. QString text=ui->lineEdit_SendData->text();
  198. QByteArray send_data=text.toLocal8Bit();
  199. socket->write(send_data); //发送数据
  200. }
  201. //清空收到的数据
  202. void MainWindow::on_pushButton_Clear_clicked()
  203. {
  204. ui->plainTextEdit_BluetoothInfiShow->setPlainText( "");
  205. }
  206. //连接蓝牙
  207. void MainWindow::on_pushButton_ConnectDev_clicked()
  208. {
  209. QString text = ui->comboBox_BluetoothDevice->currentText();
  210. int index = text.indexOf( ' ');
  211. if(index == -1) return;
  212. QBluetoothAddress address(text.left(index));
  213. QString connect_device= "开始连接蓝牙设备:\n";
  214. connect_device+=ui->comboBox_BluetoothDevice->currentText();
  215. QMessageBox::information( this,tr( "连接提示"),connect_device);
  216. //开始连接蓝牙设备
  217. socket->connectToService(address, QBluetoothUuid(serviceUuid) ,QIODevice::ReadWrite);
  218. }
  219. //帮助提示
  220. void MainWindow::on_pushButton_help_clicked()
  221. {
  222. QMessageBox::information( this,tr( "帮助提示"), "本软件用于HC-05/06系列串口蓝牙调试!\n"
  223. "不支持BLE4.0版本蓝牙调试!\n"
  224. "软件作者:DS小龙哥\n"
  225. "BUG反馈:1126626497@qq.com");
  226. }

 

 

 


转载:https://blog.csdn.net/xiaolong1126626497/article/details/117249111
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场