[英]How to update advertisingdata in QT bluetooth advertising
我目前正在將qt用於項目。 我想通過藍牙廣告來廣告異步計算的結果。
我正在像這樣的BluetoothAdvertisingClass中設置廣告商
void BLEServer::startAdvertising(QString string){
advertisingData.setDiscoverability(QLowEnergyAdvertisingData::DiscoverabilityGeneral);
advertisingData.setIncludePowerLevel(true);
advertisingData.setLocalName("Server");
advertisingData.setServices(QList<QBluetoothUuid>() << QBluetoothUuid::HeartRate);
advertisingData.setManufacturerData(manufacturereID,buildDataPackage(string));
QLowEnergyCharacteristicData charData;
charData.setUuid(QBluetoothUuid::HeartRateMeasurement);
charData.setValue(QByteArray(2, 0));
charData.setProperties(QLowEnergyCharacteristic::Notify);
const QLowEnergyDescriptorData clientConfig(QBluetoothUuid::ClientCharacteristicConfiguration,
QByteArray(2, 0));
charData.addDescriptor(clientConfig);
QLowEnergyServiceData serviceData;
serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary);
serviceData.setUuid(QBluetoothUuid::HeartRate);
serviceData.addCharacteristic(charData);
leController = QSharedPointer<QLowEnergyController>(QLowEnergyController::createPeripheral());
QScopedPointer<QLowEnergyService> service(leController->addService(serviceData));
advertisingParameters = QLowEnergyAdvertisingParameters();
advertisingParameters.setMode(QLowEnergyAdvertisingParameters::AdvNonConnInd);
leController->startAdvertising(advertisingParameters, advertisingData, advertisingData);
}
我在BLESErver.h文件中具有如下所示的變量leControler,advertisngData和manufatcurer id defind
QSharedPointer<QLowEnergyController> leController;
QLowEnergyAdvertisingData advertisingData;
int manufacturereID = 1775;
像這樣定義將dataPackage作為ByteArray構建的函數
QByteArray BLEHServer::buildDataPackage(QString string){
QByteArray stringArray = string.toLocal8Bit();
return stringArray;
}
問題在於我想相當頻繁地更改廣告價值,而且我不確定如何正確執行廣告操作,甚至不確定廣告是否打算這樣做。
目前,我只是在開始新的廣告客戶,然后在停止舊的廣告客戶,但是我想那不是預期的。 看起來像這樣:
void BLEServer::changeAdvertisingData(QString string){
try {
//Stopping Advertising and creating a new Controller
leController->stopAdvertising();
leController = QSharedPointer<QLowEnergyController>(QLowEnergyController::createPeripheral());
//Create new Advertising Data and swapping it with the old ones
QLowEnergyAdvertisingData newAdvertisingData;
newAdvertisingData.setDiscoverability(QLowEnergyAdvertisingData::DiscoverabilityGeneral);
newAdvertisingData.setIncludePowerLevel(true);
newAdvertisingData.setLocalName("Anki");
newAdvertisingData.setServices(QList<QBluetoothUuid>() << QBluetoothUuid::HeartRate);
newAdvertisingData.setManufacturerData(manufacturereID,buildDataPackage(string));
advertisingData.swap(newAdvertisingData);
//Start to advertise new Data
leController->startAdvertising(advertisingParameters, advertisingData, advertisingData);
} catch (QException e){
throw(e);
}
}
當我經常這樣做時,這種停止和重新啟動會帶來麻煩,有時可能會發生。
有更好的方法嗎?
而不是開始/停止廣告,您應該保存對QBluetoothService對象的引用(在您的代碼中,它是心跳服務),並更新服務類的數據。 當下一個廣告包到期時,廣告將自動獲取新值。
另外,如果您正在編寫發送方和接收方,則可以使用setRawData()函數為數據包設置任意的31字節數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.