前言:
由于17年机械创新设计大赛要使用蓝牙通讯,被迫缺少一个触摸显示器,所以只有在手机上开发界面来进行控制,其中最主要的就是蓝牙通讯了!
学习QT这么久,今天发布第一篇QT博客!
在开始配置蓝牙的时候,最最重要的是在pro文件中添加蓝牙! 就是:
QT += bluetooth
这个蓝牙配置只可在Android上运行!
首先的就是配置一个蓝牙的类,这个类全局都要用到,所以我们不配置在MainWindow类中!
#ifndef BLT_H
#define BLT_H
#include
#include
#include
#include
#include
class BLT:public QObject
{
Q_OBJECT
public:
BLT(QObject *parent = nullptr);
QBluetoothDeviceDiscoveryAgent *discoveryAgent;
QBluetoothLocalDevice *localDevice;
QBluetoothSocket *socket;
public slots:
void bltScan();
};
#endif // BLT_H
#include "blt.h"
BLT::BLT(QObject *parent) : QObject(parent)
{
discoveryAgent = new QBluetoothDeviceDiscoveryAgent();
localDevice = new QBluetoothLocalDevice();
socket =new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
}
void BLT::bltScan(){
if(localDevice->hostMode() == QBluetoothLocalDevice::HostPoweredOff){
localDevice->powerOn();
}
discoveryAgent->setInquiryType(QBluetoothDeviceDiscoveryAgent::GeneralUnlimitedInquiry);
discoveryAgent->start();
}
QBluetoothLocalDevice 是指配置获取设备的蓝牙状态信息等! QBluetoothDeviceDiscoveryAgent 这个是指扫描周围蓝牙设备!
QBluetoothSocket指进行链接蓝牙设备,读写信息!
在蓝牙使用的时候,还很多属性,其中就有是否蓝牙被发现的要求!
connect(ui->checkBox_bltdiscover,SIGNAL(stateChanged(int)),this,SLOT(blt_if_Discover()));
void MainWindow::blt_if_Discover(){
if(ui->checkBox_bltdiscover->isChecked() == false){
blt->localDevice->hostMode() ==QBluetoothLocalDevice::HostDiscoverable;
}else{
blt->localDevice->hostMode() ==QBluetoothLocalDevice::HostConnectable;
}
}
以上是判断蓝牙是否隐藏!
在开始链接蓝牙的时候,我们首先要做的就是扫面周围的蓝牙设备!
connect(ui->pushButton_scanblt,SIGNAL(released()),blt,SLOT(bltScan()));
void BLT::bltScan(){
if(localDevice->hostMode() == QBluetoothLocalDevice::HostPoweredOff){
localDevice->powerOn();
}
discoveryAgent->setInquiryType(QBluetoothDeviceDiscoveryAgent::GeneralUnlimitedInquiry);
discoveryAgent->start();
}
扫面蓝牙前,检测蓝牙是否被打开,没有就打开蓝牙, 然后开始进行扫描蓝牙设备!
connect(blt->discoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
this, SLOT(bltDevDiscover(QBluetoothDeviceInfo)));
void MainWindow::bltDevDiscover(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 = blt->localDevice->pairingStatus(info.address());
if (pairingStatus == QBluetoothLocalDevice::Paired || pairingStatus == QBluetoothLocalDevice::AuthorizedPaired )
item->setTextColor(QColor(Qt::green));
else
item->setTextColor(QColor(Qt::black));
ui->listWidget->addItem(item);
}
}
这里我们建立扫描到蓝牙的信号机制,扫面到后就添加的listWidget中!这里是非常经典的界面操作!
connect(blt->discoveryAgent,SIGNAL(finished()),this,SLOT(scanFinshed()));
void MainWindow::scanFinshed(){
ui->textBrowser_infoback->setText(QStringLiteral("蓝牙扫描完成!:)么么哒"));
}
当扫描蓝牙设备结束后,就在textBrowser中显示,扫描完成!
connect(ui->listWidget,SIGNAL(itemActivated(QListWidgetItem*)),this,SLOT(itemActivated(QListWidgetItem*)));
static const QLatin1String serviceUuid("00001101-0000-1000-8000-00805F9B34FB");
void MainWindow::itemActivated(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));
QString temp = QString("%1").arg(Address.toString());
ui->textBrowser_infoback->append(QStringLiteral("你链接的蓝牙地址是:")+temp);
ui->textBrowser_infoback->append(QStringLiteral("你链接的蓝牙名字:")+name);
blt->socket->connectToService(Address, QBluetoothUuid(serviceUuid) ,QIODevice::ReadWrite);
connect(blt->socket,SIGNAL(connected()),this,SLOT(bltConnected()));
}
void MainWindow::bltConnected(){
ui->textBrowser_infoback->append(QStringLiteral("成功链接!"));
connect(blt->socket,SIGNAL(readyRead()),this,SLOT(bltReadMsg()));
}
扫描的设备,会显示在listWidget中,此时我们双击其中的内容,就可以链接相应的蓝牙设备!这里也是非常经典的界面操作!serviceUuid是指蓝牙表示符,这里我们使用的HC-05需要用蓝牙串口的标识符!具体的可以参考:点击打开链接。
此时链接的时候,如果链接上了,就会激发槽bltConnected()显示,蓝牙链接成功了!顺便建立蓝牙读书数据的信号槽: connect(blt->socket,SIGNAL(readyRead()),this,SLOT(bltReadMsg()));
void MainWindow::bltReadMsg(){
QByteArray get = blt->socket->readAll();
//。。。
}
以上就是数据读取的操函数了,我们可以在里面进行数据读取!
到这里就差不多了!以下是我的运行效果!
当我们完成这些工作后,就可以使用HC-05和STM32通讯,做些很好的东西!
欢迎大家指教不足!
代码可以到我的github上参考:GitHub