要实现QT的蓝牙连接,则需要使用QT提供的蓝牙相关的类和函数,主要有以下几个步骤:
以上就是一个简单的QT的蓝牙模块的识别流程的简述;
QT官方文档的链接地址
以下是一个简单的使用QT蓝牙模块的串口调试助手的代码示例:
#include
#include
#include
#include
#include
#include
#include
#include
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 devices; //设备列表
};
这个例子展示了如何使用QT蓝牙模块来实现一个简单的串口调试助手,可以扫描、连接和通信蓝牙设备。
上面这个代码的主要目的是使用QT蓝牙模块来实现一个简单的串口调试助手,可以扫描、连接和通信蓝牙设备。它主要包含以下几个部分:
要注意使用蓝牙模块的时候,不能在QT的pro文件里面写这个QT += bluetooth,会报错,显示找不到这个bluetooth这个module,对了,我的QT版本是5.15.2的版本,可能被淘汰了。要写添加
QT = core bluetooth widgets
就可以使用上面的QBluetoothDeviceDiscoveryAgent等这些类了!
还有就是值得一提的就是:
蓝牙 API 在启用蓝牙的设备之间提供连接。
目前,以下平台支持该 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 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::of(&QBluetoothSocket::error),
this, &ChatClient::onSocketErrorOccurred);
}