参考QT的低功耗文档https://doc.qt.io/qt-5/qtbluetooth-le-overview.html

代码编译器换成Qt for android 也可以在安卓设备上使用低功耗蓝牙,亲测Android 12可用。

源码地址:https://github.com/zuotian0222/blecontroller.git

准备:Qt5.14及以上版本,MSVC编译器, QT +=  bluetooth

一.扫描设备

void Device::startScanDevices()
{m_DiscoveryAgent = new QBluetoothDeviceDiscoveryAgent();m_DiscoveryAgent->setLowEnergyDiscoveryTimeout(5000);connect(m_DiscoveryAgent, &QBluetoothDeviceDiscoveryAgent::deviceDiscovered,[=](const QBluetoothDeviceInfo &info){if (info.coreConfigurations() & QBluetoothDeviceInfo::LowEnergyCoreConfiguration ){bleDevicesList.append(info);}});connect(m_DiscoveryAgent, &QBluetoothDeviceDiscoveryAgent::finished, [=]{isScanning = false;if (bleDevicesList.isEmpty()){qDebug()<<"No Low Energy devices found...";return ;}elseqDebug()<<"Scan finished!";for(auto dev : bleDevicesList){qDebug()<<dev.name()+" "+dev.address().toString();}});bleDevicesList.clear();m_DiscoveryAgent->start(QBluetoothDeviceDiscoveryAgent::LowEnergyMethod);if(m_DiscoveryAgent->isActive()){isScanning = true;qDebug()<<"Scanning.\n";}
}  

二.连接设备

