Qt5.15藍(lán)牙開發(fā)指南之典型用法

使用 Qt 藍(lán)牙 API 的典型用例是:

檢索有關(guān)本地藍(lán)牙設(shè)備的信息。

掃描范圍內(nèi)的其他藍(lán)牙設(shè)備并檢索有關(guān)它們的信息。

使用 OBEX 對象推送配置文件 (OPP) 將文件推送到遠(yuǎn)程設(shè)備

使用串行端口配置文件 (SPP) 通過 RFCOMM 通道連接到遠(yuǎn)程設(shè)備。

創(chuàng)建一個允許使用 SPP 的傳入連接的 RFCOMM 服務(wù)器。

檢索有關(guān)低功耗藍(lán)牙設(shè)備的規(guī)范。

連接到低功耗藍(lán)牙設(shè)備。

從低功耗藍(lán)牙設(shè)備接收廣告。

請注意,Android 和 Windows 不支持對象推送配置文件。

注意:部分 RFCOMM 功能不能由 Qt 在 Windows 上配置。服務(wù)的ServiceClassIds和ProtocolDescriptorList是自動填充的。因此,使用這些字段的自定義值注冊服務(wù)可能不會在 Windows 上產(chǎn)生預(yù)期的結(jié)果。

注意:?Win32 后端不支持接收信號強度指示器 (RSSI) 以及藍(lán)牙 LE 設(shè)備宣傳的制造商特定數(shù)據(jù)。此外,只能找到之前已通過 Windows 設(shè)置配對的設(shè)備。

檢索本地設(shè)備信息

Qt 藍(lán)牙 API 有三個主要用途。第一個是獲取本地和遠(yuǎn)程設(shè)備信息。檢索設(shè)備信息的第一步是檢查設(shè)備上的藍(lán)牙是否可用,并讀取本地設(shè)備地址和名稱。QBluetoothLocalDevice是提供所有這些信息的類。此外,您可以使用它來打開/關(guān)閉藍(lán)牙、設(shè)置設(shè)備的可見性并確定當(dāng)前連接。

QBluetoothLocalDevice?localDevice;QString?localDeviceName;//?Check?if?Bluetooth?is?available?on?this?deviceif?(localDevice.isValid())?{

????//?Turn?Bluetooth?on

????localDevice.powerOn();

????//?Read?local?device?name

????localDeviceName?=?localDevice.name();

????//?Make?it?visible?to?others

????localDevice.setHostMode(QBluetoothLocalDevice::HostDiscoverable);

????//?Get?connected?devices

????QList<QBluetoothAddress>?remotes;

????remotes?=?localDevice.connectedDevices();}

掃描藍(lán)牙設(shè)備

與QBluetoothLocalDevice類似,API 提供QBluetoothDeviceInfo,它為遠(yuǎn)程設(shè)備提供類似的信息。盡管您可以自己創(chuàng)建QBluetoothDeviceInfo對象并用數(shù)據(jù)填充它們,但更簡單的方法是使用QBluetoothDeviceDiscoveryAgent開始自動搜索可連接范圍內(nèi)的可見藍(lán)牙設(shè)備。

void?MyClass::startDeviceDiscovery(){

????//?Create?a?discovery?agent?and?connect?to?its?signals

????QBluetoothDeviceDiscoveryAgent?*discoveryAgent?=?new?QBluetoothDeviceDiscoveryAgent(this);

????connect(discoveryAgent,?SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),

????????????this,?SLOT(deviceDiscovered(QBluetoothDeviceInfo)));

????//?Start?a?discovery

????discoveryAgent->start();

????//...}//?In?your?local?slot,?read?information?about?the?found?devicesvoid?MyClass::deviceDiscovered(const?QBluetoothDeviceInfo?&device){

????qDebug()?<<?"Found?new?device:"?<<?device.name()?<<?'('?<<?device.address().toString()?<<?')';}

將文件推送到遠(yuǎn)程設(shè)備

找到所需設(shè)備后,Qt 藍(lán)牙提供了兩個主要用例。更簡單的一種是通過 Obex 對象推送配置文件 (OPP) 發(fā)送文件。顧名思義,此配置文件可以將文件從一臺設(shè)備推送到另一臺設(shè)備。目前無法拉取文件或瀏覽遠(yuǎn)程文件系統(tǒng)。該配置文件不需要在交換數(shù)據(jù)之前將兩個設(shè)備配對。要將文件推送到遠(yuǎn)程設(shè)備,請創(chuàng)建一個QBluetoothTransferRequest并要求QBluetoothTransferManager通過調(diào)用其put()函數(shù)來推送包含在請求中的文件。

