侧边栏壁纸
博主头像
李振洋的博客博主等级

歌颂动荡的青春

  • 累计撰写 38 篇文章
  • 累计创建 6 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Qt BLE

Qt BLE开发

Qt6

loop.png

第一步

通过QBluetoothDeviceDiscoveryAgent类发现周围蓝牙设备,QList<QBluetoothDeviceInfo>

void BLEmgr::startScanBle()
{
    m_devicediscoveryagent = new QBluetoothDeviceDiscoveryAgent(this);
	//设置扫描时间
    m_devicediscoveryagent->setLowEnergyDiscoveryTimeout(15000);
	//开始扫描
    m_devicediscoveryagent->start(QBluetoothDeviceDiscoveryAgent::LowEnergyMethod);

    //蓝牙扫描 更新发现设备
    connect(m_devicediscoveryagent, &QBluetoothDeviceDiscoveryAgent::deviceDiscovered,
            this, &BLEmgr::refreshDevices);

    //错误
    connect(m_devicediscoveryagent, &QBluetoothDeviceDiscoveryAgent::errorOccurred,
            this, [](QBluetoothDeviceDiscoveryAgent::Error error){
                qDebug()<< "QBluetoothDeviceDiscoveryAgent error:  " << error;
            });

    //扫描完成
    connect(m_devicediscoveryagent, &QBluetoothDeviceDiscoveryAgent::finished, this, [this]() {
        qDebug()<< "QBluetoothDeviceDiscoveryAgent finished";
        m_devicediscoveryagent->deleteLater();
        emit device_discovery_finished();
    });

    //扫描取消
    connect(m_devicediscoveryagent, &QBluetoothDeviceDiscoveryAgent::canceled, this, [this]() {
        qDebug()<< "QBluetoothDeviceDiscoveryAgent canceled";
        m_devicediscoveryagent->deleteLater();
    });
}

void BLEmgr::refreshDevices()
{
    m_leDevices.clear();
    // 过滤Bluetooth LE
    qDebug()<<"refreshDevices";
    QList<QBluetoothDeviceInfo> deviceinfo = m_devicediscoveryagent->discoveredDevices();
    for (int var = 0; var < deviceinfo.length(); ++var) {
        if (deviceinfo[var].coreConfigurations() & QBluetoothDeviceInfo::LowEnergyCoreConfiguration) {
            m_leDevices.append(deviceinfo[var]);
        }
    }
    emit signals_refreshDevices();
}

第二步

连接蓝牙设备


