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