В настоящее время я использую 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 и идентификатор производителя, которые определены следующим образом в файле BLESErver.h
QSharedPointer<QLowEnergyController> leController;
QLowEnergyAdvertisingData advertisingData;
int manufacturereID = 1775;
а функция для создания пакета данных как ByteArray определяется как this
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-байтовых данных для пакетов.
То, что вы упомянули, либо не работает, либо я делаю это неправильно. При редактировании службы я могу изменить только ее значение, но в моем случае мне нужно изменить значение AdvertisingData. Если я ошибаюсь, не могли бы вы привести более точный пример @ markus-nm?
Используйте «Пример сервера частоты пульса Bluetooth с низким энергопотреблением», чтобы увидеть, как обновляются данные пульса. doc.qt.io/qt-5/qtbluetooth-heartrate-server-example.html
Спасибо, Маркус, я пробовал это раньше, но это не сработало, хотя способ, которым я тестировал, был с приложением Bluetooth для телефона, которое, возможно, не обновлялось правильно. Я попробую, как только смогу, и сообщу об этом, помогло мне это или нет