Qt for Android 蓝牙调用

痞子三分冷 提交于 2019-12-11 18:45:43

Qt部分

QtOnAndroid.pro文件配置

首先在.pro文件中加入

QT += bluetooth

如下图所示:
在这里插入图片描述

mainwindow.ui

在写逻辑之前,我们应该先把界面设计好,如下图所示:

上图中有三个按钮,分别是btn_bluetooth,btn_update,pushbutton(未用到)
一个QListWidget ,name为 listWidget。

mainwindow.h

下面我们需要添加qt关于蓝牙部分的头文件

#include <QBluetoothAddress>
#include <QBluetoothDeviceDiscoveryAgent>
#include <QBluetoothDeviceInfo>
#include <QBluetoothLocalDevice>
#include <QBluetoothSocket>

现在为整个蓝牙部分的运行添加一些槽函数

private slots:
  void on_btn_bluetooth_clicked();//开启蓝牙
  void findFinish();//搜索蓝牙设备结束
  void connectOK();//连接成功
  void connectNot();//连接失败
  void connectBLE(QListWidgetItem *);//连接指定蓝牙设备
  void addBlueToothDevicesToList(QBluetoothDeviceInfo info);//添加搜索到的蓝牙设备
  void on_btn_update_clicked();//搜索周围蓝牙设备

上面这些函数的作用看名字基本也就明白是什么意思了。

再添加一些成员

  QBluetoothDeviceDiscoveryAgent *discoveryAgent;
  QBluetoothLocalDevice *localDevice;
  QBluetoothSocket *socket;

这样,mainwindow.h中配置也就完成了。

mainwindow.cpp

在界面初始化函数中,我们先初始化好需要的类,并设置好信号与槽的关联。

//初始化蓝牙搜索类
  discoveryAgent = new QBluetoothDeviceDiscoveryAgent();
  //为本地蓝牙创建描述类
  localDevice = new QBluetoothLocalDevice();
  // 给socket分配内存,限定套接字协议
  socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
  //判断蓝牙是否开启,若开启则不可被选中并扫描周围蓝牙设备
  if (localDevice->hostMode() == QBluetoothLocalDevice::HostPoweredOff) {
    ui->btn_bluetooth->setEnabled(true);
    ui->btn_update->setEnabled(false);
    // 开始扫描蓝牙设备
    discoveryAgent->start();
  } else {
    ui->btn_bluetooth->setEnabled(false);
    ui->btn_update->setEnabled(true);
  }
  // 发现设备时会触发deviceDiscovered信号,转到槽显示蓝牙设备
  connect(discoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)), this,
          SLOT(addBlueToothDevicesToList(QBluetoothDeviceInfo)));
  connect(discoveryAgent, SIGNAL(finished()), this, SLOT(findFinish()));
  //双击listwidget的项目,触发连接蓝牙的槽
  connect(ui->listWidget, SIGNAL(itemActivated(QListWidgetItem *)), this,
          SLOT(connectBLE(QListWidgetItem *)));
  connect(socket, SIGNAL(connected()), this, SLOT(connectOK()));
  connect(socket, SIGNAL(disconnected()), this, SLOT(connectNot()));

槽函数实现如下:

void MainWindow::on_btn_bluetooth_clicked() {
  localDevice->powerOn();
  ui->btn_bluetooth->setEnabled(false);
  ui->btn_update->setEnabled(true);
  /* 开始扫描蓝牙设备 */
  discoveryAgent->start();
}

void MainWindow::findFinish() { ui->btn_update->setEnabled(true); }

void MainWindow::connectOK() {
  discoveryAgent->stop(); //停止搜索设备
  QMessageBox::information(this, tr("成功"), tr("连接成功!"));
}

void MainWindow::connectNot() {
  QMessageBox::information(this, tr("错误"), tr("连接失败!"));
}

void MainWindow::addBlueToothDevicesToList(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->setForeground(QColor(Qt::green));
    } else {
      item->setForeground(QColor(Qt::black));
    }
    ui->listWidget->addItem(item);
  }
}

void MainWindow::connectBLE(QListWidgetItem *item) {
  static const QLatin1String serviceUuid(
      "00001101-0000-1000-8000-00805F9B34FB");//百度来的手机连接单片机用的uuid
  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);
}

void MainWindow::on_btn_update_clicked() {
  ui->listWidget->clear();
  discoveryAgent->start();
  ui->btn_update->setEnabled(false);
}

至此,mainwindow.cpp编写完成。

运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Arduino开发板

编写代码

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  while (Serial.available())
  {
    char c = Serial.read();
    Serial.println(c);
  }

}

上述代码就是在连接蓝牙后,我发什么数据,开发板返回什么数据

初始化时:
在这里插入图片描述
测试:
在这里插入图片描述
在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!