一、本次测试目的

  基于QT环境下STM32人体红外检测,实现客户端红外采集到信息向服务端通信。

二、功能

  (1)、传入音乐,当服务端接收到信息时,打开音乐

    (2)、在服务端上面显示图片,当接收到打开或者关闭信息时,切换图片

三、代码展示


【服务端】文件名称:untitledReceivingInformation


1、右键点击服务端文件夹,单击添加新文件。

2、在弹出的选择模板中选择Qt,选择Qt Resource File,单击Choose... 创建

3、输入添加新文件的名称 picture 单击下一步,单击完成。

4、因此项目文件untitledReceivingInformation路径下,出现资源文件路径,添加的新文件 picture.qrc 会自动生成到资源目录下面。

5、在picture.qrc 中单击添加列表,单击添加前缀,删除下方属性栏中前缀的内容。

【这里面的前缀是已经删除过原有的前缀】

6、点击添加列表,单击添加文件,会自动弹出存放untitledReceivingInformation文件的界面。因此我需要将图片保存到当前的文件夹。【以1.jpg为例】

头文件:widget.h

 1 #ifndef WIDGET_H
2 #define WIDGET_H
3
4 #include <QWidget>
5 #include <QTcpServer>
6 #include <QTcpSocket>
7 #include <QHostAddress>
8 #include <QMediaPlayer>
9 #include <QPixmap>
10
11 namespace Ui {
12 class Widget;
13 }
14
15 class Widget : public QWidget
16 {
17 Q_OBJECT
18
19 public:
20 explicit Widget(QWidget *parent = 0);
21 ~Widget();
22 private slots:
23 //写一个槽函数
24 //用于接收建立连接
25 void slotNewConn();
26
27 //接收到信息后进行显示
28 void slotRecv();
29 //声音暂停按钮
30 void on_pushButton_clicked();
31 //手写槽,播放音乐
32 void openmusic();
33 //手写槽,关闭音乐
34 void closemusic();
35 //开灯的图片响应
36 void turn_on_the_light();
37 //关灯的图片响应
38 void close_on_the_light();
39
40 private:
41 Ui::Widget *ui;
42 //声明server、socket指针变量
43 QTcpServer *server;
44 QTcpSocket *socket;
45
46 QPixmap pix;
47 QMediaPlayer player;
48 int count;
49 };
50
51 #endif // WIDGET_H

源文件:widget.cpp

  1 #include "widget.h"
