Qt 蓝牙:如何重新连接到服务?

时间:2021-03-10 17:07:27

标签: c++ qt bluetooth

我正在开发具有两个特性的蓝牙服务:一个是让其他设备读取 MAC 地址列表,另一个是为程序编写命令。 一切正常,唯一的问题是当我与主服务断开连接然后重新连接时,我可以看到两个服务,但无法读取或写入。 这是代码:

static const QLatin1String serviceUuid("11223344-5566-7788-99aa-bbccddeeff00");
    static const QLatin1String readListUuid("11223344-5566-7788-99aa-bbccddeeff11");
    static const QLatin1String writeListUuid("11223344-5566-7788-99aa-bbccddeeff12");

    // [Advertising Data]
        QLowEnergyAdvertisingData advertisingData;
        advertisingData.setDiscoverability(QLowEnergyAdvertisingData::DiscoverabilityGeneral);
        advertisingData.setIncludePowerLevel(true);
        advertisingData.setLocalName("BOX");
        advertisingData.setServices(QList<QBluetoothUuid>() << QBluetoothUuid(serviceUuid));

    // [Service Data]
        QLowEnergyCharacteristicData readList,writeList;

        readList.setUuid(QBluetoothUuid(readListUuid));
        readList.setProperties(QLowEnergyCharacteristic::Read);

        writeList.setUuid(QBluetoothUuid(writeListUuid));
        writeList.setProperties(QLowEnergyCharacteristic::Write);

        const QLowEnergyDescriptorData clientConfig(QBluetoothUuid::CharacteristicUserDescription,QByteArray(2, 0));
        readList.addDescriptor(clientConfig);
        writeList.addDescriptor(clientConfig);

        QLowEnergyServiceData serviceData;
        serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary);
        serviceData.setUuid(QBluetoothUuid(serviceUuid));
        serviceData.addCharacteristic(readList);
        serviceData.addCharacteristic(writeList);


    // [Start Advertising]

        leController.reset(QLowEnergyController::createPeripheral());
        service_list.reset(leController->addService(serviceData));
        leController->startAdvertising(QLowEnergyAdvertisingParameters(), advertisingData,advertisingData);



    qCDebug(BLELog) << " Start BLE backend [...] ";

    ConnectionHandler connectionHandler;
    DeviceHandler m_deviceHandler;


    // TODO! Restore debug options.
    GenericDeviceIf::start(debugMode, protocolDebug);

    // Initialize reachable state to unreachable.
    DataModel::getInstance()->setDeviceCategoryReachable(_category, false);

    _endpoints = DataModel::getInstance() ->getEndpointsListByCategory(dataBaseClasses::ENDPOINT_CATEGORY_BLE);

    m_deviceHandler.setDevice(nullptr);
    qDeleteAll(devices);
    devices.clear();

    emit devicesChanged();

    qCDebug(BLELog) << "Scanning for devices...";

    discoveryAgent->start(QBluetoothDeviceDiscoveryAgent::LowEnergyMethod);

    emit scanningChanged();

    // [Retrieving the list of devices]

        QLowEnergyCharacteristic characteristic = service_list->characteristic(QBluetoothUuid(readListUuid));
        QString sep = "\n";
        for (const auto &e: _endpoints){
            L.append(QString(e->getName()).toUtf8());
            L.append(QString("\t").toUtf8());
            L.append(QString(e->getMapping()).toUtf8());
            L.append(QString(sep.toUtf8()));
        }
        L.resize(L.size()-1);

        if (L.isEmpty())
            qCDebug(BLELog) << "No endpoints loaded in the list";
        else
            service_list -> writeCharacteristic(characteristic, L) ;


   // [Reconnect to the service when it disconnects]
        auto reconnect = [this , serviceData, advertisingData]()
        {
            service_list.reset(leController->addService(serviceData));
            if (!service_list.isNull()) {
                leController->startAdvertising(QLowEnergyAdvertisingParameters(), advertisingData, advertisingData);
            }
        };

        auto getCommand = [this, serviceData, advertisingData]()
        {
            command = service_list->characteristic(QBluetoothUuid(writeListUuid)).value();
            qCDebug(BLELog) << command;
        };

        QObject::connect(leController.data(), &QLowEnergyController::disconnected, reconnect);
        QObject::connect(service_list.get() , &QLowEnergyService::characteristicChanged, getCommand);

在头文件中 service_list 和 leController 定义如下:

QScopedPointer<QLowEnergyController> leController;
QScopedPointer<QLowEnergyService> service_list;

我根据心率服务器示例编写了代码。

0 个答案:

没有答案