void ToolPage::connectToDevice(QBluetoothDeviceInfo device)
{
    //ui->scanButton->setEnabled(false);
    //ui->connectButton->setEnabled(false);
    //ui->devicesListWidget->setEnabled(false);
    qDebug() <<  "connectToDevice";
    QString deviceIdentifier;
    if (!device.name().isEmpty())
        deviceIdentifier = device.name();
    else if (!device.address().isNull())
        deviceIdentifier = device.address().toString();
    else
        deviceIdentifier = device.deviceUuid().toString(QUuid::WithoutBraces);
    //emit showMessage("Connecting to %1"_L1.arg(deviceIdentifier));

    // If this is not the first time, release the previous low energy controller
    if (m_controller) {
        m_controller->disconnectFromDevice();
        delete m_controller;
        m_controller = nullptr;
    }

    m_controller = QLowEnergyController::createCentral(device, this);
    connect(m_controller, &QLowEnergyController::connected, this, [this]() {
        //emit showMessage("connected, start discoverServices"_L1);
        qDebug() <<  "start to createcentral";
        m_controller->discoverServices();
    });
    connect(m_controller, &QLowEnergyController::errorOccurred, this, [this]() {
        //ui->devicesListWidget->setEnabled(true);
        //ui->scanButton->setEnabled(!m_discoveryAgent->isActive());
        m_service = nullptr;
        //emit showMessage("Error occurred: "_L1 + m_controller->errorString());
    });

    connect(m_controller, &QLowEnergyController::disconnected, this, [this]() {
        m_service = nullptr;
        //ui->devicesListWidget->setEnabled(true);
        //emit showMessage("Diconnected from remote"_L1);
        //emit disconnected();
    });

    //发现service
    connect(m_controller, &QLowEnergyController::serviceDiscovered,
            this, [this](const QBluetoothUuid &newService) {
                //        if (newService != BLEIoDevice::SERVICE_UUID)
                //            return;
                //emit showMessage("Service found"_L1);
                qDebug() << "\nService discovered:" << newService.toString() << __LINE__;

                m_service = m_controller->createServiceObject(newService, m_controller);
                if (!m_service) {
                    qWarning("BT LE Service couldn't be created");
                    return;
                }

                if (m_service->state() == QLowEnergyService::RemoteService) {
                    qDebug() << "Service is a remote service" << __LINE__;
                    //emit showMessage("Service found, scanning for details"_L1);
                    m_service->discoverDetails();
                    //
                    connect(m_service, &QLowEnergyService::stateChanged,
                            this, [this](QLowEnergyService::ServiceState state) {

                                qDebug() << "\nstateChanged:"<< state << "Line: " << __LINE__;
                                qDebug() << "serviceName:"<< m_service->serviceName();
                                qDebug() << "serviceUuid:"<< m_service->serviceUuid();

                                QList<QLowEnergyCharacteristic> characteristics = m_service->characteristics();
                                qDebug() << "characteristics length:" << characteristics.length();
                                for (int var = 0; var < characteristics.length(); ++var) {
                                    qDebug() << "characteristics Name:"<< characteristics[var].name();
                                    qDebug() << "characteristics uuid:"<< characteristics[var].uuid();

                                    QList<QLowEnergyDescriptor> descriptors = characteristics[var].descriptors();
                                    for (int i = 0; i < descriptors.length(); ++i) {
                                        qDebug() << "descriptor Name:" << descriptors[i].name();
                                        qDebug() << "descriptor uuid:"<< descriptors[i].uuid();
                                        if(characteristics[var].uuid() == QBluetoothUuid("0000fff1-0000-1000-8000-00805f9b34fb")
                                            && descriptors[i].uuid() == QBluetoothUuid("00002902-0000-1000-8000-00805f9b34fb"))
                                        {
                                            m_service->writeDescriptor(m_service->characteristic(
                                                                                    QBluetoothUuid("0000fff1-0000-1000-8000-00805f9b34fb")).descriptor(
                                                                               QBluetoothUuid("00002902-0000-1000-8000-00805f9b34fb")),
                                                                       QLowEnergyCharacteristic::CCCDEnableNotification);
                                            qDebug() << "CCCDEnableNotification";
                                            //mtimer->start();

                                        }
                                    }

                                }

                                qDebug() << "\n";


                            });


                } else {

                    qDebug() << "serviceName:"<< m_service->serviceName();
                    qDebug() << "serviceUuid:"<< m_service->serviceUuid();
                    QList<QLowEnergyCharacteristic> characteristics = m_service->characteristics();

                    qDebug() << "characteristics length:" << characteristics.length();
                    for (int var = 0; var < characteristics.length(); ++var) {
                        qDebug() << "characteristics Name:"<< characteristics[var].name();
                        qDebug() << "characteristics uuid:"<< characteristics[var].uuid();
                        const QList<QLowEnergyDescriptor> descriptors = characteristics[var].descriptors();
                        for (int i = 0; i < descriptors.length(); ++i) {
                            qDebug() << "descriptor Name:" << descriptors[i].name();
                            qDebug() << "descriptor uuid:"<< descriptors[i].uuid() << " __LINE__:" << __LINE__;

                            //                    if(characteristics[var].uuid() == QBluetoothUuid("{0000fff1-0000-1000-8000-00805f9b34fb}")
                            //                        && descriptors[i].uuid() == QBluetoothUuid("{00002902-0000-1000-8000-00805f9b34fb}"))
                            //                    {

                            qDebug() << "CCCDEnableNotification";
                            m_service->writeDescriptor(m_service->characteristic(
                                                                    QBluetoothUuid("0000fff1-0000-1000-8000-00805f9b34fb")).descriptor(
                                                               QBluetoothUuid("00002902-0000-1000-8000-00805f9b34fb")),
                                                       QLowEnergyCharacteristic::CCCDEnableNotification);

                            //                    }
                        }

                    }
                    qDebug() << "Service is not a remote service";

                    //connectNode();
                }
            });

    connect(m_controller, &QLowEnergyController::discoveryFinished, this, [this]() {
        qDebug() << "\nDiscovery Finished\n";
        if (m_service)
        {
            connectdevice();
            return;
        }
        m_controller->disconnected();
    });

    m_controller->setRemoteAddressType(QLowEnergyController::RandomAddress);
    m_controller->connectToDevice();
    qDebug() <<  "start to connecttodevice";
}

0

评论区