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