2 #include "ui_widget.h"
3 #include "QPixmap"
4 #include "QDir"
5
6 Widget::Widget(QWidget *parent) :
7 QWidget(parent),
8 ui(new Ui::Widget)
9 {
10 ui->setupUi(this);
11 //计算函数
12 count = 1;
13 this->setWindowTitle("服务端");
14 //给server指针开辟内存
15 server = new QTcpServer(this);
16 //监听是否收到客户端的信息
17 server->listen(QHostAddress::AnyIPv4,9999);
18
19 //提前约定
20 //对手写槽进行连接
21 connect(server,
22 SIGNAL(newConnection()),
23 this,
24 SLOT(slotNewConn()));
25
26 //将当前的图片保存到path中
27 QString path = QDir::currentPath();
28 //连接音乐
29 ///Jingle Bells.mp3
30 player.setMedia(QUrl(path + "/1.wav"));
31
32 }
33
34 Widget::~Widget()
35 {
36 delete ui;
37 }
38 /**
39 * @brief Widget::slotNewConn
40 * 手写的槽函数用于接收是否连接到网络
41 */
42 void Widget::slotNewConn(){
43
44 if(server->hasPendingConnections()){
45 socket = server->nextPendingConnection();
46 //如果显示输出,则连接建立成功
47 //在label上面显示
48 ui->label->setText("有客户端来了");
49
50 //手写槽需要建立连接 connect【接收】
51 connect(socket,//信号的发出者
52 SIGNAL(readyRead()),//读消息
53 this,
54 SLOT(slotRecv()));
55
56 }
57 }
58
59 /**
60 * @brief Widget::slotRecv
61 * 在服务器内接收客户端的信息
62 * 没有按钮来点击接收,因此需要添加一个 手写槽slotRecv()
63 * 用来接收人体传感器的信息
64 */
65 void Widget::slotRecv(){
66
67 //在服务器内接收客户端的信息
68 //没有按钮来点击接收,因此需要添加一个 手写槽slotRecv()【类型于自己手写一个显示方法】
69 //现在接收的类型是 QByteArray 类型
70 QString str;
71 QByteArray array;
72
73 //readAll() 读取所有的东西
74 array = socket->readAll();
75
76 //调用append函数【添加】,将类型转换成QString类型
77 str.append(array);
78
79 //然后在label_2上面显示字符串类型的内容
80 ui->label_2->setText(str);
81 if(str == "infared_on\r\n"){
82 //如果接收的信息是"infared_on"
83 //那么我就在label_3上面显示开灯
84 ui->label_3->setText("开灯");
85 //调用手写槽函数
86 //如果是开灯,就播放这张照片
87 turn_on_the_light();
88 //这个音乐
89 openmusic();
90 //在这个写这段代码,有一个弊端,接收点一下发送消息,才会响应一次
91 //【需要:当我发送的是开灯信号的时候,声音是一直播放的】
92 //如果接收到开灯的信号,那么将播放音乐
93 //player.play();
94 //如果接收到开灯的信号,那么将把照片放置到label_4中
95 //pix.load(":/1.jpg","jpg");
96 //ui->label_4->setPixmap(pix);
97 //将图片进行自适应
98 //ui->label_4->setScaledContents(true);
99
100 //定义一个手写槽
101
102 }else{
103
104 ui->label_3->setText("关灯");
105 //如果接收到关灯的信号,那么将暂停音乐
106 //player.pause();
107 //调用手写槽,如果是关灯,就换另一种图片
108 close_on_the_light();
109 closemusic();
110 }
111 }
112 /**
113 * @brief Widget::on_pushButton_clicked
114 * 手动暂停按钮
115 */
116 void Widget::on_pushButton_clicked()
117 {
118 //当按钮被按下,音乐会被暂停【手动暂停】
119 //如果接收到开灯的信息,不想播放声音,可以手动暂停
120 closemusic();
121 }
122 /**
123 * @brief Widget::openmusic
124 * 手写槽打开音乐
125 */
126 void Widget::openmusic(){
127 //【修复一个只有在点击的情况下,才会播放音乐】
128 //【让音乐持续播放】
129 //修复音乐无限的bug,原因是while的判断条件内,count初始不能为0
130 while(count){//上面代码块中定义的count = 1
131 player.play();
132 if(count == 5){
133 return;
134 }
135 count++;
136 }
137
138 }
139
140 /**
141 * @brief Widget::closemusic
142 * //手写槽,关闭音乐
143 */
144 void Widget::closemusic(){
145
146 player.pause();
147
148 }
149 /**
150 * @brief Widget::turn_on_the_light
151 * 开灯的图片响应
152 */
153 void Widget::turn_on_the_light()
154 {
155 pix.load(":/2.jpg","jpg");
156 ui->label_4->setPixmap(pix);
157 ui->label_4->setScaledContents(true);
158 }
159 /**
160 * @brief Widget::close_on_the_light
161 * 关灯的图片响应
162 */
163 void Widget::close_on_the_light()
164 {
165 pix.load(":/1.jpg","jpg");
166 ui->label_4->setPixmap(pix);
167 ui->label_4->setScaledContents(true);
168 }

界面文件:widget.ui

界面文件中对象组件:


【服务端】文件名称:untitledTransmission


头文件:widget.h

 1 #ifndef WIDGET_H
