linux系统中利用QT实现蓝牙功能的方法

简介: linux系统中利用QT实现蓝牙功能的方法

      大家好,今天主要和大家分享一下,如何使用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函数,功能实现是比较齐全的,通过长时间的的坚持与练习,一定会有所收获。

目录
相关文章
|
3月前
|
Ubuntu 物联网 Linux
从零安装一个Linux操作系统几种方法,以Ubuntu18.04为例
一切就绪后,我们就可以安装操作系统了。当系统通过优盘引导起来之后,我们就可以看到跟虚拟机中一样的安装向导了。之后,大家按照虚拟机中的顺序安装即可。 好了,今天主要介绍了Ubuntu Server版操作系统的安装过程,关于如何使用该操作系统,及操作系统更深层的原理,还请关注本号及相关圈子。
|
3月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
1275 10
|
3月前
|
Ubuntu Linux 图形学
推广与体验Ubuntu Linux的便捷方法
如果你的朋友或家人对尝试Linux感兴趣,但希望在安装之前先体验一下,你可以分享以下链接给他们:Ubuntu在线导览。通过这个链接,他们可以在任何地方轻松体验Ubuntu,无需安装即可深入了解这个流行的操作系统。
|
3月前
|
XML 缓存 Linux
在Linux环境下解决Visual Studio Code字体显示异常和字体替换方法。
解决Linux下VS Code字体显示异常,需要对Linux字体渲染机制有所理解,并对VS Code的配置选项进行合理设置。替换字体时则要通过系统字体配置或VS Code设置来完成。通过上述方法,可以有效地解决字体显示问题,从而提升代码编辑的视觉体验。
383 0
|
4月前
|
监控 Linux 开发者
理解Linux操作系统内核中物理设备驱动(phy driver)的功能。
综合来看,物理设备驱动在Linux系统中的作用是至关重要的,它通过与硬件设备的紧密配合,为上层应用提供稳定可靠的通信基础设施。开发一款优秀的物理设备驱动需要开发者具备深厚的硬件知识、熟练的编程技能以及对Linux内核架构的深入理解,以确保驱动程序能在不同的硬件平台和网络条件下都能提供最优的性能。
232 0
|
6月前
|
NoSQL Linux 编译器
GDB符号表概念和在Linux下获取符号表的方法
通过掌握这些关于GDB符号表的知识,你可以更好地管理和理解你的程序,希望这些知识可以帮助你更有效地进行调试工作。
268 16
|
4月前
|
网络协议 Ubuntu Linux
Wireguard in Linux的安装方法
本文介绍了如何在Ubuntu和Rocky Linux中安装配置WireGuard,并探讨了配置过程中可能出现的DNS泄露问题及解决方法,包括通过nmtui设置DNS及调整DNS优先级参数。
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
460 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
549 0