Я экспериментировал с примерами BLE Heart Rate Server и BLE Scanner и добился успеха в получении Qualcomm DragonBoard 410C и телефона Android для совместной работы и обнаружения службы Heart Rate.Проблема в том, что теперь, когда я изменил исходный пример BLE Heart Rate Server, теперь QBluetoothUuid :: HeartRate теперь QBluetoothUuid :: BatteryService, а QBluetoothUuid :: HeartRateMeasurement теперь QBluetoothUuid :: BatteryLevel, приложение сканера BLE на Android по-прежнему сообщает«HeartRateServer» имеет службу HeartRate вместо BatteryService.Я выключил оба устройства и не могу понять, почему это происходит.
Ниже мой сервер сердечного ритма BLE, модифицированный main.cpp.Я проверяю все значения serviceUuid из advertisingData и serviceData в операторах std :: cout << "service:", все они выдают 6159, что ожидается, BatteryUervice uuid.Я также изменил localName на «HeartRateServ», чтобы убедиться, что телефон Android действительно читает новое устройство, и это так, поэтому проблема не в этом. </p>
int main(int argc, char *argv[])
{
QLoggingCategory::setFilterRules(QStringLiteral("qt.bluetooth* = true"));
QCoreApplication app(argc, argv);
//! [Advertising Data]
QLowEnergyAdvertisingData advertisingData;
advertisingData.setDiscoverability(QLowEnergyAdvertisingData::DiscoverabilityGeneral);
advertisingData.setIncludePowerLevel(true);
advertisingData.setLocalName("HeartRateServ");
advertisingData.setServices(QList<QBluetoothUuid>() << QBluetoothUuid(QBluetoothUuid::BatteryService));
std::cout << "service: " << advertisingData.services()[0].data1 << std::endl;
//! [Advertising Data]
//! [Service Data]
QLowEnergyCharacteristicData charData;
charData.setUuid(QBluetoothUuid::BatteryLevel);
charData.setValue(QByteArray(1, 50));
charData.setProperties(QLowEnergyCharacteristic::Notify);
const QLowEnergyDescriptorData clientConfig(QBluetoothUuid::ClientCharacteristicConfiguration,
QByteArray(2, 0));
charData.addDescriptor(clientConfig);
QLowEnergyServiceData serviceData;
serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary);
serviceData.setUuid(QBluetoothUuid(QBluetoothUuid::BatteryService));
serviceData.addCharacteristic(charData);
//! [Service Data]
//! [Start Advertising]
const QScopedPointer<QLowEnergyController> leController(QLowEnergyController::createPeripheral());
const QScopedPointer<QLowEnergyService> service(leController->addService(serviceData));
std::cout << "service: " << advertisingData.services()[0].data1 << std::endl;
std::cout << "service2: " << serviceData.uuid().data1 << std::endl;
leController->startAdvertising(QLowEnergyAdvertisingParameters(), advertisingData, advertisingData);
std::cout << "service3: " << advertisingData.services()[0].data1 << std::endl;
std::cout << "service4: " << serviceData.uuid().data1 << std::endl;
//! [Start Advertising]
//! [Provide Heartbeat]
// QTimer heartbeatTimer;
// quint8 currentHeartRate = 60;
// enum ValueChange { ValueUp, ValueDown } valueChange = ValueUp;
// const auto heartbeatProvider = [&service, ¤tHeartRate, &valueChange]() {
// QByteArray value;
// value.append(char(0)); // Flags that specify the format of the value.
// value.append(char(currentHeartRate)); // Actual value.
// QLowEnergyCharacteristic characteristic
// = service->characteristic(QBluetoothUuid::HeartRateMeasurement);
// Q_ASSERT(characteristic.isValid());
// service->writeCharacteristic(characteristic, value); // Potentially causes notification.
// if (currentHeartRate == 60)
// valueChange = ValueUp;
// else if (currentHeartRate == 100)
// valueChange = ValueDown;
// if (valueChange == ValueUp)
// ++currentHeartRate;
// else
// --currentHeartRate;
// };
// QObject::connect(&heartbeatTimer, &QTimer::timeout, heartbeatProvider);
// heartbeatTimer.start(1000);
// //! [Provide Heartbeat]
QByteArray value;
value.append(char(51));
service->writeCharacteristic(service->characteristic(QBluetoothUuid::BatteryLevel), value);
auto reconnect = [&leController, advertisingData]() {
leController->startAdvertising(QLowEnergyAdvertisingParameters(), advertisingData,
advertisingData);
};
QObject::connect(leController.data(), &QLowEnergyController::disconnected, reconnect);
return app.exec();
}