Как обновить рекламные данные в QT bluetooth рекламе - PullRequest
0 голосов
/ 17 декабря 2018

В настоящее время я использую qt для проекта.Я хочу объявить результат асинхронного вычисления через рекламу Bluetooth.

Я настраиваю рекламодателя, как в классе 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);

}

У меня есть переменная leControler, advertisngData иid manufatcurer определите следующим образом в файле BLESErver.h

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);
    }
}

Эта остановка и перезапуск приводит к удвоению, когда я делаю это довольно часто, что иногда может произойти.

Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 21 декабря 2018

Вместо того, чтобы запускать / останавливать рекламу, вам следует сохранить ссылку на объект QBluetoothService (в вашем коде это служба сердечного ритма) и обновить данные класса обслуживания.Рекламные объявления будут автоматически получать новые значения при наступлении следующего рекламного пакета.

В качестве альтернативы, если вы программируете отправителя и получателя, вы можете использовать функцию setRawData () для установки произвольных 31-байтовых данных дляпакеты.

...