簡體   English   中英

如何在QT藍牙廣告中更新adsdata

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM