Qt 蓝牙概述

使用 Qt 蓝牙 API 的典型用例包括

  • 检索本地蓝牙设备的信息。
  • 搜索范围内其他蓝牙设备并检索其信息。
  • 使用 OBEX 对象推送配置文件(OPP)将文件推送到远程设备。
  • 通过 RFCOMM 通道使用串行端口配置文件(SPP)连接到远程设备。
  • 创建允许通过 SPP 来接收连接的 RFCOMM 服务器。
  • 检索蓝牙低功耗设备规格说明。
  • 连接到蓝牙低功耗设备。
  • 接收蓝牙低功耗设备发出的广播。

注意,对象推送配置文件在 Android 和 Windows 上不受支持。

以下部分描述了如何使用 Qt 蓝牙 C++ API 类来完成上述用例。

检索本地设备信息

Qt 蓝牙 API 的主要用途有三个。第一个是获取本地和远程设备信息。检索设备信息的第一个步骤是检查设备上是否支持蓝牙,并读取局部设备地址和名称。《a href="qbluetoothlocaldevice.html" translate="no">QBluetoothLocalDevice 类提供了所有这些信息。此外,您还可以使用它来打开/关闭蓝牙,设置设备的可见性以及确定当前连接。

QBluetoothLocalDevice localDevice;
QString localDeviceName;

// Check if Bluetooth is available on this device
if (localDevice.isValid()) {

    // Turn Bluetooth on
    localDevice.powerOn();

    // Read local device name
    localDeviceName = localDevice.name();

    // Make it visible to others
    localDevice.setHostMode(QBluetoothLocalDevice::HostDiscoverable);

    // Get connected devices
    QList<QBluetoothAddress> remotes;
    remotes = localDevice.connectedDevices();
}

搜索蓝牙设备

QBluetoothLocalDevice 类类似,API 提供了 QBluetoothDeviceInfo 类,该类为远程设备提供类似信息。虽然您可以直接创建 QBluetoothDeviceInfo 对象并填充数据,但更简单的方法是使用 QBluetoothDeviceDiscoveryAgent 来启动对可连接范围内可见蓝牙设备的自动化搜索。

void MyClass::startDeviceDiscovery()
{

    // Create a discovery agent and connect to its signals
    QBluetoothDeviceDiscoveryAgent *discoveryAgent = new QBluetoothDeviceDiscoveryAgent(this);
    connect(discoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
            this, SLOT(deviceDiscovered(QBluetoothDeviceInfo)));

    // Start a discovery
    discoveryAgent->start();

    //...
}

// In your local slot, read information about the found devices
void MyClass::deviceDiscovered(const QBluetoothDeviceInfo &device)
{
    qDebug() << "Found new device:" << device.name() << '(' << device.address().toString() << ')';
}

设备间交换数据

两个启用蓝牙的设备之间通信的更灵活的方法是创建一个虚拟串行端口连接,然后在连接上自由交换数据。这可以通过串行端口配置文件(SPP)来实现。串行端口配置文件通过蓝牙传输协议 RFCOMM 模拟串行连接。

要能够接收传入的SPP连接,您需要使用QBluetoothServer监听传入的连接。

rfcommServer = new QBluetoothServer(QBluetoothServiceInfo::RfcommProtocol, this);
connect(rfcommServer, &QBluetoothServer::newConnection,
        this, QOverload<>::of(&ChatServer::clientConnected));
bool result = rfcommServer->listen(localAdapter);
if (!result) {
    qWarning() << "Cannot bind chat server to" << localAdapter.toString();
    return;
}

从充当客户端角色的另一个设备连接到该服务器,请使用QBluetoothSocket

void ChatClient::startClient(const QBluetoothServiceInfo &remoteService)
{
    if (socket)
        return;

    // Connect to service
    socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
    qDebug() << "Create socket";
    socket->connectToService(remoteService);
    qDebug() << "ConnectToService done";

    connect(socket, &QBluetoothSocket::readyRead, this, &ChatClient::readSocket);
    connect(socket, &QBluetoothSocket::connected, this, QOverload<>::of(&ChatClient::connected));
    connect(socket, &QBluetoothSocket::disconnected, this, &ChatClient::disconnected);
    connect(socket, &QBluetoothSocket::errorOccurred, this, &ChatClient::onSocketErrorOccurred);
}

使用此类连接可以在两个方向上交换任何形式的数据。它非常适合用于游戏或同步两台设备上应用程序的两个实例之间的状态。有关如何配置服务器和客户端的更详细说明,请参阅QBluetoothServerQBluetoothSocket类中的详细描述部分。SPP的一个好例子是蓝牙聊天示例。

低功耗蓝牙

低功耗蓝牙,也称为蓝牙智能,是一种允许低功耗设备之间互相通信的新技术。更多关于这一技术和相关Qt API的详情,请参阅蓝牙低能耗总览

© 2024 Qt公司有限公司。此处包含的文档贡献均为各自所有者的版权。所提供的文档根据自由软件基金会发布的GNU自由文档许可第1.3版的条款许可。Qt及其相关标志是芬兰及其它地区Qt公司有限公司的商标。所有其他商标均为各自所有者的财产。