大家好,今天主要和大家分享一下,如何使用QT中的蓝牙功能开发实现。
第一:蓝牙功能基本简介
QT官方提供了蓝牙的相关类和API函数,也提供了相关的历程参考。使用QT的蓝牙历程,其实底层需要有BlueZ协议栈,而Windows没有。
在Linux开发板上可以外接免驱USB蓝牙,直接在USB接口插上一个USB蓝牙模块就可以实现。
第二:蓝牙应用实例
QT蓝牙聊天,将蓝牙设置成一个服务器,或者用做客户端,连接手机进行通信。使用QT的时候,需要在项目中添加相应的蓝牙模块,在.pro文件中。
QT += core gui bluetooth
一个主界面和一个远程选择蓝牙的文件。总的看起来有四大部分,下面就介绍这四大部分的文件。
1 #ifndef CHATCLIENT_H 2 #define CHATCLIENT_H 3 4 #include <qbluetoothserviceinfo.h> 5 #include <QBluetoothSocket> 6 #include <QtCore/QObject> 7 8 QT_FORWARD_DECLARE_CLASS(QBluetoothSocket) 9 10 class ChatClient : public QObject 11 { 12 Q_OBJECT 13 14 public: 15 explicit ChatClient(QObject *parent = nullptr); 16 ~ChatClient(); 17 18 /* 开启客户端 */ 19 void startClient(const QBluetoothServiceInfo &remoteService); 20 21 /* 停止客户端 */ 22 void stopClient(); 23 24 public slots: 25 /* 发送消息 */ 26 void sendMessage(const QString &message); 27 28 /* 主动断开连接 */ 29 void disconnect(); 30 31 signals: 32 /* 接收到消息信号 */ 33 void messageReceived(const QString &sender, const QString &message); 34 35 /* 连接信号 */ 36 void connected(const QString &name); 37 38 /* 断开连接信号 */ 39 void disconnected(); 40 41 private slots: 42 /* 从 socket 里读取消息 */ 43 void readSocket(); 44 45 /* 连接 */ 46 void connected(); 47 48 private: 49 /* socket 通信 */ 50 QBluetoothSocket *socket; 51 }; 52 53 #endif // CHATCLIENT_H
chatclient.h 文件主要是客户端的头文件,其中写一些接口,比如开启客户端,关闭客户端, 接收信号与关闭信号等等。chatclient.cpp 的代码如下。
1 #include "chatclient.h" 2 #include <qbluetoothsocket.h> 3 4 ChatClient::ChatClient(QObject *parent) 5 : QObject(parent), socket(0) 6 { 7 } 8 9 ChatClient::~ChatClient() 10 { 11 stopClient(); 12 } 13 14 /* 开启客户端 */ 15 void ChatClient::startClient(const QBluetoothServiceInfo &remoteService) 16 { 17 if (socket) 18 return; 19 20 // Connect to service 21 socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol); 22 qDebug() << "Create socket"; 23 socket->connectToService(remoteService); 24 qDebug() << "ConnectToService done"; 25 26 connect(socket, SIGNAL(readyRead()), 27 this, SLOT(readSocket())); 28 connect(socket, SIGNAL(connected()), 29 this, SLOT(connected())); 30 connect(socket, SIGNAL(disconnected()), 31 this, SIGNAL(disconnected())); 32 } 33 34 /* 停止客户端 */ 35 void ChatClient::stopClient() 36 { 37 delete socket; 38 socket = 0; 39 } 40 41 /* 从 Socket 读取消息 */ 42 void ChatClient::readSocket() 43 { 44 if (!socket) 45 return; 46 47 while (socket->canReadLine()) { 48 QByteArray line = socket->readLine(); 49 emit messageReceived(socket->peerName(), 50 QString::fromUtf8(line.constData(), 51 line.length())); 52 } 53 } 54 55 /* 发送的消息 */ 56 void ChatClient::sendMessage(const QString &message) 57 { 58 qDebug()<<"Sending data in client: " + message; 59 60 QByteArray text = message.toUtf8() + '\n'; 61 socket->write(text); 62 } 63 64 /* 主动连接 */ 65 void ChatClient::connected() 66 { 67 emit connected(socket->peerName()); 68 } 69 70 /* 主动断开连接*/ 71 void ChatClient::disconnect() { 72 qDebug()<<"Going to disconnect in client"; 73 if (socket) { 74 qDebug()<<"diconnecting..."; 75 socket->close(); 76 } 77 }
分析:我们需要开启客户端模式,那么我们需要将扫描服务器(手机蓝牙)的结果, 实例化一个蓝牙 socket,使用 socket 连接传入来的服务器信息,即可将本地蓝牙当作客户端, 实现了客户端创建。
总结:QT中蓝牙相关的API函数,功能实现是比较齐全的,通过长时间的的坚持与练习,一定会有所收获。