QT on Android 编写蓝牙使用HC-05

 

前言:

        由于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指进行链接蓝牙设备,读写信息!

先看看我的蓝牙配置界面QT on Android 编写蓝牙使用HC-05_第1张图片

 

 

在蓝牙使用的时候,还很多属性,其中就有是否蓝牙被发现的要求!

 

 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();
    //。。。
}

 

以上就是数据读取的操函数了,我们可以在里面进行数据读取!

到这里就差不多了!以下是我的运行效果!

 

 

QT on Android 编写蓝牙使用HC-05_第2张图片

QT on Android 编写蓝牙使用HC-05_第3张图片

当我们完成这些工作后,就可以使用HC-05和STM32通讯,做些很好的东西!

 

欢迎大家指教不足!

 

代码可以到我的github上参考:GitHub

你可能感兴趣的:(QT)