2 #define WIDGET_H
3
4 #include <QWidget>
5 #include <QTcpServer>
6 #include <QTcpSocket>
7 #include <QSerialPort>
8 #include <QMessageBox>
9
10 namespace Ui {
11 class Widget;
12 }
13
14 class Widget : public QWidget
15 {
16 Q_OBJECT
17
18 public:
19 explicit Widget(QWidget *parent = 0);
20 ~Widget();
21
22 private slots:
23 //建立连接按钮
24 void on_pushButton_clicked();
25 //是否连接成功
26 void slotCostomer();
27 //发送信息 按钮
28 void on_pushButton_4_clicked();
29 //串口按钮
30 void on_pushButton_5_clicked();
31 //创建的手写槽
32 //读取消息
33 void slotRecvSerial();
34 //建立手写槽自动给服务端发送信息
35 void Automatically_send_messages();
36
37 private:
38 Ui::Widget *ui;
39
40 //创建一个socket的指针变量
41 QTcpSocket *socket;
42 //创建一个serial的指针变量
43 QSerialPort* serial;
44
45 };
46
47 #endif // WIDGET_H

源文件:widget.cpp

  1 #include "widget.h"
2 #include "ui_widget.h"
3
4 Widget::Widget(QWidget *parent) :
5 QWidget(parent),
6 ui(new Ui::Widget)
7 {
8 ui->setupUi(this);
9 this->setWindowTitle("客户端");
10
11 //为这个创建的指针变量分配空间
12 socket = new QTcpSocket(this);
13 //手写槽建立连接
14 connect(socket,
15 SIGNAL(connected()),
16 this,
17 SLOT(slotCostomer()));
18
19 //检测红外信号接收【采集人体传感器信息,然后进行发送】
20 //给指针分配内存
21 serial = new QSerialPort(this);
22
23 //手写槽创建连接
24 connect(serial,
25 SIGNAL(readyRead()),
26 this,
27 SLOT(slotRecvSerial())
28 );
29
30 //建立自动连接发送信息
31 connect(serial,
32 SIGNAL(readyRead()),
33 this,
34 SLOT(Automatically_send_messages())
35 );
36
37
38 }
39
40 Widget::~Widget()
41 {
42 delete ui;
43 }
44
45 /**
46 * @brief Widget::on_pushButton_clicked
47 * 这个按钮是建立连接
48 */
49 void Widget::on_pushButton_clicked()
50 {
51 QString ipaddr,port;
52 //获取IP地址的内容
53 //lineEdit 是IP地址
54 ipaddr = ui->lineEdit->text();
55 //获取端口号的内容
56 //lineEdit_2 是端口号
57 port = ui->lineEdit_2->text();
58
59 int m_port;
60 //将端口号转换成int类型
61 m_port = port.toInt();
62
63 //cmd ipconfig/all
64 //ipv4 192.168.66.179
65 //将这个程序进行发送
66 socket->connectToHost(ipaddr,m_port);
67 }
68
69 /**
70 * @brief Widget::slotCostomer
71 * 这个连接是不需要按钮触发的,因此需求在加载的时候触发连接
72 */
73 void Widget::slotCostomer(){
74 //label 是显示连接信息
75 ui->label->setText("连接服务器成功...");
76 }
77
78 //192.168.87.95
79 //下面的代码是发送消息按钮
80 /**
81 * @brief Widget::on_pushButton_4_clicked
82 * 如果点击发送按钮,人体传感器的消息才会发送给服务端
83 *
84 * 【新问题】如果不借助按钮事件装置,将检测到人体传感器的信息直接发送到服务端
85 * 1、应该将按钮装置设置成一个手写槽
86 * 2、将手写槽建立自动连接
87 */
88 /*
89 void Widget::on_pushButton_4_clicked()
90 {
91 QByteArray array;
92 QString str;
93
94 //获取lineEdit_3的内容
95 //内容是任何获取的呢?
96 //【是我检测到人体传感器然后获取人体传感器的内容进行转发】
97 str = ui->label->text();
98
99 //发送的时候只能发送QByteArray类型
100 //因此调用append方法【增加】,把str追加到QSring后面,实现类型转换
101 array.append(str);
102
103 //转换完成后就要进行发送
104 //上方代码块中已经在内存中为socket开辟了空间
105 socket->write(array);
106 }
107 */
108 /**
109 * @brief Automatically_send_messages()
110 * 建立自动连接发送信息
111 */
112 void Widget::Automatically_send_messages(){
113
114 QByteArray array;
115 QString str;
116
117 //获取lineEdit_3的内容
118 //内容是任何获取的呢?
119 //【是我检测到人体传感器然后获取人体传感器的内容进行转发】
120 str = ui->label->text();
121
122 //发送的时候只能发送QByteArray类型
123 //因此调用append方法【增加】,把str追加到QSring后面,实现类型转换
124 array.append(str);
125
126 //转换完成后就要进行发送
127 //上方代码块中已经在内存中为socket开辟了空间
128 socket->write(array);
129 }
130
131 /**
132 * @brief on_pushButton_5_clicked()
133 * 串口按钮
134 */
135 void Widget::on_pushButton_5_clicked()
136 {
137 QString strPortName,strBaudRate;
138 //获取comboBox的数据
139 strPortName = ui->comboBox->currentText();
140 strBaudRate = ui->comboBox_2->currentText();
141 serial->setPortName(strPortName);
142 serial->setBaudRate(strBaudRate.toInt());
143
144 //设置数据位
145 //枚举类型
146 serial->setDataBits(QSerialPort::Data8);
147 //设置停止位
148 serial->setStopBits(QSerialPort::OneStop);
149 //校验位
150 serial->setParity(QSerialPort::NoParity);
151 //
152 serial->setFlowControl(QSerialPort::NoFlowControl);
153
154 //打开
155 bool ok;
156 ok = serial->open(QIODevice::ReadWrite);
157 if(ok == true){
158 QMessageBox::information(this,"打开串口","串口打开成功");
159 }else{
160 QMessageBox::warning(this,"打开串口","串口打开失败");
161 }
162 }
163 /**
164 * @brief Widget::slotRecvSerial
165 * 创建的手写槽
166 * 读取消息
167 */
168 void Widget::slotRecvSerial(){
169
170 //读取获取人体传感器此时的消息
171 QByteArray array;
172 QString str;
173 //全部读取【人体传感器此时的信息】
174 array = serial->readAll();
175 //类型转换
176 str.append(array);
177 //读取的消息,我直接在label上面显示出来【】
178 ui->label->setText(str);//当我点击发送消息的按钮时,label上面显示的人体传感器的消息会发送给服务端
179 }

