QT蓝牙库基础
1.目的
使用QT自帶的藍(lán)牙功能庫進(jìn)行學(xué)習(xí)開發(fā),了解藍(lán)牙設(shè)備的工作原理和使用流程,目的搭建可以自由控制的藍(lán)牙app,為以后的學(xué)習(xí)生活做基礎(chǔ)。
2.本地設(shè)備
采用自己vivo Y53的手機(jī)作為實(shí)驗(yàn)對象。
使用到的QT藍(lán)牙庫的類名:? QBluetoothLocalDevice
我們可以直接到QT軟件幫助文檔去搜索,如下圖所示:
我們可以了解到這個(gè)類適用于QT5.2以上版本
主要我們在新建的工程中加上頭文件和附加庫聲明。
#include <lQBluetoothLocalDevice.h> //本地設(shè)備驅(qū)動(dòng)頭文件private:QBluetoothLocalDevice *localDevice; //聲明變量在.pro中
QT += bluetooth為變量聲明新的空間:
localDevice = new QBluetoothLocalDevice();然后我們就能調(diào)用里面的函數(shù):
localDevice->address();??返回此藍(lán)牙設(shè)備的MAC地址。
localDevice->hostMode();? 返回此本地藍(lán)牙設(shè)備的當(dāng)前主機(jī)模式。
localDevice->powerOn(); 將設(shè)備返回hostMode()狀態(tài)后,如果關(guān)閉電源,則為設(shè)備供電
localDevice->pairingStatus(info.address());返回地址的當(dāng)前藍(lán)牙配對狀態(tài)(如果是未配對、配對或已授權(quán)。
localDevice->setHostMode(QBluetoothLocalDevice::HostPoweredOff);將此本地藍(lán)牙設(shè)備的主機(jī)模式設(shè)置為關(guān)閉模式。
3.搜索設(shè)備
用到第二個(gè)類:
QBluetoothDeviceDiscoveryAgent類-----------發(fā)現(xiàn)附近的藍(lán)牙設(shè)備。
?
#include <QBluetoothDeviceDiscoverAgent.h> //本地設(shè)備驅(qū)動(dòng)頭文件private:QBluetoothDeviceDiscoverAgent *discoveryAgent; //聲明變量 discoveryAgent= new QBluetoothLocalDevice();discoveryAgent->error(); //返回最后一個(gè)錯(cuò)誤
discoveryAgent->errorString(); //返回對最后一個(gè)錯(cuò)誤的描述
discoveryAgent->inquiryType(); //返回查詢類型
discoveryAgent->isActive(); //如果代理當(dāng)前正在發(fā)現(xiàn)藍(lán)牙設(shè)備,則返回true,否則返回false。
discoveryAgent->lowEnergyDiscoveryTimeout(); //返回一個(gè)以毫秒為單位的超時(shí),該超時(shí)應(yīng)用于藍(lán)牙低能耗設(shè)備搜索。值為-1意味著平臺(tái)不支持此屬性,并且無法調(diào)整設(shè)備搜索的超時(shí)。返回值為0意味著一個(gè)永無止境的搜索,必須通過stop()手動(dòng)停止搜索。
執(zhí)行函數(shù):
discoveryAgent->start(); //開始搜索設(shè)備 discoveryAgent->stop(); //停止搜索設(shè)備信號(hào)槽:
connect(discoveryAgent, SIGNAL(finished()), this, SLOT(findFinish())); //完成信號(hào)發(fā)出進(jìn)行動(dòng)作 connect(discoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)), this, SLOT(addBlueToothDevicesToList(QBluetoothDeviceInfo))); //當(dāng)發(fā)現(xiàn)info描述的藍(lán)牙設(shè)備時(shí)發(fā)出此信號(hào)來進(jìn)行動(dòng)作而canceled()? ? ?//當(dāng)設(shè)備發(fā)現(xiàn)被stop()調(diào)用中止時(shí)發(fā)出此信號(hào)。
同樣我們也可以使用error()來根據(jù)不同的錯(cuò)誤類型進(jìn)行不同的操作。
?
4.藍(lán)牙服務(wù)器代理
QBluetoothSocket:操作同上:
? socket->abort();//終止當(dāng)前連接并重置套接字。與disconnectFromService()不同,這個(gè)函數(shù)立即關(guān)閉套接字,丟棄寫緩沖區(qū)中的任何掛起的數(shù)據(jù)。
socket->disconnectFromService();//試圖關(guān)閉套接字。如果有等待寫入的掛起數(shù)據(jù),QBluetoothSocket將進(jìn)入ClosingState并等待所有數(shù)據(jù)被寫入。最后,它將進(jìn)入U(xiǎn)nconnectedState并發(fā)出disconnected()信號(hào)。
socket->localAddress();//返回本地設(shè)備的地址。
socket->localName();//返回本地設(shè)備的名稱。
socket->localPort();//如果可用,返回本地套接字的端口號(hào),否則返回0。雖然有些平臺(tái)可能有所不同,但套接字通常必須連接,以確保返回有效的端口號(hào)。
socket->setSocketDescriptor();//將套接字設(shè)置為使用socketDescriptor和socketType類型,socketType處于狀態(tài)、socketState和模式、openMode。
socket->connectToService(address, QBluetoothUuid(serviceUuid) ,QIODevice::ReadWrite); connect(socket,SIGNAL(readyRead()),this,SLOT(readBluetoothDataEvent())); //每當(dāng)有新數(shù)據(jù)可從設(shè)備當(dāng)前的讀取通道讀取時(shí),就會(huì)發(fā)出此信號(hào)一次。它只在新數(shù)據(jù)可用時(shí)才會(huì)再次發(fā)出,例如當(dāng)網(wǎng)絡(luò)數(shù)據(jù)的新負(fù)載到達(dá)您的網(wǎng)絡(luò)套接字時(shí),或者當(dāng)一個(gè)新的數(shù)據(jù)塊被添加到您的設(shè)備時(shí)。 connect(socket,SIGNAL(connected()),this,SLOT(bluetoothConnectedEvent()));//此信號(hào)在建立連接時(shí)發(fā)出。 connect(socket,SIGNAL(disconnected()),this,SLOT(bluetoothDisconnectedEvent()));//當(dāng)套接字?jǐn)嚅_時(shí)發(fā)出此信號(hào)。5.搜索連接藍(lán)牙設(shè)備
顯示可用的藍(lán)牙:
/* 在ListWidget上顯示查找到的藍(lán)牙設(shè)備 */ void Widget::addBlueToothDevicesToList(const QBluetoothDeviceInfo &info) {QString label = QString("%1 %2").arg(info.address().toString()).arg(info.name());//%1為藍(lán)牙設(shè)備的地址,%2為藍(lán)牙設(shè)備的名字QList<QListWidgetItem *> items = ui->listWidget->findItems(label, Qt::MatchExactly);if (items.empty()) {QListWidgetItem *item = new QListWidgetItem(label);QBluetoothLocalDevice::Pairing pairingStatus = localDevice->pairingStatus(info.address());/* 藍(lán)牙狀態(tài)pairingStatus,Pairing枚舉類型 0:Unpaired沒配對 1:Paired配對但沒授權(quán) 2:AuthorizedPaired配對且授權(quán) */if (pairingStatus == QBluetoothLocalDevice::Paired || pairingStatus == QBluetoothLocalDevice::AuthorizedPaired )item->setTextColor(QColor(Qt::green));elseitem->setTextColor(QColor(Qt::black));//輸出顯示ui->listWidget->addItem(item); } }雙擊屏幕產(chǎn)生信號(hào):
/* 藍(lán)牙連接 */ void Widget::connectBLE(QListWidgetItem *item) {QString text = item->text();int index = text.indexOf(' ');//到空格之前的字節(jié)大小if (index == -1)return;QBluetoothAddress address(text.left(index));//返回一個(gè)子字符串,該子字符串包含字符串最左邊的n個(gè)字符。QString name(text.mid(index + 1));//返回一個(gè)字符串,該字符串包含從指定的位置索引開始的n個(gè)字符。右邊QMessageBox::information(this,tr("Info"),tr("The device is connecting..."));//彈出提示框socket->connectToService(address, QBluetoothUuid(serviceUuid) ,QIODevice::ReadWrite);//建立連接 }總結(jié)
- 上一篇: 解决 java.lang.Illegal
- 下一篇: 阿里云物联网MQTT三元数生成