要实现QT的蓝牙连接,则需要使用QT提供的蓝牙相关的类和函数,主要有以下几个步骤:
- 首先,你需要创建一个QBluetoothLocalDevice对象,用来操作本地的蓝牙设备,比如获取设备的地址、名称、状态、模式等,以及开启或关闭蓝牙功能。
- 然后,你需要创建一个QBluetoothDeviceDiscoveryAgent对象,用来发现附近的蓝牙设备,比如获取设备的信息、查询类型、错误状态等,以及开始或停止扫描设备。
- 接着,你需要创建一个QBluetoothSocket对象,用来建立和管理与远程蓝牙设备的连接,比如获取套接字的描述符、地址、端口等,以及连接或断开服务、发送或接收数据等。
- 最后,你需要使用信号和槽机制,来处理不同的事件和状态变化,比如发现新设备、完成扫描、连接成功、断开连接、收到数据等。
以上就是一个简单的QT的蓝牙模块的识别流程的简述;
😊
以下是一个简单的使用QT蓝牙模块的串口调试助手的代码示例:
#include <QtBluetooth>
#include <QBluetoothDeviceDiscoveryAgent>
#include <QBluetoothDeviceInfo>
#include <QBluetoothSocket>
#include <QDataStream>
#include <QIODevice>
#include <QMessageBox>
#include <QMainWindow>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void startScan(); //开始扫描设备
void deviceDiscovered(const QBluetoothDeviceInfo &device); //发现设备
void scanFinished(); //扫描完成
void connectDevice(); //连接设备
void socketConnected(); //套接字连接成功
void socketDisconnected(); //套接字断开连接
void socketError(QBluetoothSocket::SocketError error); //套接字错误
void socketReadyRead(); //套接字可读
void sendData(); //发送数据
private:
QBluetoothDeviceDiscoveryAgent *agent; //设备发现代理
QBluetoothSocket *socket; //蓝牙套接字
QList<QBluetoothDeviceInfo> devices; //设备列表
};
这个例子展示了如何使用QT蓝牙模块来实现一个简单的串口调试助手,可以扫描、连接和通信蓝牙设备。
😊
上面这个代码的主要目的是使用QT蓝牙模块来实现一个简单的串口调试助手,可以扫描、连接和通信蓝牙设备。它主要包含以下几个部分:
- 定义一个MainWindow类,继承自QMainWindow,作为主窗口,用来显示和操作界面。
- 在MainWindow类的构造函数中,创建一个QBluetoothDeviceDiscoveryAgent对象和一个QBluetoothSocket对象,分别用来发现和连接蓝牙设备。
- 在MainWindow类的构造函数中,还使用信号和槽机制,将这两个对象的不同事件和状态变化,连接到相应的槽函数,用来处理逻辑和交互。
- 定义了以下几个槽函数:
- startScan():开始扫描设备,调用agent->start()方法。
- deviceDiscovered(const QBluetoothDeviceInfo &device):发现设备,将设备信息添加到devices列表中。
- scanFinished():扫描完成,如果没有发现任何设备,提示用户并退出程序;如果发现了设备,选择第一个设备进行连接。
- connectDevice():连接设备,获取第一个设备的地址和串口服务UUID,调用socket->connectToService()方法。
- socketConnected():套接字连接成功,提示用户连接成功。
- socketDisconnected():套接字断开连接,提示用户断开连接。
- socketError(QBluetoothSocket::SocketError error):套接字错误,提示用户错误信息。
- socketReadyRead():套接字可读,读取套接字中的所有数据,并打印出来。
- sendData():发送数据,写入"Hello"到套接字中。
要注意使用蓝牙模块的时候,不能在QT的pro文件里面写这个QT += bluetooth,会报错,显示找不到这个bluetooth这个module,对了,我的QT版本是5.15.2的版本,可能被淘汰了。要写添加
QT = core bluetooth widgets
就可以使用上面的QBluetoothDeviceDiscoveryAgent等这些类了!
还有就是值得一提的就是:
Qt蓝牙
目前,以下平台支持该 API:
也就说经典蓝牙的接口在这里是不支持的。所以大家要
好自己的需求 ;另外,Qt蓝牙也支持针对客户端/中心角色用例的低功耗蓝牙开发。
Qt蓝牙API有三个主要用途。第一种是获取本地和远程设备信息。检索设备信息的第一步是检查设备上的蓝牙是否可用,并读取本地设备地址和名称。是提供所有这些信息的类。此外,你还可以使用它来打开/关闭蓝牙,设置设备的可见性并确定当前连接。
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();
}
扫描蓝牙设备
与上面类似,API 为远程设备提供类似的信息。虽然您可以自己创建对象并用数据填充它们,但更简单的方法是使用开始自动搜索可连接范围内的可见蓝牙设备。
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() << ')';
}
将文件推送到远程设备
找到所需设备后,Qt蓝牙提供了两个主要用例。更简单的方法是通过 Obex 对象推送配置文件 (OPP) 发送文件。顾名思义,此配置文件可以将文件从一台设备推送到另一台设备。目前无法拉取文件或浏览远程文件系统。配置文件不要求在交换数据之前配对两个设备。要将文件推送到远程设备,请创建一个并要求 通过调用其函数来推送请求中包含的文件。
// Create a transfer manager
QBluetoothTransferManager *transferManager = new QBluetoothTransferManager(this);
// Create the transfer request and file to be sent
QBluetoothAddress remoteAddress("00:11:22:33:44:55:66");
QBluetoothTransferRequest request(remoteAddress);
QFile *file = new QFile("testfile.txt");
// Ask the transfer manager to send it
QBluetoothTransferReply *reply = transferManager->put(request, file);
if (reply->error() == QBluetoothTransferReply::NoError) {
// Connect to the reply's signals to be informed about the status and do cleanups when done
QObject::connect(reply, SIGNAL(finished(QBluetoothTransferReply*)),
this, SLOT(transferFinished(QBluetoothTransferReply*)));
QObject::connect(reply, SIGNAL(error(QBluetoothTransferReply::TransferError)),
this, SLOT(error(QBluetoothTransferReply::TransferError)));
} else {
qWarning() << "Cannot push testfile.txt:" << reply->errorString();
}
在设备之间交换数据
两个支持蓝牙的设备之间通信的更灵活的方法是创建虚拟串行端口连接并通过该连接自由交换数据。这可以通过串行端口配置文件 (SPP) 完成。串行端口配置文件模拟通过蓝牙传输协议 RFCOMM 的串行连接。为了能够接收传入的 SPP 连接,您需要使用侦听传入的连接。
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;
}
使用以下命令从另一台扮演客户端角色的设备连接到此服务器:
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, QOverload<QBluetoothSocket::SocketError>::of(&QBluetoothSocket::error),
this, &ChatClient::onSocketErrorOccurred);
}