首页 > 技术知识 > 正文

Qt windows 蓝牙4.0开发

本篇文章记录学习使用Qt在windows下开发蓝牙4.0的过程。

在介绍Qt windows蓝牙4.0开发之前,先说一些关于qt蓝牙在windows中的一些限制:

只可以在win10 1607版本以上使用(Qt5.14以上官方说已经可以支持win7、win8)

标准蓝牙(2.0)只有手动搜索配对后才可以使用Qt蓝牙搜索到

应用程序使用蓝牙库需要在.pro文件中添加配置“QT += bluetooth”

蓝牙搜索 //蓝牙扫描类 QBluetoothDeviceDiscoveryAgent *discoveryAgent = nullptr; discoveryAgent = new QBluetoothDeviceDiscoveryAgent(); //设置扫描时间 discoveryAgent->setLowEnergyDiscoveryTimeout(5000); //扫描设备信号 connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::deviceDiscovered, this, &QBLEDeviceManagement::addBLEDevice); //扫描错误信号 connect(discoveryAgent,QOverload<QBluetoothDeviceDiscoveryAgent::Error>::of(&QBluetoothDeviceDiscoveryAgent::error),this, &QBLEDeviceManagement::bleError); //扫描完成 connect(discoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished, this, &QBLEDeviceManagement::bleDeviceScanFinished); void QBLEDeviceManagement::startScan() { if(discoveryAgent->isActive()) { return; } //开始扫描 只扫描BLE设备 discoveryAgent->start(QBluetoothDeviceDiscoveryAgent::LowEnergyMethod); } void QBLEDeviceManagement::addBLEDevice(const QBluetoothDeviceInfo &info) { //扫描到的设备,可以根据蓝牙名过滤设备 if(!info.name().contains(QRegExp(BTNAME_MATCHING1)) && \ !info.name().contains(QRegExp(BTNAME_MATCHING2)) && \ !info.name().contains(QRegExp(BTNAME_MATCHING3)) { qDebug() << info.name(); QBluetoothDeviceInfo bleInfo = info; } }
<
连接蓝牙 //创建低功耗蓝牙控制对象 bleController = QLowEnergyController::createCentral(bleInfo); //绑定服务扫描信号 connect(bleController, SIGNAL(serviceDiscovered(QBluetoothUuid)), this, SLOT(onServiceDiscovered(QBluetoothUuid))); //服务扫描完成信号 connect(bleController, SIGNAL(discoveryFinished()), this, SLOT(onServiceScanDone()),Qt::QueuedConnection); //低功耗蓝牙控制错误信号 connect(bleController, SIGNAL(error(QLowEnergyController::Error)), this, SLOT(onControllerError(QLowEnergyController::Error))); //蓝牙连接信号 connect(bleController, SIGNAL(connected()), this, SLOT(onDeviceConnected())); //断开连接信号 connect(bleController, SIGNAL(disconnected()), this, SLOT(onDeviceDisconnected())); //连接设备 bleController->connectToDevice(); 扫描服务 QList<QBluetoothUuid> m_servicesUuid; m_servicesUuid.clear(); bleController->discoverServices(); QLowEnergyService* bleServer = nullptr; //服务扫描完成 void QBLECommunication::onServiceScanDone() { //获取所有服务UUID m_servicesUuid = bleController->services(); if(m_servicesUuid.isEmpty()) { }else{ //循环所有服务 foreach (auto i, m_servicesUuid) { if(i == QBluetoothUuid(QString(SERVICE_UUID)) || i == QBluetoothUuid(QString(BLE_SERVICE_UUID)))//判断是否有所连接设备的读写服务的UUID { if(bleServer) { delete bleServer; bleServer = nullptr; }    //创建服务对象 bleServer = bleController->createServiceObject(i); if (!bleServer) { return; } //服务状态 if(bleServer->state() == QLowEnergyService::DiscoveryRequired) { connect(bleServer, SIGNAL(stateChanged(QLowEnergyService::ServiceState)), this, SLOT(onServiceStateChanged(QLowEnergyService::ServiceState))); connect(bleServer, SIGNAL(characteristicChanged(QLowEnergyCharacteristic,QByteArray)), this, SLOT(onCharacteristicChanged(QLowEnergyCharacteristic,QByteArray))); connect(bleServer, SIGNAL(error(QLowEnergyService::ServiceError)), this, SLOT(serviceError(QLowEnergyService::ServiceError))); //查询服务特征值 bleServer->discoverDetails(); }else { searchCharacteristic(); } } } } } void QBLECommunication::searchCharacteristic() { if(bleServer) { bool ok = false; //循环特征值 foreach (QLowEnergyCharacteristic c, bleServer->characteristics()) { //判断特征UUID是否是写特征 if(c.isValid() && ( c.uuid() == QBluetoothUuid(QString(UUIDSTR_ISSC_TRANS_Write)) || c.uuid() == QBluetoothUuid(QString(UUIDSTR_BLE_TRANS_Write)) )) { bleWriteCharacteristic = c; qDebug() << “bleWriteCharacteristic:” << bleWriteCharacteristic.isValid(); } //判断特征UUID是否是读特征 if(c.isValid() && ( c.uuid() == QBluetoothUuid(QString(UUIDSTR_ISSC_TRANS_Read)) || c.uuid() == QBluetoothUuid(QString(UUIDSTR_BLE_TRANS_Read)) )) { m_notificationDesc = c.descriptor(\ QBluetoothUuid::ClientCharacteristicConfiguration); qDebug() << “m_notificationDesc:” << m_notificationDesc.isValid(); if (m_notificationDesc.isValid()) { bleServer->writeDescriptor(m_notificationDesc, QByteArray::fromHex(“0100”));//使能通知 ok = true; } } } } }
<
数据接收发送 数据发送: 通过服务将数据写到对应发特征值中 void QBLECommunication::bthWrite(const char* dat,const qint64 len) { if(bleServer && bleWriteCharacteristic.isValid()){ QByteArray sbuf(dat,static_cast<int>(len)); bleServer->writeCharacteristic(bleWriteCharacteristic,sbuf); qDebug() << sbuf.toHex().data(); } } 数据接收: 特征值改变信号(说明有数据) void QBLECommunication::onCharacteristicChanged(const QLowEnergyCharacteristic &c, const QByteArray &value) { if(c.uuid() == QBluetoothUuid(QString(UUIDSTR_ISSC_TRANS_Read)) || c.uuid() == QBluetoothUuid(QString(UUIDSTR_BLE_TRANS_Read))) { qDebug() << value; } } 关闭蓝牙设备 void QBLECommunication::bleDisConnect() { //disable notifications 禁用通知 if (m_notificationDesc.isValid() && bleServer) { bleServer->writeDescriptor(m_notificationDesc, QByteArray::fromHex(“0000”)); } //关闭设备 bleController->disconnectFromDevice(); //删除服务对象 if(bleServer) { delete bleServer; bleServer = nullptr; } }

猜你喜欢