QBluetoothDeviceDiscoveryAgent *discoveryAgent;//用来对周围蓝牙进行搜寻
QBluetoothLocalDevice *localDevice;//对本地设备进行操作,比如进行设备的打开,设备的关闭等等
QBluetoothSocket *socket;//就是用来进行蓝牙配对链接和数据传输的
在这个科技发展日新月异的时代,蓝牙技术已经渗透到了生活的方方面面,从蓝牙耳机到蓝牙音箱,都能看到它的身影。对于众多开发者来说,自己动手打造一个蓝牙APP无疑是一件充满吸引力的事情。而QT,这款功能强大的开发工具,在开发蓝牙APP的过程中,拥有其独特的操作流程。
蓝牙设备本地操作
localDevice = new QBluetoothLocalDevice();
开发蓝牙APP,首要任务是掌握对本地蓝牙设备的操作。在办公等特定场所,开发者需熟练搜寻周边蓝牙设备。基础操作如设备的开关,是整个开发流程的基石。这些操作通常通过特定函数或工具完成。在开发适用于不同设备连接的蓝牙APP时,这一点尤为关键。试想,若无法正确操作本地设备,后续的蓝牙配对和数据传输将难以实现。
void MainWindow::on_pushButton_openBLE_clicked()
{
if( localDevice->hostMode() == QBluetoothLocalDevice::HostPoweredOff)//开机没有打开蓝牙
{
localDevice->powerOn();//调用打开本地的蓝牙设备
discoveryAgent->start();//开始扫描蓝牙设备
}
else
{
QMessageBox::information(this, tr("成功"), tr("蓝牙已打开"));
}
}
在使用蓝牙设备时,必须严格遵守既定的语法和接口规范。任何微小的错误都可能导致程序出现故障。
void MainWindow::on_pushButton_closeBLE_clicked()
{
socket->close();
QMessageBox::information(this, tr("成功"), tr("已断开连接"));
}
蓝牙配对与数据传输
蓝牙的关键作用之一就是实现设备的配对和数据的传输。在众多实际应用中,比如智能家居设备的连接,就需要进行精确的蓝牙配对操作。配对时,我们会使用特定方式激活本地蓝牙设备。这一过程中,需要创建特定类别的实例,只有创建了这些实例,才能调用相应的方法执行蓝牙搜索等操作。至于数据传输,它对准确性和效率的要求更高,比如在医疗设备的数据传输中,一旦发生传输错误,可能会带来严重后果。
connect(discoveryAgent,
SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
this,
SLOT(addBlueToothDevicesToList(QBluetoothDeviceInfo))
);
各种蓝牙设备在传输数据时,其大小和速度可能因各自性能和所采用的蓝牙版本不同而有所区别。因此,开发人员必须时刻关注这些影响因素,以确保数据传输的顺畅进行。
信号触发与发现设备显示
//在ListWidget上显示查找到的蓝牙设备
void MainWindow::addBlueToothDevicesToList(const QBluetoothDeviceInfo &info)
{
QString label = QString("%1 %2").arg(info.address().toString()).arg(info.name());
QList<QListWidgetItem *> items = ui->listWidget->findItems(label, Qt::MatchExactly);
if (items.empty())
{
QListWidgetItem *item = new QListWidgetItem(label);
QBluetoothLocalDevice::Pairing pairingStatus = localDevice->pairingStatus(info.address());
/* 蓝牙状态pairingStatus,Pairing枚举类型
* 0:Unpaired没配对
* 1:Paired配对但没授权
* 2:AuthorizedPaired配对且授权 */
if (pairingStatus == QBluetoothLocalDevice::Paired || pairingStatus == QBluetoothLocalDevice::AuthorizedPaired )
item->setTextColor(QColor(Qt::red));
else
item->setTextColor(QColor(Qt::black));
ui->listWidget->addItem(item);
}
}
在搜索蓝牙设备时,一旦找到设备,就会触发信号。例如,在真实的测试场景中,这个信号被激活后,会进入特定的函数,比如oList函数。在软件界面上,位于最上方的蓝牙列表下的控件具有独特功能。要将找到的设备打印到列表中,必须编写一个槽函数。实际上,这些操作并非独立存在,它们之间需要相互关联。
调试这个功能时可能会遇到不少问题,比如设备虽然检测到了,却无法正常打印到列表上。开发者需要耐心寻找原因,这可能是由于代码逻辑出错或函数调用不当所引起的。
蓝牙的Uuid概念
蓝牙中的Uuid概念至关重要。在蓝牙技术中,每个服务及其属性都通过Uuid进行验证。无论使用何种操作系统或开发环境,都必须遵守Uuid的规定。蓝牙技术通过16位或32位数值构建类构造函数,并能对两个128位的Uuid进行比较。比如,在大型多人合作项目中,开发者们可以借助Uuid确保蓝牙服务的准确识别。
而且,仅从理论上理解UUID是不够的。此外,我们还需了解在Linux系统中,通过执行特定命令“-t”,可以生成一个UUID值。这一操作对于开发阶段获取UUID具有实际的操作价值。
建立串口模式的Uuid存储
static const QLatin1String serviceUuid("00001101-0000-1000-8000-00805F9B34FB");
项目中若采用串口模式,必须建立存储UUID的机制。在此特定开发环境中,存在一个专门用于存储串口模式UUID信息的字符串。若开发相同蓝牙模式,开发人员可直接利用此UUID代码。然而,若开发其他模式,则需自行查找相应的UUID码。此外,在构造函数中,还需进行相关内存的分配。此时,务必确保构造函数的参数中指定了模式。
这一步骤之所以必要,是因为不同的模式对Uuid的处理和存储需求各不相同。只有遵循规则,蓝牙APP才能正常运行。
蓝牙设备连接与信号槽链接
socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
双击控件项目即可触发槽函数,进而与蓝牙设备建立连接。在设备连接过程中,会获取蓝牙设备的MAC地址,并将该地址保存在特定类的实例中,作为连接的依据。随后,通过函数将地址、UUID和蓝牙模式传递进去,便启动了连接过程。在开发阶段,还提供了丰富的槽函数,例如连接成功和断开成功的信号,在这些槽函数中可以进行多种操作。比如,蓝牙数据的发送与接收,也是通过这一过程实现的。
开发人员要在构造函数中设置信号与槽的关联,这要求他们对开发流程有深刻的了解。否则,漏洞问题很容易出现。
关于QT开发蓝牙APP,您还有其他疑问或是想法吗?欢迎点赞、转发,并在评论区留下您的看法,一起交流讨论。
//蓝牙连接
void MainWindow::connectBLE(QListWidgetItem *item)
{
QString text = item->text();
int index = text.indexOf(' ');
if (index == -1)
return;
QBluetoothAddress address(text.left(index));
QString name(text.mid(index + 1));
QMessageBox::information(this,tr("提示"),tr("设备正在连接中..."));
socket->connectToService(address, QBluetoothUuid(serviceUuid) ,QIODevice::ReadWrite);
}