基于 QT 的安卓手机蓝牙 APP 开发:技术与实践

2026-02-07 0 967

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);
}

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 开发教程 基于 QT 的安卓手机蓝牙 APP 开发:技术与实践 https://www.zuozi.net/60747.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务