首页 > 编程知识 正文

win32下Qt5BLE蓝牙开发笔记

时间:2023-05-05 16:21:40 阅读:74509 作者:1115

蓝牙配置文件蓝牙是蓝牙2.0或更高版本的蓝牙模块,而经典蓝牙是蓝牙2.0或更低版本的蓝牙。 蓝牙分为客户端和服务器两端,传统的蓝牙可以通过套接字编程在客户端和服务器之间进行通信。 与网络套接字类似。 蓝牙无法通过这种方法进行通信。 蓝牙下有服务、特征值,蓝牙通信其实是对特征值的读写操作。 微软Windows上的API与蓝牙相关的C API相对较少,而C#上的API相对较多。 我用Qt开发了这个实现蓝牙的demo。

请注意,用于Qt开发的QBlueTooth库在Windows上仅支持Windows10或更高版本的系统,并且Qt版本必须为5.15或更高。 请务必使用MSVC编译编译器。 否则,将无法支持windows平台。 Qt 5蓝牙开发正文环境为Qt5.15.2

要在Qt中使用蓝牙库,必须将一句话添加到. pro文件中

Qt=蓝牙蓝牙开发流程首先阐述了我自己对蓝牙的理解,蓝牙有名字有地址,蓝牙设备下面还有服务,服务有特定的蓝牙蓝牙服务具有0-3个特征,如果分别有读取、写入、特征值通知这3个服务具有读取特性,就可以从该服务读取消息,如果服务具有写入特性,就可以从该服务读取消息

蓝牙权限问题(在Windows平台上不存在此问题,可以忽略。 在安卓平台上,无论是Qt还是Java都需要考虑这个问题。 )通过周边蓝牙连接蓝牙获取服务搜索特征,每项服务具有0-3个特性,分别支持读写。 然后,在特性变化时是否通知与BLE设备的通信,即是否对实际上有的服务进行读写操作,Bluetooth是否与Qt相关的Class和与APIQt相关的bluetoothlocaldevice # inclusion includeqbluetoothuid # includeqbluetoothdevicediscoveryagent # includeqlowenergyservice # include qlowenergycontrolller是windows 这是, 平台可能在本地蓝牙设备上提供信息的数据或apiqbluetoothdevicediscoveryagent-agent-apiqbluetoothdevicediscove e蓝牙或kuke 中) lowenergycontroller--蓝牙设备访问类qlowenergyservice--蓝牙服务类具体为1 .实现邻居蓝牙的搜索

