QT上位机:局域网特定设备ip查询和显示
运行环境:win10
QT版本:5.11.3
最近在研究QT如何将局域网的设备IP显示在列表中,然后通过双击打开,调用web浏览器访问一个固定的网址。因为这里是特定的设备,并且是局域网中的,那么我们可以通过设计一个协议来处理这个问题。什么协议最适合这样的场景呢?熟悉网络协议的童鞋一直知道UDP有个广播地址。当广播一条消息时,处于统一局域网中的UDP的客户端或者是服务器都能收到这条消息。知道大概的方向后,下面就是开始撸代码了:
首先,先打开QT Creator,新建一个工程,暂且名字为qt_iot_dev_find。建立好工程后,我们打开工程中mainwindows.ui,进行页面布局。这里的话,涉及的业务比较简单,就三个控件,页面布局如下:
因为这个工程要涉及到网络编程,所以我们要打开工程文件qt_iot_dev_find.pro,在第8行添加一行代码:
QT += network
添加完了之后,我们打开mainwindow.h头文件,修改头文件如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>#include <QUdpSocket>//添加头文件namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();void list_init();//列表初始化void udp_server_init();//upd服务器初始化void iot_dev_ip_item_add(QString ip,QString data);//将获取到的ip和数据,加入到列表中QUdpSocket *udp_server;
private:Ui::MainWindow *ui;//添加槽函数
private slots:void udp_receive_data_handler();//自己添加的slot,在收到upd消息后,会自动调用该函数void on_search_dev_pushButton_clicked();//该函数是自动添加的,按键连接的槽函数
};#endif // MAINWINDOW_H
然后打开mainwindow.cpp,修改cpp文件如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QListWidgetItem> //添加头文件,我们是一个item一个item的插入#define UDP_SERVER_PORT 12345
#define VALID_DATA "ping_request" //有效数据.当前udp服务器认的有效数据,客户端只需要发这个,就可以显示在列表中
#define MAX_NUM 5 //显示最大为5,这个随意更改static unsigned char g_connect_count = 0;//连接数统计
static QString ip_all[MAX_NUM][32];//用来缓存连接的ipMainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);list_init();udp_server_init();
}MainWindow::~MainWindow()
{delete ui;
}//列表初始化
void MainWindow::list_init()
{//初始化列表头,暂定为ip_addr和dataQListWidgetItem *list_head = new QListWidgetItem(" ip_addr \t data",ui->dev_infor_listWidget);ui->dev_infor_listWidget->insertItem(1,list_head);//
}//Upd服务器初始化
void MainWindow::udp_server_init()
{//创建一个udp server对象udp_server = new QUdpSocket(this);//绑定端口号为12345udp_server->bind(UDP_SERVER_PORT,QUdpSocket::ShareAddress);//连接到slots,有客户端的消息到来时,会自动调用udp_receive_data_handlerconnect(udp_server,SIGNAL(readyRead()),this,SLOT(udp_receive_data_handler()));}void MainWindow::udp_receive_data_handler()
{QHostAddress udp_client_address;//声明一个QHostAddress对象unsigned short int udp_client_port = 0;//客户端端口号QByteArray udp_datagram;//upd client 发来的数据,里面包含内容和大小while( udp_server->hasPendingDatagrams() ){udp_datagram.resize( udp_server->pendingDatagramSize());udp_server->readDatagram(udp_datagram.data(),udp_datagram.size(), &udp_client_address, &udp_client_port);//比较数据是否为有效数据if(strcmp(udp_datagram.data(),VALID_DATA) == 0){//注意这里的ip显示的格式是这样的,我们需要转换一下"::ffff:192.168.xxx.xxx" ==> "192.168.xxx.xxx"QString ip_addr_temp = udp_client_address.toString();QString ip_addr;int i = 0;//填充ip地址for(i = 7; ip_addr_temp[i] != '\0'; i ++ ){ip_addr[i-7] = ip_addr_temp[i];}//插入列表iot_dev_ip_item_add(ip_addr + QString(":")+ QString().number(udp_client_port),udp_datagram.data());}//非法数据,不处理}
}//将获取到的ip,加入到列表中
void MainWindow::iot_dev_ip_item_add(QString ip,QString data)
{//大于最大连接数,则不进行插入if(g_connect_count >= MAX_NUM)return ;//相同IP和端口,只显示一个,这个值是不会重复的for(unsigned char i = 0; i < MAX_NUM; i ++){if(ip == *ip_all[i]){//这里添加调试信息打印qDebug() << "*****************************";qDebug() << "i = " << i;qDebug() << "buff:client_addr:" << *ip_all[i];qDebug() << "current client_addr:" << ip;return;}}//没有找到相同的,插入ip_all[g_connect_count][0] = ip;g_connect_count = g_connect_count + 1;QListWidgetItem *list_iot_dev = new QListWidgetItem(ip + QString("\t") + data,ui->dev_infor_listWidget);ui->dev_infor_listWidget->insertItem(1,list_iot_dev);}void MainWindow::on_search_dev_pushButton_clicked()
{for(unsigned char i = 0; i < g_connect_count; i ++){ip_all[i][0] = "";//清空缓冲区}g_connect_count = 0;ui->dev_infor_listWidget->clear();list_init();//重新初始化
}
测试情况如下:(测试客户端使用通信猫,后续的话,我会将客户端这部分的代码进行补充,现在还没有写好)
运行程序,效果如下:
打开通信猫软件,选择udp,然后设置广播的方式:
设计的知识归纳:
1.QT UDP的使用
2.QListWidget的使用
3.QListWidgetItem的使用
使用例子都在源代码里了。好好码一次,加深理解即可~~~~
如果这篇文章,对你有帮助,就点个赞再走哈~~~
QT上位机:局域网特定设备ip查询和显示相关推荐
- FPGA基于XDMA实现PCIE X4通信方案 提供工程源码和QT上位机程序和技术支持
目录 1.前言 2.我已有的PCIE方案 3.PCIE理论 4.总体设计思路和方案 5.vivado工程详解 6.驱动安装 7.QT上位机软件 8.上板调试验证 9.福利:工程代码的获取 1.前言 P ...
- 【USB网络摄像头】基于mjpeg-streamer的视频采集与播放【QT上位机软件】
前言 最近一直在尝试制作一个,网络摄像头,先后分别尝试了使用QT包装的UDP类TCP类,和LINUX中的socket编程等方式,但是非常遗憾,都没有取得非常好的播放效果.以为只要一帧一帧的传输视频数据 ...
- 【HNU小学期硬件实训】基于QT上位机的汽车监控警报系统
测试视频已上传到b站: 基于QT上位机的汽车监控警报系统 一.绪论 本次实验的选题是基于 QT 上位机的汽车行驶监控警报系统,灵感来源于本人在行驶电动车过程 中遇到的问题,为汽车模拟了不同的场景,外接 ...
- QT 篇 QT上位机串口编程
QT 篇 QT上位机串口编程 最近因为项目需要,需要用到上位机,通过串口与上位机进行通讯,来上传和下发一些数据以及控制指令,所以用QT写了一个上位机,并记录下来,免得到时候要用又到处翻资料. QT版本 ...
- qt串口采用队列_基于STM32的RGB调色器——STM32程序和Qt上位机全开源
前言 uFUN开发板1.0版本评测时,基于Qt写了个小上位机,可以通过串口来控制板子上的RGB灯,通过控制,可以混合出任意的颜色,今天整理了一下,开源这个Qt上位机和STM32代码. 项目介绍 基于u ...
- 基于uFUN开发板的心率计(三)Qt上位机的实现
前言 上两周利用周末的时间,分别写了基于uFUN开发板的心率计(一)DMA方式获取传感器数据和基于uFUN开发板的心率计(二)动态阈值算法获取心率值,介绍了AD采集传感器数据和数据的滤波处理获取心率值 ...
- 基于STM32的RGB调色器——STM32程序和Qt上位机全开源
文章目录 前言 项目介绍 uFUN开发板 STM32下位机 Qt上位机 我的评测文章 关于我 前言 uFUN开发板1.0版本评测时,基于Qt写了个小上位机,可以通过串口来控制板子上的RGB灯,通过控制 ...
- STM32串口烧录BIN文件、字库文件【QT上位机】- Uart_Transfer_BIN_to_EX_FLASH
STM32串口烧录BIN文件.字库文件[QT上位机] 项目已开源至GitHub,供大家一起学习使用 点我传送 这里写目录标题 STM32串口烧录BIN文件.字库文件[QT上位机] 一.上位机部分 1. ...
- Qt上位机软件串口通讯
录了一个串口讲解的视频,分别放在了抖音和B站,大家可以看看,主要讲了一下原理, B站我的主页:laorenshen的个人空间_哔哩哔哩_Bilibili 视频源码下载免费:Qt上位机软件串口通讯,视频 ...
最新文章
- Django框架之初识
- const 与 static readonly 的区别
- shm_overview(7)
- SAP Cloud for Customer里的HTML Mashup的JavaScript编程功能
- readyread信号不触发_触发器型PFD与传统型PFD性能仿真对比
- pthread_cancel、pthread_equal函数
- Tensorflow 入门手册(代码与原理释义)
- django-pure-pagination 分页插件
- JAVA零碎要点015---java BigDecimal常见操作_加减乘除操作_比较_取几位小数四舍五入_随时更新
- 熬了整整30天,字节跳动算法工程师面试
- Atitit 项目文档规范化与必备文档与推荐文档列表
- el-table 树形表格 自定义展开图标_目前比较满意的安卓桌面启动器:非线性动画 + 精美图标包...
- 支持Win7的星号密码查看器的实现
- DNN硬件加速器设计4 -- Co-Design and Benchmarking Metrics(MIT)
- U盘启动 WinPE系统维护工具 任意安装GHO/WIM/ESD系统映像 无广告专业版
- 液晶屏接口定义_简介TFT-LCD液晶屏接口类型之LVDS接口
- c语言挖地雷游戏,c扫雷小游戏
- elcipse开发android locat一会显示一会消失的问题
- Excel中实现跨表数据有效性
- uni-app 文件选择、文件管理器(ios11)