Невозможно изменить рекламный сервис QtBluetooth - PullRequest
0 голосов
/ 07 октября 2018

Я экспериментировал с примерами 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, &currentHeartRate, &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();
}
...