qt for android蓝牙的连接实现HC-05,控制发送接收数据

附上参考链接:代码的连接,也是其他网友的,里面的程序很有参考价值,一个程序是通过调取本地的jar等文件实现蓝牙控制,还有一种是加载好jar的库在xml中,也能达到同样的效果:Qt on Android 蓝牙通信开发 + Qt5.10+WIN10_Sky_Lannister的博客-CSDN博客

还有一个参考链接,用的也是本地的一些jar文件,但是文件获取不到,导致程序一操作蓝牙就睡奔溃了,所以这个链接主要看其中的内容讲解QT on Android 编写蓝牙使用HC-05_JameScottX的博客-CSDN博客

本博主要分享一下蓝牙配置的经验,具体代码的实现我也不详细的去述说了,根据以上的连接中代码,很容易的去消化移植程序,但是配置起来就很坑了,一个不到位就会各种闪退崩溃,所以我就主要说明一下蓝牙的配置部分。

其中蓝牙的配置主要在两个文件中,一个是AndroidManifest.xml中,还有一个是工程的pro文件中

在pro文件中添加好QT+=bluetooth即可

在AndroidManifest.xml中:

查找图片中run with local libs部分,其中的android.app.load_local_jars和android.app.static_init_classes是为系统配置功能模块的库文件部分,此图中后面的value值都是INSERT_LOCAL_JARS和INSERT_INIT_CLASSES,意思是调用本地文件中的相关配置文件

打开这个工程可以看到other files中有许多的配置文件,在我配置蓝牙的过程中,完全不理解这些个文件是怎么来的,也不知道是不是固定的,所以就算我把这些东西移植到程序中也没有成功,所以我就放弃了用这种方式。

当然还有第二种方式,其xml配置如下

可以看到图中圈中部分和之前的不一样,这个方式就是在xml中加载好bluetooth所需要的jar文件,不用把配置文件放在本地去调用,之前移植好程序,总是调用蓝牙就各种闪退,搞得我都有些快要崩溃了,后来仔细一对比,发现在xml中大有文章,原来我移植后的程序没有加载这些jar等文件库,所以才导致崩溃,后来把这些加载进去,就完美的可以控制蓝牙各种运行啦。

这种在工程文件中就不需要调用其他的文件,显得程序很干净。好了先介绍这么多,此博客还会继续更新,把我做的app蓝牙部分功能分享到下面。


以下是实现蓝牙连接的所有代码

/****************************蓝牙******************************/
//刷新完毕,重置按键状态
void MainWindow::scanFinshed(){

    if(connectsuccessflag==false)
        ui->pushButton_7->setEnabled(true);
    ui->pushButton_7->setText("刷新蓝牙设备");
}
//刷新搜索到的蓝牙列表
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());
        if (pairingStatus == QBluetoothLocalDevice::Paired || pairingStatus == QBluetoothLocalDevice::AuthorizedPaired )
            item->setTextColor(QColor(Qt::green));
        else
            item->setTextColor(QColor(Qt::black));
        ui->listWidget->addItem(item);
    }
}
//连接蓝牙
void MainWindow::itemActivated(QListWidgetItem *item)
{
    QString text = item->text();

    int index = text.indexOf(' ');

    if (index == -1)
        return;
    if( localDevice->hostMode() == QBluetoothLocalDevice::HostPoweredOff ) {
        QAndroidJniObject javaToast = QAndroidJniObject::fromString("蓝牙未开启,请打开蓝牙!");
        QAndroidJniObject::callStaticMethod<void>("com/ZtActivity/ZtActivity",
                                               "makeToast",
                                               "(Ljava/lang/String;)V",
                                               javaToast.object<jstring>());
        localDevice->powerOn();
    }
    else{
        QBluetoothAddress address(text.left(index));
        QString name(text.mid(index + 1));
        //qDebug() << "You has choice the bluetooth address is " << address;
        //qDebug() << "The device is connneting.... ";
        QAndroidJniObject javaToast = QAndroidJniObject::fromString("正在连接选中设备...");
        QAndroidJniObject::callStaticMethod<void>("com/ZtActivity/ZtActivity",
                                               "makeToast",
                                               "(Ljava/lang/String;)V",
                                               javaToast.object<jstring>());
        socket->connectToService(address, QBluetoothUuid(serviceUuid) ,QIODevice::ReadWrite);
        connectflag=1;
    }
}
//蓝牙接收数据处理
void MainWindow::readBluetoothDataEvent()
{
    QByteArray allData;
    while (!socket->atEnd())
    {
        allData += socket->readAll().toHex();
        comBatAnalyze(allData);//处理串口得到的数据
    }
}
//蓝牙连接成功回调
void MainWindow::bluetoothConnectedEvent()
{
    ui->listWidget->setVisible(false);
    ui->pushButton_7->setEnabled(false);
    connectsuccessflag=true;
    ui->label->setStyleSheet("image: url(:/PIC/greecircle.png)");
    QAndroidJniObject javaToast = QAndroidJniObject::fromString("蓝牙连接成功!");
    QAndroidJniObject::callStaticMethod<void>("com/ZtActivity/ZtActivity",
                                           "makeToast",
                                           "(Ljava/lang/String;)V",
                                           javaToast.object<jstring>());
}
//蓝牙断开回调
void MainWindow::bluetoothDisconnectedEvent()
{
    connectsuccessflag=false;
    ui->label->setStyleSheet("image: url(:/PIC/redcircle.png)");
    ui->pushButton_7->setEnabled(true);
    QMessageBox::information(this,tr("提示"),tr("蓝牙已断开,请重新连接!"));
}
//刷新蓝牙列表
void MainWindow::on_pushButton_7_clicked()
{
    ui->listWidget->setVisible(true);
    disconnect(ui->listWidget,SIGNAL(itemActivated(QListWidgetItem*)),this,SLOT(itemActivated(QListWidgetItem*)));
    ui->listWidget->clear();
    connect(ui->listWidget,SIGNAL(itemActivated(QListWidgetItem*)),this,SLOT(itemActivated(QListWidgetItem*)));
    if( localDevice->hostMode() == QBluetoothLocalDevice::HostPoweredOff ) {
        //QMessageBox::information(this,tr("提示"),tr("蓝牙未开启,请打开蓝牙!"));
        QAndroidJniObject javaToast = QAndroidJniObject::fromString("蓝牙未开启,请打开蓝牙!");
        QAndroidJniObject::callStaticMethod<void>("com/ZtActivity/ZtActivity",
                                               "makeToast",
                                               "(Ljava/lang/String;)V",
                                               javaToast.object<jstring>());
        localDevice->powerOn();
    }
    else{
        discoveryAgent->start();
        ui->pushButton_7->setEnabled(false);
        ui->pushButton_7->setText("正在刷新蓝牙设备...");
    }
}
//重连蓝牙设备
void MainWindow::on_pushButton_clicked()
{
    socket->disconnectFromService();
    ui->listWidget->setVisible(true);
    if(connectsuccessflag==true)
        ui->pushButton_7->setEnabled(true);
}
/****************************蓝牙end******************************/

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大桶矿泉水

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值