//?Create?a?transfer?managerQBluetoothTransferManager?*transferManager?=?new?QBluetoothTransferManager(this);//?Create?the?transfer?request?and?file?to?be?sentQBluetoothAddress?remoteAddress("00:11:22:33:44:55:66");QBluetoothTransferRequest?request(remoteAddress);QFile?*file?=?new?QFile("testfile.txt");//?Ask?the?transfer?manager?to?send?itQBluetoothTransferReply?*reply?=?transferManager->put(request,?file);if?(reply->error()?==?QBluetoothTransferReply::NoError)?{

????//?Connect?to?the?reply's?signals?to?be?informed?about?the?status?and?do?cleanups?when?done

????QObject::connect(reply,?SIGNAL(finished(QBluetoothTransferReply*)),

?????????????????????this,?SLOT(transferFinished(QBluetoothTransferReply*)));

????QObject::connect(reply,?SIGNAL(error(QBluetoothTransferReply::TransferError)),

?????????????????????this,?SLOT(error(QBluetoothTransferReply::TransferError)));}?else?{

????qWarning()?<<?"Cannot?push?testfile.txt:"?<<?reply->errorString();}

在設(shè)備之間交換數(shù)據(jù)

在兩個啟用藍(lán)牙的設(shè)備之間進(jìn)行通信的更靈活的方法是創(chuàng)建一個虛擬串行端口連接并通過該連接自由交換數(shù)據(jù)。這可以通過串行端口配置文件 (SPP) 來完成。串行端口配置文件模擬通過藍(lán)牙傳輸協(xié)議 RFCOMM 的串行連接。

為了能夠接收傳入的 SPP 連接,您需要使用QBluetoothServer監(jiān)聽傳入的連接。

rfcommServer?=?new?QBluetoothServer(QBluetoothServiceInfo::RfcommProtocol,?this);connect(rfcommServer,?&QBluetoothServer::newConnection,

????????this,?QOverload<>::of(&ChatServer::clientConnected));bool?result?=?rfcommServer->listen(localAdapter);if?(!result)?{

????qWarning()?<<?"Cannot?bind?chat?server?to"?<<?localAdapter.toString();

????return;}

使用QBluetoothSocket從扮演客戶端角色的另一臺設(shè)備連接到此服務(wù)器:

void?ChatClient::startClient(const?QBluetoothServiceInfo?&remoteService){

????if?(socket)

????????return;

????//?Connect?to?service

????socket?=?new?QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);

????qDebug()?<<?"Create?socket";

????socket->connectToService(remoteService);

????qDebug()?<<?"ConnectToService?done";

????connect(socket,?&QBluetoothSocket::readyRead,?this,?&ChatClient::readSocket);

????connect(socket,?&QBluetoothSocket::connected,?this,?QOverload<>::of(&ChatClient::connected));

????connect(socket,?&QBluetoothSocket::disconnected,?this,?&ChatClient::disconnected);

????connect(socket,?QOverload<QBluetoothSocket::SocketError>::of(&QBluetoothSocket::error),

????????????this,?&ChatClient::onSocketErrorOccurred);}

使用這種連接允許雙向交換任何形式的數(shù)據(jù)。它非常適合游戲或在兩個設(shè)備上的應(yīng)用程序的兩個實例之間同步狀態(tài)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最近項目使用藍(lán)牙,之前并沒有接觸,還是發(fā)現(xiàn)了很多坑,查閱了很多資料,說的迷迷糊糊,今天特查看官方文檔。 說下遇到的...
    King9527閱讀 1,924評論 0 1
  • 一、前言: 普通藍(lán)牙設(shè)備官方文檔 Android 平臺包含藍(lán)牙網(wǎng)絡(luò)堆棧支持,憑借此支持,設(shè)備能以無線方式與其他藍(lán)牙...
    因為我的心閱讀 8,866評論 1 9
  • 前言 在眾多的消費電子類產(chǎn)品中,藍(lán)牙作為一種簡易的通訊方式,因此功耗小、體積小、成本低等優(yōu)勢,被廣泛的應(yīng)用于耳機(jī)、...
    心若冰清_閱讀 2,585評論 0 10
  • 聲明 普通藍(lán)牙設(shè)備官方文檔 Android 平臺包含藍(lán)牙網(wǎng)絡(luò)堆棧支持,憑借此支持,設(shè)備能以無線方式與其他藍(lán)牙設(shè)備交...
    bug喵喵閱讀 696評論 0 0
  • 普通藍(lán)牙設(shè)備官方文檔 Android 平臺包含藍(lán)牙網(wǎng)絡(luò)堆棧支持,憑借此支持,設(shè)備能以無線方式與其他藍(lán)牙設(shè)備交換數(shù)據(jù)...
    sydMobile閱讀 69,835評論 5 43

友情鏈接更多精彩內(nèi)容