界面文件:widget.ui

界面文件中对象组件:

四、代码测试

基于QT环境下,实现客户端红外采集人体向服务端通信。的更多相关文章

  1. winform 客户端采用HTTP协议与服务端通信

    本来从来没有仔细研究过Http协议,今天因为公司业务需求,调试了半天,终于现在会Winform用Http协议与服务端通信了,其中常用的有POST和Get方式: 仔细看了人人网和新浪等大部分都是采用GE ...

  2. qt 环境下mapx组件的鼠标跟踪

    经过两天的研究mapx组件人坐标转换还是没有转换成功,因为不管怎么变,定点转换的经纬度坐标始终与期望的值有较大的偏差.最后还是想老大请教了一下,划了半天功夫就研究出来了(不愧是老大,仰慕之情犹如滔滔江 ...

  3. 基于Windows环境下cmd/编译器无法输入中文,显示中文乱码解决方案

    基于Windows环境下cmd/编译器无法输入中文,显示中文乱码解决方案 两个月前做C++课设的时候,电脑编译器编译结果出现了中文乱码,寻求了百度和大神们,都没有解决这个问题,百度上一堆解释是对编译器 ...

  4. 文献综述十七:基于 sql环境下超市管理系统的设计与实现

    一.基本信息 标题:基于 sql环境下超市管理系统的设计与实现 时间:2018 出版源:智能计算机与应用 文件分类:uml技术的研究 二.研究背景 从超市管理系统的实际应用出发,在系统分析过程中,从功 ...

  5. 基于dvwa环境下级别为low的SQL手工注入教程

    基于dvwa环境下级别为low的SQL手工注入教程: 首先是进入已搭建好的dvwa环境中去(一定要搭建好dvwa环境才能进行下面的操作),这可能会是一些初学者所面临的的第一个问题,比如我,曾为了寻找这 ...

  6. 基于开源SuperSocket实现客户端和服务端通信项目实战

    一.课程介绍 本期带给大家分享的是基于SuperSocket的项目实战,阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现打通B/S与C/S网络通讯,如果您对本期的<基于开源Supe ...

  7. (8)Linux(客户端)和Windows(服务端)下socket通信实例

    Linux(客户端)和Windows(服务端)下socket通信实例: (1)首先是Windows做客户端,Linux做服务端的程序 Windows   Client端 #include <st ...

  8. Netty入门——客户端与服务端通信

    Netty简介Netty是一个基于JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞.基于事件驱动.高性能.高可靠性和高可定制性.换句话说,Netty是一个NIO框架,使用它可以简单快速 ...

  9. Netty入门之客户端与服务端通信(二)

    Netty入门之客户端与服务端通信(二) 一.简介 在上一篇博文中笔者写了关于Netty入门级的Hello World程序.书接上回,本博文是关于客户端与服务端的通信,感觉也没什么好说的了,直接上代码 ...

  10. Android BLE与终端通信(三)——客户端与服务端通信过程以及实现数据通信

    Android BLE与终端通信(三)--客户端与服务端通信过程以及实现数据通信 前面的终究只是小知识点,上不了台面,也只能算是起到一个科普的作用,而同步到实际的开发上去,今天就来延续前两篇实现蓝牙主 ...

随机推荐

  1. PYQT5学习(13):QMidArea同时显示多个窗口,创建多个独立的窗口

    QMidArea  参考文章:https://blog.csdn.net/jia666666/article/details/81670569 一种同时显示多个窗口的方法,创建多个独立的窗口,这些独立 ...

  2. Solution -「洛谷 P6156」简单题

    Description Link. 求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^n(i+j)^kf(\gcd(i,j))\gcd(i,j)\). Solution ...

  3. Modbus转profinet网关连接位移计在1200程序控制案例

    Modbus转profinet网关连接位移计在1200程序控制案例 本案例讲述了兴达易控Modbus转profinet网关(XD-MDPN100)连接现场用台达LD-E镭射位移计检测控制在1200PL ...

  4. Dubbo3应用开发—Dubbo服务管理平台DubboAdmin介绍、安装、测试

    Dubbo服务管理平台 DubboAdmin的介绍 Dubbo Admin是Apache Dubbo服务治理和管理系统的一部分. Dubbo Admin提供了一套用于服务治理的Web界面,让我们可以更 ...

  5. Chapter 6. Build Script Basics

    Chapter 6. Build Script Basics 6.1. Projects and tasks Everything in Gradle sits on top of two basic ...

  6. Keycloak 创建和修改自定义用户信息

    前言 公司在用 Keycloak 作为认证服务器,之前在系统数据库里存的,后来想了想是不是可以在 Keycloak 中存.在网上找的方法大多都是通过 admin 接口去改,但这种方法就需要两种解决方案 ...

  7. 别再吹捧什么区块链,元宇宙,Web3了,真正具有颠覆性的估计只有AI

    「感谢你阅读本文!」 别再吹捧什么区块链,元宇宙,Web3了,真正具有颠覆性的估计只有AI. 我们这个社会有这样一个特性,就是出现一个新事物,新概念,新技术,先不管是否真的现实,是否真的了解,第一件事 ...

  8. 未能添加SSL证书,错误1312

    1.win+r打开运行,输入mmc 2.在控制台1[控制台根节点]->文件->添加/删除....->选择证书->添加-选择计算机账户->完成->确认 3.找到证书文 ...

  9. Splay 详细图解 & 轻量级代码实现

    学 LCT 发现有点记不得 Splay 怎么写,又实在不知道这篇博客当时写了些什么东西(分段粘代码?),决定推倒重写. 好像高一学弟也在学平衡树,但相信大家都比樱雪喵强,都能一遍学会!/kel 写在前 ...

  10. 洛谷P1462spfa + 二分答案

    第一次接触二分答案的题目最开始是没有思路的看了一个题解,然后强行理解之后开始自己打了一遍,然而结果是只得了30分过了3个点其他全wa,之后是漫长的debug,这里想感慨一句自己debug的速度是真慢. ...