摘要:前段時間用QT寫了一個串口調試助手,感受還能夠。由於QT是跨平臺的,一樣一套代碼能夠在windows上面跑,也能夠在linux上面跑,也能夠在安卓手機上面跑。並且不須要修改任何東西,編譯器會自動給你生成好,這就很是的方便。既然能夠在手機上面跑,那麼我把串口改爲藍牙不就是一個藍牙APP了嗎?說幹就幹,網上關於QT開發藍牙的已經有相關的資料了,因而乎就綜合各方面資料,整合了一個藍牙APP。linux
作這個app不須要任何的Java的知識,你只要會QT最基本的C++基礎就能夠了。關於代碼,我會在文章末尾放上連接。只有你手頭有藍牙模塊(HC-05)和安卓手機就能夠實現藍牙APP的功能。windows
一、藍牙:HC-05,(淘寶上有賣),它的接口就是跟串口同樣的,咱們用到了TX,RX,GND,VCC四個引腳。跟下位機或者用CH340G TTL轉USB模塊接到PC機上。藍牙工做在串口模式能夠經過AT指令調節。具體參考藍牙配套的說明文檔,最主要的就是請將藍牙設定爲從機模式,不然安卓手機搜尋連接不上。markdown
二、安卓手機:我這裏測試用了1檯安卓手機,一臺是華爲榮耀V10,安卓版本10。app
本項目Qt版本是5.13.7,系統是windows 10 x64socket
由於第一次作藍牙,就作一個很是簡單的雛形,實現藍牙狀態檢測、藍牙的開關、藍牙的掃描和藍牙配對連接,而且能像串口助手同樣完成數據收發。如圖,就是本一開始作的最簡單的軟件界面,本軟件基於mainwinodw控件製做,固然你能夠選擇其餘的,更能夠本身定義類。函數
![](img-blog.csdnimg.cn/20210323140… =350x700)oop
藍牙打開後經過掃描,會將藍牙的MAC地址還有名字顯示在List中,雙擊List列表中的藍牙,就會進入actived信號鏈接的槽函數,執行藍牙的配對鏈接。創建鏈接以後,就相似串口同樣能夠進行數據通訊了。測試
須要用到藍牙就須要在.pro文件中引入庫,須要在.pro文件中加入這句話:ui
QT += bluetooth
複製代碼
若是沒有這句話的話,包含藍牙目錄下的頭文件,會提示找不到該文件。以後就是要包含一些藍牙用到的頭文件:this
#include <QtBluetooth/qbluetoothglobal.h>
#include <QtBluetooth/qbluetoothlocaldevice.h>
#include <qbluetoothaddress.h>
#include <qbluetoothdevicediscoveryagent.h>
#include <qbluetoothlocaldevice.h>
#include <qbluetoothsocket.h>
複製代碼
請在類中聲明定義藍牙相關句柄:
QBluetoothDeviceDiscoveryAgent *discoveryAgent;//用來對周圍藍牙進行搜尋
QBluetoothLocalDevice *localDevice;//對本地設備進行操做,好比進行設備的打開,設備的關閉等等
QBluetoothSocket *socket;//就是用來進行藍牙配對連接和數據傳輸的
複製代碼
第一個discoveryAgent
是用來對周圍藍牙進行搜尋,localDevice
是對本地設備進行操做,好比進行設備的打開,設備的關閉等等。socket
就是用來進行藍牙配對連接和數據傳輸的。這裏要用到這三個。
在構造函數中,爲localDevice使用new運算符分配內存。
localDevice = new QBluetoothLocalDevice();
複製代碼
咱們如何來對藍牙進行打開和關閉呢?我在open按鈕和close按鈕的槽函數中對藍牙進行開關操做。localDevice->powerOn();方法調用打開本地的藍牙設備。在打開藍牙以前檢測手機是否已經打開了藍牙,若是沒打開就打開,若是打開了就提示藍牙已打開。
void MainWindow::on_pushButton_openBLE_clicked() {
if( localDevice->hostMode() == QBluetoothLocalDevice::HostPoweredOff)//開機沒有打開藍牙
{
localDevice->powerOn();//調用打開本地的藍牙設備
discoveryAgent->start();//開始掃描藍牙設備
}
else
{
QMessageBox::information(this, tr("成功"), tr("藍牙已打開"));
}
}
複製代碼
close按鈕的槽函數:
void MainWindow::on_pushButton_closeBLE_clicked() {
socket->close();
QMessageBox::information(this, tr("成功"), tr("已斷開鏈接"));
}
複製代碼
使用藍牙設備的查找,就要用到 discoveryAgent
這個類的實例化。咱們須要在構造函數中對discoveryAgent =new QBluetoothDeviceDiscoveryAgent();
分配內存。而後就可使用這個類的方法來對藍牙進行查找了。除此以外,還要進行一個信號和槽的連接。
connect(discoveryAgent,
SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
this,
SLOT(addBlueToothDevicesToList(QBluetoothDeviceInfo))
);
複製代碼
在咱們發現設備的時候,這個deviceDiscovered信號被觸發,進入到addBlueToothDevicesToList的函數中。在上面的軟件界面,咱們的最上面藍牙列表下的控件是ListIte控件,這裏作一個槽函數,將發現的設備打印到這個列表中列出來。
//在ListWidget上顯示查找到的藍牙設備
void MainWindow::addBlueToothDevicesToList(const QBluetoothDeviceInfo &info) {
QString label = QString("%1 %2").arg(info.address().toString()).arg(info.name());
QList<QListWidgetItem *> 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槽函數,在這個槽函數裏面就會進行藍牙的連接。
在說藍牙設備鏈接以前,不得不提一個很是重要的概念,就是藍牙的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的機制,以下:
static const QLatin1String serviceUuid("00001101-0000-1000-8000-00805F9B34FB");
複製代碼
這個字符串裏面的內容就是串口模式的Uuid,若是你開發的藍牙也是要使用串口,你直接Copy過去就能夠了,若是你使用其餘模式,本身去找這個Uuid碼是多少。
在使用藍牙創建鏈接,須要創建藍牙socket服務。請在構造函數中增長對socket的分配內存,要注意的是構造函數中的參數須要給定模式。
socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
複製代碼
在Qt文檔中,給了3中模式,具體如何這裏不作引伸,讀者須要請本身查詢文檔。但RfcommProtocol,屬於模擬RS232模式,我就叫串口模式了。當雙擊ItemList控件中的項目時候,會進入到actived槽函數和藍牙進行連接,那麼如何鏈接呢?在itemList中會打印一個藍牙的MAC地址信息,咱們會將這個Mac地址保存在QBluetoothAddress這個類的實例化中,並將這個address傳遞給socket,做爲連接依據。
//藍牙鏈接
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中也提供了豐富的槽函數,好比成功創建鏈接信號,成功斷開信號,這裏在槽函數中能夠作一些例子,這裏給出例子:
//藍牙鏈接設備成功後會中止搜索設備,顯示鏈接成功
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("已斷開鏈接"));
}
複製代碼
藍牙發送和接收數據,也是經過socket進行。發送數據十分簡單:
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函數,完成發送。發送以後,上位機,我用的串口助手會顯示該信息。 串口助手接受到信息,那麼接收數據呢? 咱們在構造函數中,須要創建這樣的一個信號和槽的連接:
connect(socket,
SIGNAL(readyRead()),
this,
SLOT(readBluetoothDataEvent())
);
複製代碼
readyRead()信號觸發,跳進readBluetoothDataEvent中。
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的全部步驟了,是否是很簡單啊!趕快下載源碼試一試吧!
公衆號後臺回覆:藍牙小車,便可獲取下載連接。