QT 蓝牙BLE
QT MSVC编译蓝牙模块只有MSVC有用pro文件引入QT bluetoothQT bluetooth全局公共变量定义//用来对周围蓝牙进行搜寻 QBluetoothDeviceDiscoveryAgent *m_bleDiscoveryAgent; //对本地设备进行操作比如进行设备的打开设备的关闭等等 QBluetoothLocalDevice *localDevice; // 蓝牙服务 QLowEnergyService *m_service; // 主机控制操作 QLowEnergyController *controller; // 特征对象列表 QList m_charList; QLowEnergyCharacteristic m_character; QLowEnergyDescriptor m_descriptor;蓝牙初始化在.cpp文件中调用一次即可可以直接写在 MainWindow::MainWindow 函数中m_bleDiscoveryAgent new QBluetoothDeviceDiscoveryAgent(); localDevice new QBluetoothLocalDevice(); //设置搜索时间为3000us m_bleDiscoveryAgent-setLowEnergyDiscoveryTimeout(3000); //蓝牙查找信号槽 connect(m_bleDiscoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)), this, SLOT(ble_scan(QBluetoothDeviceInfo)) ); //扫描设备错误信号槽 connect(m_bleDiscoveryAgent, SIGNAL(error(QBluetoothDeviceDiscoveryAgent::Error)), this, SLOT(ble_scan_error(QBluetoothDeviceDiscoveryAgent::Error))); // 扫描完成信号槽 connect(m_bleDiscoveryAgent, SIGNAL(finished()), this, SLOT(ble_scan_finished()));上述的槽函数待后续步骤中用到再做展示避免步骤混乱。打开蓝牙并检索在.cpp文件中每调用一次即可开启一次蓝牙检索可封装成一个函数来调用。但要需要注意在蓝牙检索或连接过程中重复调用蓝牙检索会导致运行文件崩溃闪退在使用时注意互斥。//没有打开蓝牙的话 if( localDevice-hostMode() QBluetoothLocalDevice::HostPoweredOff) { //调用打开本地的蓝牙设备 localDevice-powerOn(); } //开始进行蓝牙搜索 m_bleDiscoveryAgent-start(QBluetoothDeviceDiscoveryAgent::LowEnergyMethod);检索成功、失败、超时结束// 蓝牙检索失败 void MainWindow::ble_scan_error(QBluetoothDeviceDiscoveryAgent::Error error) { qDebug() QMessageBox::information(this, tr(提示), tr(扫描异常)); } // 蓝牙检索超时结束 void MainWindow::ble_scan_finished() { qDebug() m_bleDiscoveryAgent-stop(); } // 检索到一个蓝牙 QByteArray ble_original_name; void MainWindow::ble_scan(const QBluetoothDeviceInfo info) { // 判断检索到的是否是BLE设备 if (info.coreConfigurations() QBluetoothDeviceInfo::LowEnergyCoreConfiguration) { // 判断是否对应的符合名称 if (info.name().contains(QString(ble_original_name))) { // 提前结束扫描 m_bleDiscoveryAgent-stop(); ...... } } }ble_original_name用于存放需要筛选出来的蓝牙名称在设定的检索时间内每检索到一个有效设备就会进一次MainWindow::ble_scan。发起连接连接成功后发起服务搜索// 设定自身为主机 controller QLowEnergyController::createCentral(info, this); // 一次重试 if (controller NULL) { Delay_MSec(400, false); // 设定自身为主机 controller QLowEnergyController::createCentral(info, this); } // 二次重试如果控制器还是为空 if (controller NULL) { qDebug() //QMessageBox::information(this, tr(提示), tr(创建蓝牙主机失败)); } else { // 创建连接成功信号槽 connect(controller,QLowEnergyController::connected,[]() { qDebug() //QMessageBox::information(this, tr(提示), tr(连接成功!)); // 连接后延时一段时间增加服务搜索的成功率 Delay_MSec(1000, false); // 发起服务连接 controller-discoverServices(); }); // 创建连接失败信号槽 connect(controller, QLowEnergyController::disconnected, []() { qDebug() if(controller ! NULL) { // 断开连接 controller-disconnectFromDevice(); controller-disconnect(); controller NULL; } }); controller-connectToDevice(); ...... }在连接过程中需要用到延时来维持时序逻辑这里不对延时函数进行展示。同时需要注意disconnectFromDevice 函数需要在控制器创建成功的情况下才能使用否则会带来运用程序莫名其妙崩溃的现象。服务搜索成功并获取写特征值// 设置固定蓝牙服务 static const QLatin1String a_serviceUuid(0000fff0-0000-1000-8000-00805F9B34FB); //服务搜索完成后进入 connect(controller,QLowEnergyController::discoveryFinished, []() { ble_create_service(); }); ble_create_service()函数内容如下 uint8_t retry_flag 0; void MainWindow::ble_create_service() { Delay_MSec(200, false); //创建服务 m_service controller-createServiceObject(QBluetoothUuid(a_serviceUuid),this); // 两次重试机会 if((m_service NULL) (retry_flag 2)) { Delay_MSec(400, false); retry_flag; // 重启一次服务检索 controller-discoverServices(); return; } // 失败则退出 if(m_service NULL) { qDebug() //QMessageBox::information(this, tr(提示), tr(服务建立失败)); // 创建失败就关闭 if(controller ! NULL) { controller-disconnectFromDevice(); controller-disconnect(); controller NULL; } } else { qDebug() //QMessageBox::information(this, tr(提示), tr(服务建立成功)); // 用于读取发送特征值在发送数据时需要用到 connect(m_service,QLowEnergyService::stateChanged, this, [this]() { QLowEnergyCharacteristic bleCharacteristic; //发现服务 if(m_service-state() QLowEnergyService::ServiceDiscovered) { // 获取所有服务的特征值 m_charList m_service-characteristics(); for(int i 0; i m_charList.size(); i) { bleCharacteristic m_charList.at(i); if(bleCharacteristic.isValid()) { // 读取写特征值 if (bleCharacteristic.properties() QLowEnergyCharacteristic::WriteNoResponse || bleCharacteristic.properties() QLowEnergyCharacteristic::Write) { m_character bleCharacteristic; } } } } ...... }); ...... Delay_MSec(400, false); // 获取服务详情 m_service-discoverDetails(); } }由于本应用蓝牙服务是固定的所以只对特定服务发起创建。PC端向已连接的蓝牙设备发送数据QByteArray cmd; // 延时一段时间发送命令 Delay_MSec(200, false); m_service-writeCharacteristic(m_character, cmd);监听已连接的蓝牙设备的数据// 获取蓝牙从机上发的数据 connect(m_service,QLowEnergyService::characteristicChanged, this,[this](QLowEnergyCharacteristic c,QByteArray value) { qDebug() value; });