一、本次测试目的

  基于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. 防火墙&&firewalld&&iptables

    防火墙&&firewalld&&iptables 目录 防火墙&&firewalld&&iptables 一.firewalld 1.c ...

  2. 月工资不到10元的内容审核专员? - ChatGPT 在内容自动审查中的应用

    内容过滤筛查是指对网络上发布或传播的文本.图片.视频等内容进行审核和监管,以防止出现违法违规.暴力色情.虚假广告.电信诈骗等现象,维护网络安全和社会秩序. 内容过滤筛查是一个亟待解决的问题,因为网络内 ...

  3. KRPANO太阳光插件

    KRPano太阳光插件可以在全景项目中添加太阳光特效,如下图所示: 同时,该插件支持可视化编辑 使用说明 1.下载插件,把插件放入skin文件夹里面 2.在tour.xml文件中,添加下面的插件引用 ...

  4. 小知识:PPT的幻灯片放映设置

    最近给某客户讲课时,碰到了幻灯片自动翻页的情况,发现是因为之前做过粗略的计时演练,有些片子就快速过了. 问题现象: 结果导致放映时也出现了某些片子快速被自动翻页. 解决方案: 设置成手动推进幻灯片的方 ...

  5. 设备维修保养通知:如何使用API接口发送通知给相关人员

    在设备维修保养管理中,及时通知相关人员是确保设备得到及时维护的关键.API接口提供了一个方便的方式来自动发送维修保养通知,以确保工作流程的顺利进行.本文将详细介绍如何使用成熟的API接口来发送设备维修 ...

  6. 在线问诊 Python、FastAPI、Neo4j — 创建 检查节点

    目录 症状数据 创建节点 根据不同的症状,会建议做些相对应的检验.检查 症状数据 examine_data.csv 建议值用""引起来.避免中间有,号造成误识别 检查 " ...

  7. C语言条件运算符(?:)

    条件运算符(conditional operator)有时候也称为三元运算符(ternary operator,或者trinary operator),因为它是唯一需要 3 个操作数的运算符: 条件 ...

  8. 连接远程MySQL报错问题-Datagrip

    前言: 记录:DataGrip连接远程服务器MySQL数据库报错问题. 问题: 1.Communications link failure--会话连接失败 原因分析: 1.端口被防火墙了 2.MySQ ...

  9. Go反射终极指南:从基础到高级全方位解析

    在本文中,我们将全面深入地探讨Go语言的反射机制.从反射的基础概念.为什么需要反射,到如何在Go中实现反射,以及在高级编程场景如泛型编程和插件架构中的应用,本文为您提供一站式的学习指南. 关注[Tec ...

  10. WPF性能优化:Freezable 对象

    Freezable是WPF中一个特殊的基类,用于创建可以冻结(Freeze)的可变对象.冻结一个对象意味着将其状态设置为只读,从而提高性能并允许在多线程环境中共享对象. Freezable的应用 我们 ...