繁体   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