电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
基于QT的安卓手机蓝牙APP开发
分 享
扫描二维码分享
基于QT的安卓手机蓝牙APP开发
Qt
App
蓝牙APP
手机应用
果果小师弟
关注
发布时间: 2021-03-24
丨
阅读: 2104
前段时间用QT写了一个串口调试助手,感觉还可以。因为QT是跨平台的,同样一套代码可以在windows上面跑,也可以在linux上面跑,也可以在安卓手机上面跑。而且不需要修改任何东西,编译器会自动给你生成好,这就非常的方便。既然可以在手机上面跑,那么我把串口改成蓝牙不就是一个蓝牙APP了吗?说干就干,网上关于QT开发蓝牙的已经有相关的资料了,于是乎就综合各方面资料,整合了一个蓝牙APP。 做这个app不需要任何的Java的知识,你只要会QT最基本的C++基础就可以了。关于代码,我会在文章末尾放上链接。只有你手头有蓝牙模块(HC-05)和安卓手机就可以实现蓝牙APP的功能。 ## 一、软硬件平台 ### 1.1 硬件平台 1、蓝牙:HC-05,(淘宝上有卖),它的接口就是跟串口一样的,我们用到了TX,RX,GND,VCC四个引脚。跟下位机或者用CH340G TTL转USB模块接到PC机上。蓝牙工作在串口模式可以通过AT指令调节。具体参考蓝牙配套的说明文档,最主要的就是请将蓝牙设定为从机模式,否则安卓手机搜寻链接不上。 2、安卓手机:我这里测试用了1台安卓手机,一台是华为荣耀V10,安卓版本10。 ### 1.2 软件平台 本项目Qt版本是5.13.7,系统是windows 10 x64 ## 二、软件基本介绍 因为第一次做蓝牙,就做一个非常简单的雏形,实现蓝牙状态检测、蓝牙的开关、蓝牙的扫描和蓝牙配对链接,并且能像串口助手一样完成数据收发。如图,就是本一开始做的最简单的软件界面,本软件基于mainwinodw控件制作,当然你可以选择其他的,更可以自己定义类。 ![ ](https://img-blog.csdnimg.cn/20210323140330301.jpg#pic_center =350x700) 蓝牙打开后通过扫描,会将蓝牙的MAC地址还有名字显示在List中,双击List列表中的蓝牙,就会进入actived信号连接的槽函数,执行蓝牙的配对连接。建立连接之后,就类似串口一样可以进行数据通信了。 ## 三、 蓝牙开发 ### 3.1 项目文件准备 需要用到蓝牙就需要在.pro文件中引入库,需要在.pro文件中加入这句话: ```c QT += bluetooth ``` 如果没有这句话的话,包含蓝牙目录下的头文件,会提示找不到该文件。之后就是要包含一些蓝牙用到的头文件: ```c #include
#include
#include
#include
#include
#include
``` 请在类中声明定义蓝牙相关句柄: ```c QBluetoothDeviceDiscoveryAgent *discoveryAgent;//用来对周围蓝牙进行搜寻 QBluetoothLocalDevice *localDevice;//对本地设备进行操作,比如进行设备的打开,设备的关闭等等 QBluetoothSocket *socket;//就是用来进行蓝牙配对链接和数据传输的 ``` 第一个`discoveryAgent`是用来对周围蓝牙进行搜寻,`localDevice`是对本地设备进行操作,比如进行设备的打开,设备的关闭等等。`socket`就是用来进行蓝牙配对链接和数据传输的。这里要用到这三个。 ### 3.2 蓝牙开关和可见性设定 在构造函数中,为localDevice使用new运算符分配内存。 ```c localDevice = new QBluetoothLocalDevice(); ``` #### 1) 蓝牙开关 我们如何来对蓝牙进行打开和关闭呢?我在open按钮和close按钮的槽函数中对蓝牙进行开关操作。localDevice->powerOn();方法调用打开本地的蓝牙设备。在打开蓝牙之前检测手机是否已经打开了蓝牙,如果没打开就打开,如果打开了就提示蓝牙已打开。 ```c void MainWindow::on_pushButton_openBLE_clicked() { if( localDevice->hostMode() == QBluetoothLocalDevice::HostPoweredOff)//开机没有打开蓝牙 { localDevice->powerOn();//调用打开本地的蓝牙设备 discoveryAgent->start();//开始扫描蓝牙设备 } else { QMessageBox::information(this, tr("成功"), tr("蓝牙已打开")); } } ``` close按钮的槽函数: ```c void MainWindow::on_pushButton_closeBLE_clicked() { socket->close(); QMessageBox::information(this, tr("成功"), tr("已断开连接")); } ``` ### 3.3 蓝牙设备的查找 使用蓝牙设备的查找,就要用到 `discoveryAgent` 这个类的实例化。我们需要在构造函数中对`discoveryAgent =new QBluetoothDeviceDiscoveryAgent();`分配内存。然后就可以使用这个类的方法来对蓝牙进行查找了。除此之外,还要进行一个信号和槽的链接。 ```c connect(discoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)), this, SLOT(addBlueToothDevicesToList(QBluetoothDeviceInfo)) ); ``` 在我们发现设备的时候,这个deviceDiscovered信号被触发,进入到addBlueToothDevicesToList的函数中。在上面的软件界面,我们的最上面蓝牙列表下的控件是ListIte控件,这里做一个槽函数,将发现的设备打印到这个列表中列出来。 ```c //在ListWidget上显示查找到的蓝牙设备 void MainWindow::addBlueToothDevicesToList(const QBluetoothDeviceInfo &info) { QString label = QString("%1 %2").arg(info.address().toString()).arg(info.name()); QList
items = ui->listWidget->findItems(label, Qt::MatchExactly); 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->setTextColor(QColor(Qt::red)); else item->setTextColor(QColor(Qt::black)); ui->listWidget->addItem(item); } } ``` 这里给出这个函数,每一句话十分的好理解,这里增加点选操作,当点击listItem中的项目的时候,背景颜色会翻转,双击这个项目就会和这个蓝牙设备建立连接,这里有个actived槽函数,在这个槽函数里面就会进行蓝牙的链接。 ### 3.4 蓝牙设备的建立连接 在说蓝牙设备连接之前,不得不提一个非常重要的概念,就是蓝牙的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对象,你可以去掉连字符。 在我们的项目中,用到的模式是串口模式,我们需要建立一个存储Uuid的机制,如下: ```c static const QLatin1String serviceUuid("00001101-0000-1000-8000-00805F9B34FB"); ``` 这个字符串里面的内容就是串口模式的Uuid,如果你开发的蓝牙也是要使用串口,你直接Copy过去就可以了,如果你使用其他模式,自己去找这个Uuid码是多少。 在使用蓝牙建立连接,需要建立蓝牙socket服务。请在构造函数中增加对socket的分配内存,要注意的是构造函数中的参数需要给定模式。 ```c socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol); ``` 在Qt文档中,给了3中模式,具体如何这里不做引申,读者需要请自己查询文档。但RfcommProtocol,属于模拟RS232模式,我就叫串口模式了。当双击ItemList控件中的项目时候,会进入到actived槽函数和蓝牙进行链接,那么如何连接呢?在itemList中会打印一个蓝牙的MAC地址信息,我们会将这个Mac地址保存在QBluetoothAddress这个类的实例化中,并将这个address传递给socket,作为链接依据。 ```c //蓝牙连接 void MainWindow::connectBLE(QListWidgetItem *item) { QString text = item->text(); int index = text.indexOf(' '); if (index == -1) return; QBluetoothAddress address(text.left(index)); QString name(text.mid(index + 1)); QMessageBox::information(this,tr("提示"),tr("设备正在连接中...")); socket->connectToService(address, QBluetoothUuid(serviceUuid) ,QIODevice::ReadWrite); } ``` 我们通过对字符串的处理,将得到address信息。通过`socket->connectToService(....)`,把地址,Uuid,和蓝牙模式传递进去,当执行完这句话的时候,安卓手机开始和你选择的蓝牙设备进行链接。 同样在socket中也提供了丰富的槽函数,比如成功建立连接信号,成功断开信号,这里在槽函数中可以做一些例子,这里给出例子: ```c //蓝牙连接设备成功后会停止搜索设备,显示连接成功 connect(socket,SIGNAL(connected()),this,SLOT(connectOK())); //蓝牙连断开连接后,会显示已断开连接 connect(socket,SIGNAL(disconnected()),this,SLOT(connectNot())); //接受到上位机传来的数据后显示,会触发接受数据函数 connect(socket,SIGNAL(readyRead()),this,SLOT(readBluetoothDataEvent())); //连接成功 void MainWindow::connectOK() { discoveryAgent->stop(); //停止搜索设备 QMessageBox::information(this, tr("成功"), tr("连接成功!")); } //连接失败 void MainWindow::connectNot() { QMessageBox::information(this, tr("提示"), tr("已断开连接")); } ``` ### 3.5 发送和接收数据 蓝牙发送和接收数据,也是通过socket进行。发送数据十分简单: ```c void Widget::on_pushButton_send_clicked() { QByteArray arrayData; QString s("Welcome to pay attention to WeChat public number Guoguo young teachers\n"); socket->write(s.toUtf8()); } ``` 这里通过socket->write函数,完成发送。发送之后,上位机,我用的串口助手会显示该信息。 串口助手接受到信息,那么接收数据呢? 我们在构造函数中,需要建立这样的一个信号和槽的链接: ```c connect(socket, SIGNAL(readyRead()), this, SLOT(readBluetoothDataEvent()) ); ``` readyRead()信号触发,跳进readBluetoothDataEvent中。 ```c void Widget::readBluetoothDataEvent() { QByteArray line = socket->readAll(); QString strData = line.toHex(); comStr.append(strData); if(comStr.length() >= 4) { ui->textBrowser_info->append(comStr + "\n"); comStr.clear(); } } ``` 以上就是QT开发一个蓝牙APP的所有步骤了,是不是很简单啊!赶快下载源码试一试吧! 公众号后台回复:蓝牙小车,即可获取下载链接。 ![](https://cf03.ickimg.com/bbsimages/202103/a73cc975a604c7c5f77356fb57964038.png)
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
果果小师弟
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交