//连接设备
void Device::connectDevice(QString address)
{for(auto dev : bleDevicesList){if(dev.address().toString() == address){nowDevice = dev;}}if(!nowDevice.isValid()){qDebug()<<"Not a valid device";return;}servicesList.clear();characterList.clear();if(m_LowController->state() == QLowEnergyController::ConnectedState){m_LowController->disconnectFromDevice();}delete m_LowController;m_LowController = nullptr;if (!m_LowController) {m_LowController = QLowEnergyController::createCentral(nowDevice);//连接成功connect(m_LowController, &QLowEnergyController::connected,[=](){qDebug()<<"Device connect success.";//发现服务m_LowController->discoverServices();});//断开连接connect(m_LowController, &QLowEnergyController::disconnected,[=]{qDebug()<<"Device disconnected.";});//发现单个服务connect(m_LowController, &QLowEnergyController::serviceDiscovered,[=]{//});//服务发现完成connect(m_LowController, &QLowEnergyController::discoveryFinished,[=]{qDebug()<<"Services scan finished.";servicesUUIDList = m_LowController->services();//查看是否包含我需要通信的服务UUIDbool ret = servicesUUIDList.contains(QBluetoothUuid(QString("{需要通信的服务UUID}")));if(!ret){m_LowController->disconnectFromDevice();return ;}for(auto s : servicesUUIDList){qDebug()<<s.toString();}/*这里是最奇怪的一点*我在这里找到了需要的UUID准备扫描它包含的特性*直接调用了函数却一直通不过*///connectService("{需要通信的服务UUID}");QTimer::singleShot(1000,[=]{ this->connectService("{需要通信的服务UUID}");});});}m_LowController->connectToDevice();
}

这里需要注意的是

1.当蓝牙断开后低功耗控制器对象m_LowController就失效了,再次连接时需要释放置空;

2.上述代码段标注的位置不能直接调用函数发现服务的特性

三.发现特性

void Device::connectService(QString uuid)
{QLowEnergyService *service = nullptr;for(int i=0;i<servicesUUIDList.length();i++){if(servicesUUIDList.at(i).toString() == uuid){service = m_LowController->createServiceObject(servicesUUIDList.at(i));}}if (!service)return;characterList.clear();//打印各种错误信息connect(service, static_cast<void(QLowEnergyService::*)(QLowEnergyService::ServiceError)>(&QLowEnergyService::error),[=](QLowEnergyService::ServiceError newErrorr){qDebug()<<newErrorr;});if (service->state() == QLowEnergyService::DiscoveryRequired) {connect(service, &QLowEnergyService::stateChanged,[=](QLowEnergyService::ServiceState newState){qDebug()<<"State : "<<newState;if(newState == QLowEnergyService::ServiceDiscovered){const QList<QLowEnergyCharacteristic> chars = service->characteristics();for (const QLowEnergyCharacteristic &ch : chars) {qDebug()<<ch.uuid();characterList.append(ch);}}});service->discoverDetails();return;}
}

注意:一开始我在图二中发现需要的服务后直接调用此函数,低功耗服务对象触发状态改变的信号,状态无法变成 QLowEnergyService::ServiceDiscovered  也就无法再继续下去了,具体现象如下:

触发了正在发现服务,然后就发生未知错误,状态再次变成未发现状态,这个问题困扰了好久,我照着步骤重新写了几版,有的却能成功发现服务特性,我就很疑惑,一步步对比,终于是发现问题:不能在服务发现完成的槽函数中直接进行发现特性。具体的原因暂不知道,可以用:QTimer::singleShot  延时调用,或按钮调用;修改后执行结果如下:

四.读写特性

    //BLE设备特征值改变connect(service, &QLowEnergyService::characteristicChanged,[=](const QLowEnergyCharacteristic &c, const QByteArray &value){QString Charuuid = c.uuid().toString();QString Value = value.toHex();qDebug()<<"BLE设备-"+Charuuid+"特性值发生变化:"+ Value;});//当特征读取请求成功返回其值时,发出此信号。connect(service,&QLowEnergyService::characteristicRead,[=](const QLowEnergyCharacteristic &c, const QByteArray &value){QString Charuuid = c.uuid().toString();QString Value = value.toHex();qDebug()<<"BLE设备-"+Charuuid+"特性值读取到的值:"+ Value;});//当特性值成功更改为newValue时,会发出此信号。connect(service,&QLowEnergyService::characteristicWritten,[=](const QLowEnergyCharacteristic &c, const QByteArray &value){QString Charuuid = c.uuid().toString();QString Value = value.toHex();qDebug()<<"BLE设备-"+Charuuid+"特性值成功写入值:"+ Value;});//描述符修改connect(service,&QLowEnergyService::descriptorWritten,[=](const QLowEnergyDescriptor &descriptor, const QByteArray &newValue){QString Charuuid = QString("%1").arg(descriptor.name());qDebug()<<"BLE设备-"+Charuuid+"描述符成功写入值:"+ QString(newValue);});if (service->state() == QLowEnergyService::DiscoveryRequired) {connect(service, &QLowEnergyService::stateChanged,[=](QLowEnergyService::ServiceState newState){qDebug()<<"State : "<<newState;if(newState == QLowEnergyService::ServiceDiscovered){const QList<QLowEnergyCharacteristic> chars = service->characteristics();for (const QLowEnergyCharacteristic &ch : chars) {if(ch.isValid()){if(ch.properties() & QLowEnergyCharacteristic::Notify){QLowEnergyDescriptor notice = ch.descriptor(QBluetoothUuid::ClientCharacteristicConfiguration);if(notice.isValid()){//打开通知service->writeDescriptor(notice,QByteArray::fromHex("0100"));//关闭通知//service->writeDescriptor(notice,QByteArray::fromHex("0000"));}}if(ch.properties() & QLowEnergyCharacteristic::WriteNoResponse ||  ch.properties() & QLowEnergyCharacteristic::Write){QByteArray arr;arr.resize(20);for(int i=0;i<20;i++){arr[i] = static_cast<char>(i);}//写入特性值service->writeCharacteristic(ch,arr);}if(ch.properties() & QLowEnergyCharacteristic::Read){//读取特性值service->readCharacteristic(ch);}}}}});service->discoverDetails();return;}

测试结果:

到此结束。

QT 低功耗蓝牙 PC端相关推荐

  1. Qt低功耗蓝牙系列一(什么是低功耗蓝牙开发,低功耗蓝牙的通信机制原理)

    文章目录 前言 Android 蓝牙 BLE 低功耗蓝牙协议栈简介 蓝牙的选用 BLE 低功耗蓝牙模块具体应用场景 蓝牙灯控方案 BLE 蓝牙智能锁方案 蓝牙 MAC 地址扫描打印解决方案 蓝牙 Me ...

  2. PyQt5之QtBluetooth模块:低功耗蓝牙BLE通信

    PyQt5之QtBluetooth模块:低功耗蓝牙BLE通信 最近使用PyQt5开发PC端工具,正巧手上有一个富芮坤的低功耗蓝牙,于是想在PC端试试与之通信,不过发现使用PyQt5开发低功耗蓝牙的教程 ...

  3. 网络调试助手:安卓APP集成TCP、UDP、经典蓝牙、低功耗蓝牙的调试demo

    1.前言 我终于不需要调试一个硬件设备装一个APP了,在应用商店下载别人的网络调试助手,又有广告,还不如直接写一个比较完整的网络调试助手.目前支持的功能有tcp客户端和服务端,udp,低功耗蓝牙客户端 ...

  4. PC端 java 开发蓝牙所遇到的问题

    由于项目的原因.要在电脑上开发一个通过蓝牙传送数据的client.我採用的是JAVA,JSME开发. client:去搜素蓝牙信号,然后找到对应的蓝牙信号进行连接. 服务端:client须要进行连接的 ...

  5. 低功耗蓝牙BLE外围模式(peripheral)-使用BLE作为服务端

    低功耗蓝牙BLE外围模式(peripheral)-使用BLE作为服务端 Android对外模模式(peripheral)的支持 从Android5.0开始才支持 关键术语和概念 以下是关键BLE术语和 ...

  6. mblock机器人指令_mBot机器人如何通过蓝牙实现与PC端mBlock的无线通信?

    手机端与 mBot机器人 通讯的方式,想必大家都有所了解了,在手机端安装 makeblock 的一款应用软件后,通过手机蓝牙与 mBot 上面的蓝牙模块连接,二者实现蓝牙无线通信,以达到无线遥控或者自 ...

  7. Java:PC端作为客户端连接蓝牙设备并接收蓝牙发送的数据

    感谢:(1)PC端蓝牙开发  https://www.cnblogs.com/zeussbook/p/12827479.html https://blog.csdn.net/svizzera/arti ...

  8. 微信小程序与低功耗蓝牙通信-接受硬件端发送来的数据(四)

    接受数据只要 wx.notifyBLECharacteristicValueChange监听器打开, wx.onBLECharacteristicValueChange是接受数据的函数. 数据接收到后 ...

  9. 根据PC端telegram源码提取出来的Qt文本显示代码

    最近在做一个聊天软件,是用Qt开发,消息显示是一个比较重要的部分,经过几次尝试发现Qt的默认控件都没有现成的能够实现复制.选中效果.链接.显示表情和图片等的控件,后面发现telegram的PC端也是用 ...

最新文章

  1. 《Adobe Illustrator大师班:经典作品与完美技巧赏析》目录—导读
  2. 多多点金——青龙羊毛
  3. 人工智能、应用、程序
  4. 前后端分离之Vue(三)爬过得那些坑
  5. Static Final用法
  6. 命令行执行php脚本中的$argv和$argc配置方法
  7. linux下搭建lua开发环境
  8. java切面获取reqiest,怎么在webflux切面中获取请求头.
  9. 传智书城首页设计代码_(自适应手机版)响应式创意餐饮酒店装饰设计类网站织梦模板 html5蓝色餐饮酒店设计网站源码下载...
  10. 深度linux安装好上不了网,Deepin Linux 无法上网
  11. MySQL中 Data truncated for column ‘xxx‘解决方法
  12. Quartz CronTrigger最完整触发时间配置说明
  13. 团队项目-Recycle需求规格说明书
  14. Wi-Fi连接握手包抓包
  15. 苹果屏幕镜像_苹果屏幕镜像一直在转,秒懂投屏帮你解决
  16. 分析时间复杂度,主定理,势能分析
  17. 什么是物联网卡ICCID?如何查看?
  18. 如何实现字体沟边与发光特效?
  19. 申请HTTPS证书流程
  20. linux usb 驱动总线(三)

热门文章

  1. 机器学习中的数学——点估计(一):基础知识
  2. 浙江万里学院c语言题库答案,浙江万里学院单片机原理及应用模拟试卷八.doc
  3. 杭电5597GTW likes function
  4. GitHub使用教程(项目下载)
  5. 来闯关吗?​一个有趣的 Python 解谜网站
  6. 从头开始学Tableau-第十二章(实战3 地图实践)
  7. 人工智能简介(一)——深度AI科普调研团队
  8. 解决使用pycharm安装keras-tuner后tensorflow-gpu 2.5.0无法使用的问题
  9. 考察北京3家培训地点后的感受和疑问(转)
  10. 一个简单的企业进销存管理系统 .