qbluetoothdevicediscoveryagent * discovery=newqbluetoothdevicediscoveryagent; 发现-安装分布式发现时间表(30000; //搜索时间为30000us//搜索蓝牙完成后,显示[Signal]finished () connect () discovery,signal )、this, slot )、findfinish ) )设置发送//找到蓝牙设备后,单击“signal (信号设备发现)连接”“discovery (蓝牙设备连接)” signal ) devicediscovered ) ) qbluetoothdevered )发送的//start搜索,搜索为blebluetooth启动参数//需要写入qbluetoothdevicediscoveryagent 33603360 lowenergymethoddiscovery-start (qbluetoothdevicediscovery () )2. ble bluell

//voidqlowenergycontroller :3360 creat central (constqbluetoothdeviceinforemotedevice, QObject *parent () /参数:远程设备- -远程设备信息parent --父类)//返回值:无//功能:针对远程蓝牙访问初始化控制器mcontroller=qlowenergycontroller :00的connect(mcontroller,qlowenergycontroller 336030 ) //扫描目标BLE服务,连接(mconnect,qlowenergycontroller 33603360发现完成,this,主窗口33603360服务器

后会触发此信号connect(mController, static_cast<void (QLowEnergyController::*)(QLowEnergyController::Error)>(&QLowEnergyController::error), this, [this](QLowEnergyController::Error error) { Q_UNUSED(error); QMessageBox::information(this,tr("Info"),tr("Cannot connect to remote device.")); });//连接出错connect(mController, &QLowEnergyController::connected, this, [this]() { QMessageBox::information(this,tr("Info"),tr("Controller connected. Search services...")); mController->discoverServices(); });//连接成功connect(mController, &QLowEnergyController::disconnected, this, [this]() { QMessageBox::information(this,tr("Info"),tr("LowEnergy controller disconnected")); });//断开连接mController->connectToDevice();//建立连接,若连接没有出错,会自动搜索连接设备的服务

3.获取服务

//mController->connectToDevice();建立连接后若无出错,会自动进行远程设备的服务扫描//当服务被找到时触发此槽函数//服务被找到void MainWindow::serviceDiscovered(const QBluetoothUuid & serviceUuid){ QLowEnergyService *service = mController->createServiceObject(serviceUuid);//同步服务 if (!service) { QMessageBox::information(NULL,"error","Cannot create service for uuid"); return; } connect(service, &QLowEnergyService::stateChanged, this,&MainWindow::serviceStateChanged);//服务状态值发生改变 connect(service, &QLowEnergyService::淡然的皮带, this,&MainWindow::BleServicesldlzChanged);//特征值发生改变 connect(service, &QLowEnergyService::无语的酒窝, this,&MainWindow::BleServicesldlzRead);//读信息成功 connect(service, SIGNAL(合适的树叶(QLowEnergysldlz,QByteArray)),this, SLOT(BleServicesldlzWrite(QLowEnergysldlz,QByteArray)));//写信息成功 if(service->state() == QLowEnergyService::DiscoveryRequired) service->discoverDetails();//扫描特征值 serviceList.append(service);}//服务状态值改变会触发此槽函数//当蓝牙服务被扫描到时状态值会发生改变,改变为QLowEnergyService::ServiceDiscoveredvoid MainWindow::serviceStateChanged(QLowEnergyService::ServiceState s){ if(s == QLowEnergyService::ServiceDiscovered) { //QMessageBox::information(NULL,"tips",QObject::tr("Service synchronization")); //TODO.... }}

4.扫描服务特征值

void MainWindow::searchsldlz(){ if(currentService) { memset(m_sldlz,0,sizeof(m_sldlz)); QList<QLowEnergysldlz> list = currentService->义气的大象s(); //义气的大象s 获取详细特性 foreach(QLowEnergysldlz c,list) { /*如果QLowEnergysldlz对象有效,则返回true,否则返回false*/ if(c.isValid()) { //返回特征的属性。 //这些属性定义了特征的访问权限。//保存特性(读、写、改变时是否通知) if(c.properties() & QLowEnergysldlz::WriteNoResponse || c.properties() & QLowEnergysldlz::Write)//write // if(c.properties() & QLowEnergysldlz::Write) { ui->checkBox_write->setChecked(true); m_sldlz[0] = c; } else ui->checkBox_write->setChecked(false); if(c.properties() & QLowEnergysldlz::Read)//读 { ui->checkBox_read->setChecked(true); m_sldlz[1] = c; } else ui->checkBox_read->setChecked(true); if(c.properties() & QLowEnergysldlz::Notify)//特性发生改变时是否通知 { ui->checkBox_notify->setChecked(true); m_sldlz[2] = c; } else ui->checkBox_notify->setChecked(false); } } }}

5.BLE蓝牙的读、写操作

//void QLowEnergyService::writesldlz(const QLowEnergysldlz &义气的大象, const QByteArray &newValue, QLowEnergyService::WriteMode mode = WriteWithResponse)//参数:义气的大象 -- 当前服务的某个特性值 newValue -- 写入数据 WriteMode mode -- 写入模式//返回值:无//功能:发送信息给BLEcurrentService->writesldlz(m_sldlz[0], QByteArray(text.toUtf8()));//发送消息成功触发此槽函数void MainWindow::BleServicesldlzWrite(const QLowEnergysldlz &c, const QByteArray &value){ QString str(c.uuid().toString()); QString str2("instructions %1 send to success!"); QString str3 = str + QString(":") + str2.arg(QString(value)); QMessageBox::information(NULL,"tips",str3);}//void QLowEnergyService::readsldlz(const QLowEnergysldlz &义气的大象)//参数:义气的大象 -- 当前服务的某个特性值//返回值:无//功能:从BLE中读取信息currentService->readsldlz(m_sldlz[1]);//读到消息触发此槽函数void MainWindow::BleServicesldlzRead(const QLowEnergysldlz &c, const QByteArray &value){ QTextCodec *codec = QTextCodec::codecForName("GBK");//指定QString的编码方式 QString showMsg = c.uuid().toString() + codec->toUnicode(value);//Unicode编码格式输出信息 QString valuetoHexString = value.toHex();//16进制输出信息 qDebug()<<value; qDebug()<<valuetoHexString; ui->listWidget_recv->addItem(showMsg); ui->listWidget_recv->setCurrentRow(ui->listWidget_recv->count()-1);} 源码下载

https://download.csdn.net/download/weixin_46276101/19686524?spm=1001.2014.3001.5503

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。