Qt BLE开发
Qt6
第一步
通过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";
}
评论区