运行环境: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查询和显示相关推荐

  1. FPGA基于XDMA实现PCIE X4通信方案 提供工程源码和QT上位机程序和技术支持

    目录 1.前言 2.我已有的PCIE方案 3.PCIE理论 4.总体设计思路和方案 5.vivado工程详解 6.驱动安装 7.QT上位机软件 8.上板调试验证 9.福利:工程代码的获取 1.前言 P ...

  2. 【USB网络摄像头】基于mjpeg-streamer的视频采集与播放【QT上位机软件】

    前言 最近一直在尝试制作一个,网络摄像头,先后分别尝试了使用QT包装的UDP类TCP类,和LINUX中的socket编程等方式,但是非常遗憾,都没有取得非常好的播放效果.以为只要一帧一帧的传输视频数据 ...

  3. 【HNU小学期硬件实训】基于QT上位机的汽车监控警报系统

    测试视频已上传到b站: 基于QT上位机的汽车监控警报系统 一.绪论 本次实验的选题是基于 QT 上位机的汽车行驶监控警报系统,灵感来源于本人在行驶电动车过程 中遇到的问题,为汽车模拟了不同的场景,外接 ...

  4. QT 篇 QT上位机串口编程

    QT 篇 QT上位机串口编程 最近因为项目需要,需要用到上位机,通过串口与上位机进行通讯,来上传和下发一些数据以及控制指令,所以用QT写了一个上位机,并记录下来,免得到时候要用又到处翻资料. QT版本 ...

  5. qt串口采用队列_基于STM32的RGB调色器——STM32程序和Qt上位机全开源

    前言 uFUN开发板1.0版本评测时,基于Qt写了个小上位机,可以通过串口来控制板子上的RGB灯,通过控制,可以混合出任意的颜色,今天整理了一下,开源这个Qt上位机和STM32代码. 项目介绍 基于u ...

  6. 基于uFUN开发板的心率计(三)Qt上位机的实现

    前言 上两周利用周末的时间,分别写了基于uFUN开发板的心率计(一)DMA方式获取传感器数据和基于uFUN开发板的心率计(二)动态阈值算法获取心率值,介绍了AD采集传感器数据和数据的滤波处理获取心率值 ...

  7. 基于STM32的RGB调色器——STM32程序和Qt上位机全开源

    文章目录 前言 项目介绍 uFUN开发板 STM32下位机 Qt上位机 我的评测文章 关于我 前言 uFUN开发板1.0版本评测时,基于Qt写了个小上位机,可以通过串口来控制板子上的RGB灯,通过控制 ...

  8. STM32串口烧录BIN文件、字库文件【QT上位机】- Uart_Transfer_BIN_to_EX_FLASH

    STM32串口烧录BIN文件.字库文件[QT上位机] 项目已开源至GitHub,供大家一起学习使用 点我传送 这里写目录标题 STM32串口烧录BIN文件.字库文件[QT上位机] 一.上位机部分 1. ...

  9. Qt上位机软件串口通讯

    录了一个串口讲解的视频,分别放在了抖音和B站,大家可以看看,主要讲了一下原理, B站我的主页:laorenshen的个人空间_哔哩哔哩_Bilibili 视频源码下载免费:Qt上位机软件串口通讯,视频 ...

最新文章

  1. Django框架之初识
  2. const 与 static readonly 的区别
  3. shm_overview(7)
  4. SAP Cloud for Customer里的HTML Mashup的JavaScript编程功能
  5. readyread信号不触发_触发器型PFD与传统型PFD性能仿真对比
  6. pthread_cancel、pthread_equal函数
  7. Tensorflow 入门手册(代码与原理释义)
  8. django-pure-pagination 分页插件
  9. JAVA零碎要点015---java BigDecimal常见操作_加减乘除操作_比较_取几位小数四舍五入_随时更新
  10. 熬了整整30天,字节跳动算法工程师面试
  11. Atitit 项目文档规范化与必备文档与推荐文档列表
  12. el-table 树形表格 自定义展开图标_目前比较满意的安卓桌面启动器:非线性动画 + 精美图标包...
  13. 支持Win7的星号密码查看器的实现
  14. DNN硬件加速器设计4 -- Co-Design and Benchmarking Metrics(MIT)
  15. U盘启动 WinPE系统维护工具 任意安装GHO/WIM/ESD系统映像 无广告专业版
  16. 液晶屏接口定义_简介TFT-LCD液晶屏接口类型之LVDS接口
  17. c语言挖地雷游戏,c扫雷小游戏
  18. elcipse开发android locat一会显示一会消失的问题
  19. Excel中实现跨表数据有效性
  20. uni-app 文件选择、文件管理器(ios11)

热门文章

  1. DGP链游公会首发合作项目——D.G.Pals
  2. 对规模区域消防给水系统的探讨
  3. 软件工程 实践者的研究方法 第31章答案
  4. 虚拟机网络与docker理解
  5. 基于51单片机的数字音乐彩灯电子琴proteus仿真原理图PCB
  6. Android N调用系统安装APK方法报错原因整理及解决方案
  7. Bugtags工具试用过程笔记
  8. java跳蚤市场源码,跳蚤市场的源代码
  9. windows系统垃圾清理的批处理代码
  10. 胶囊网络的理解:动态路由与聚类