qt之telnet连接目标设备在线调试功能

一、前言

在QT下使用telnet连接目标设备,进行在线命令调试,也可配合ftp或ssh使用。

telnet某些库在qt5下不可用,无法获取登录信息,只能获取到连接信息,这里我用自己的方式判断是否成功登录

二、环境

window

qt5.7

三、正文

网上有很多开源的qt+telnet使用方法,基本都是依赖于第三方库qttelnet.cpp,这个文件我就不发出了,网上有很多免费下载连接,下面放上实现功能的核心代码

#include "apponline.h"
#include "ui_apponline.h"
#include "login.h"apponline::apponline(QWidget *parent) :QWidget(parent),ui(new Ui::apponline)
{ui->setupUi(this);this->setWindowModality(Qt::ApplicationModal);//窗口置顶this->setWindowTitle("在线调试");clearControls();//清除信息///初始化telnetm_telnet = new QtTelnet(this);connect(m_telnet, SIGNAL(message(const QString &)),this,SLOT(telnetMessage(const QString &)));connect(m_telnet, SIGNAL(loginRequired()),this, SLOT(telnetLoginRequired()));//qt6好使connect(m_telnet, SIGNAL(loginFailed()),this, SLOT(telnetLoginFailed()));//qt6好使connect(m_telnet, SIGNAL(loggedOut()),this, SLOT(telnetLoggedOut()));connect(m_telnet, SIGNAL(loggedIn()),this, SLOT(telnetLoggedIn()));//qt6好使connect(m_telnet, SIGNAL(connectionError(QAbstractSocket::SocketError)),this, SLOT(telnetconnectionError(QAbstractSocket::SocketError)));}apponline::~apponline()
{m_telnet->logout();m_telnet->close();m_telnet->destroyed();delete ui;qDebug()<<"apponline free";
}//连接设备按键
void apponline::on_btnConn_2_clicked()
{//重新初始化m_telnet->logout();m_telnet->close();m_telnet->deleteLater();m_telnet = nullptr;m_telnet = new QtTelnet(this);connect(m_telnet, SIGNAL(message(const QString &)),this,SLOT(telnetMessage(const QString &)));connect(m_telnet, SIGNAL(loginRequired()),this, SLOT(telnetLoginRequired()));//qt6好使connect(m_telnet, SIGNAL(loginFailed()),this, SLOT(telnetLoginFailed()));//qt6好使connect(m_telnet, SIGNAL(loggedOut()),this, SLOT(telnetLoggedOut()));connect(m_telnet, SIGNAL(loggedIn()),this, SLOT(telnetLoggedIn()));//qt6好使connect(m_telnet, SIGNAL(connectionError(QAbstractSocket::SocketError)),this, SLOT(telnetconnectionError(QAbstractSocket::SocketError)));on_btnclear1_clicked();on_btnclear2_clicked();clearControls();//清除信息if (isTelnetConnected(sIP,23)) {// 连接成功的处理m_Telnetconnectflag=1;//Telnet连接登录状态  0:未登录 1:连接成功 2:登录成功ui->textEdit->append("连接目标设备成功,点击【登录账户】按键登录,成功后可进行在线调试");//telnet连接m_telnet->connectToHost(sIP);ui->btnConn_2->setEnabled(false);} else {// 连接失败的处理m_Telnetconnectflag=0;//Telnet连接登录状态  0:未登录 1:连接成功 2:登录成功ui->textEdit->append("未连接目标设备,请检查网络是否正常连接,请检查目标设备Telnet端口是否开启");}
}
//断开连接按键
void apponline::on_btnDisConn_2_clicked()
{m_telnet->logout();m_telnet->close();clearControls();//清除信息
}
//判断设备网络连接
bool apponline::isTelnetConnected(const QString &host, quint16 port)
{QTcpSocket socket;socket.connectToHost(host, port);if (socket.waitForConnected(3000)) { // 等待3秒来建立连接qDebug() << "Connected to" << host << "on port" << port;socket.close(); // 连接成功后关闭socketreturn true;} else {qDebug() << "Connection failed:" << socket.errorString();socket.close(); // 连接失败后关闭socketreturn false;}
}
//清空
void apponline::on_btnclear1_clicked()
{ui->textEdit->clear();
}
void apponline::on_btnclear2_clicked()
{ui->textEdit_2->clear();
}
//清除信息
void apponline::clearControls()
{m_Telnetconnectflag=0;//Telnet连接登录状态  0:未登录 1:连接成功 2:登录成功ui->textEdit->clear();ui->textEdit->append("本机IP地址:");getLocalIPs();//获取本地IPui->btnConn_2->setEnabled(true);
}
//登录账户按键
void apponline::on_pushButton_clicked()
{//判断账号密码输入栏是否为空,进行错误提示if(ui->lineEdit_name->text().isEmpty()||ui->lineEdit_passwd->text().isEmpty()){massage_dialog(1,"提示","设备账户或密码不能为空!",1,30);return;}//判断是否连接成功if(m_Telnetconnectflag==0){//Telnet连接登录状态  0:未登录 1:连接成功 2:登录成功massage_dialog(1,"提示","请先连接目标设备!",1,30);return;}if(m_Telnetconnectflag==2){//Telnet连接登录状态  0:未登录 1:连接成功 2:登录成功massage_dialog(1,"提示","已登陆账户!",1,30);return;}ui->pushButton->setEnabled(false);QTimer::singleShot(100,this,[=]{m_telnet->sendData(ui->lineEdit_name->text());});QTimer::singleShot(500,this,[=]{m_telnet->sendData(ui->lineEdit_passwd->text());});QTimer::singleShot(3000,this,[=]{ui->pushButton->setEnabled(true);});
}//回车发送telnet命令
void apponline::on_Qtelnet_lineEdit_returnPressed()
{//判断是否连接成功if(m_Telnetconnectflag==0){//Telnet连接登录状态  0:未登录 1:连接成功 2:登录成功massage_dialog(1,"提示","请先连接目标设备!",1,30);return;}QString cmd = ui->Qtelnet_lineEdit->text();m_telnet->sendData(cmd);writeLog(QString("在线调试telnet发送:").arg(cmd));//日志记录
}
//combox选择发送telnet命令
void apponline::on_comboBox_activated(const QString &arg1)
{//判断是否连接成功if(m_Telnetconnectflag!=2){//Telnet连接登录状态  0:未登录 1:连接成功 2:登录成功massage_dialog(1,"提示","请先连接目标设备!",1,30);return;}m_telnet->sendData(arg1);writeLog(QString("在线调试telnet发送:").arg(arg1));//日志记录
}///QtTelnet//接收telnet消息
void apponline::telnetMessage(const QString &msg)
{QString nmsg(msg);nmsg.remove("\r");
//    nmsg.remove("root");
//    nmsg.remove("SYSYKJsysykj123..");
//    nmsg.remove("A40i login:");
//    nmsg.remove("Password:");nmsg.remove(QRegExp("\033\\[[0-9;]*[A-Za-z]")); // Also remove terminal control codesui->textEdit_2->append(nmsg);//判断登录成功,使用符号 # 判断,登录成功后会出现此符号if(nmsg.contains('#')){if(m_Telnetconnectflag==1)//判断第一次登录ui->textEdit->append("登录目标设备成功,可进行在线调试");m_Telnetconnectflag=2;//Telnet连接登录状态  0:未登录 1:连接成功 2:登录成功}}
//登录  此函数QT6使用,QT5不触发
void apponline::telnetLoginRequired()
{qDebug()<<"telnetLoginRequired";
//    QString user = ui->lineEdit_name->text();
//    QString passwd  = ui->lineEdit_passwd->text();
//    if(user == "" || passwd == ""){
//        ui->textEdit->append("用户名和密码不能为空!");
//        return;
//    }
//    m_telnet->login(user,passwd); // 登入telnet
}
//登录失败  此函数QT6使用,QT5不触发
void apponline::telnetLoginFailed()
{qDebug()<<"telnetLoginFailed";ui->textEdit->append("Telnet登录失败,请检查账号或密码是否正确");
}
//断开连接
void apponline::telnetLoggedOut()
{m_Telnetconnectflag=0;//Telnet连接登录状态  0:未登录 1:连接成功 2:登录成功ui->btnConn_2->setEnabled(true);qDebug()<<"telnetLoggedOut";ui->textEdit->append("Telnet在线调试断开连接");
}
//登录成功  此函数QT6使用,QT5不触发
void apponline::telnetLoggedIn()
{qDebug()<<"telnetLoggedIn";ui->textEdit->append("Telnet登录成功,可以执行在线调试功能");
}
//错误信息
void apponline::telnetconnectionError(QAbstractSocket::SocketError error)
{qDebug()<<"err:"<<error;
}// 获取本机所有 IP 地址
void apponline::getLocalIPs() {QList<QHostAddress> ipAddressesList;QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();foreach (QNetworkInterface item, interfaces) {if (item.flags() & QNetworkInterface::IsUp && !(item.flags() & QNetworkInterface::IsLoopBack)) {QList<QNetworkAddressEntry> addressEntries = item.addressEntries();foreach (QNetworkAddressEntry entry, addressEntries) {if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol)ipAddressesList.append(entry.ip());}}}// 输出所有 IP 地址foreach (QHostAddress address, ipAddressesList) {//        qDebug() << address.toString();ui->textEdit->append(address.toString());}
}

可以看见telnet的原生信号中登录命令是备注qt5不好使的,疑是qt6可用,但是我的电脑环境没有qt6,暂时也用不上,暂时没有测试,有环境的童鞋可以自己测试一下。

既然登录状态函数不好使,那么就得通过其他方式去判断用户的账号密码是否登录成功,这里我就是简单的通过接收命令中是否有#符号出现,这个符号一般就是登录成功后出现的第一个字符。

界面UI如下所示

有些控件按键没有用,大家可以自行根据核心代码进行修改。

四、结语

telnet

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/475720.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小熊派Nano接入华为云

一、华为云IoTDA创建产品 创建如下服务&#xff0c;并添加对应的属性和命令。 二、小熊派接入 根据小熊派官方示例代码D6完成了小熊派接入华为云并实现属性上传命令下发。源码&#xff1a;小熊派开源社区/BearPi-HM_Nano 1. MQTT连接代码分析 这部分代码在oc_mqtt.c和oc_mq…

Hbuilder X/Uniapp 关于app运行调试及mumu模拟器运行问题

Hbuilder X 关于app调试问题及mumu模拟器链接问题 Hbuilder 关于app调试问题1. app运行配置2. adb路径配置3. 模拟器端口查询4. 运行 Hbuilder 关于app调试问题 1. app运行配置 Hbuilder > 工具 > 设置 > 运行配置 adb路径配置&#xff08;见2&#xff09; Android模…

MySQL-关键字执行顺序

&#x1f496;简介 在MySQL中&#xff0c;SQL查询语句的执行遵循一定的逻辑顺序&#xff0c;即使这些关键字在SQL语句中的物理排列可能有所不同。 &#x1f31f;语句顺序 (8) SELECT (9) DISTINCT<select_list> (1) FROM <left_table> (3) <join_type> JO…

【SpringBoot】26 实体映射工具(MapStruct)

Gitee 仓库 https://gitee.com/Lin_DH/system 介绍 现状 为了让应用程序的代码更易于维护&#xff0c;通常会将项目进行分层。在《阿里巴巴 Java 开发手册》中&#xff0c;推荐分层如下图所示&#xff1a; 每层都有对应的领域模型&#xff0c;即不同类型的 Bean。 DO&…

RPC-健康检测机制

什么是健康检测&#xff1f; 在真实环境中服务提供方是以一个集群的方式提供服务&#xff0c;这对于服务调用方来说&#xff0c;就是一个接口会有多个服务提供方同时提供服务&#xff0c;调用方在每次发起请求的时候都可以拿到一个可用的连接。 健康检测&#xff0c;能帮助从连…

Enterprise Architect 16 下载、安装与无限30天操作

文章目录 Enterprise Architect 16 简介&#xff08;一&#xff09;支持多种建模语言和标准&#xff08;二&#xff09;强大的版本控制、协作和文档管理功能&#xff08;三&#xff09;增强的技术和用户体验&#xff08;四&#xff09;高级功能和扩展性 一&#xff0c;下载软件…

小程序租赁系统开发为企业提供高效便捷的租赁服务解决方案

内容概要 在这个数字化飞速发展的时代&#xff0c;小程序租赁系统应运而生&#xff0c;成为企业管理租赁业务的一种新选择。随着移动互联网的普及&#xff0c;越来越多的企业开始关注如何利用小程序来提高租赁服务的效率和便捷性。小程序不仅可以为用户提供一个快速、易用的平…

定时器的小应用

第一个项目 第一步&#xff0c;RCC开启时钟&#xff0c;这个基本上每个代码都是第一步&#xff0c;不用多想&#xff0c;在这里打开时钟后&#xff0c;定时器的基准时钟和整个外设的工作时钟就都会同时打开了 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);第二步&…

JVM--内存结构

目录 1. PC Register&#xff08;程序计数器&#xff09; 1.1 定义 1.2 工作原理 1.3 特点 1.4 应用 2.虚拟机栈 2.1定义与特性 2.2内存模型 2.3工作原理 2.4异常处理 2.5应用场景 2.6 Slot 复用 2.7 动态链接详解 1. 栈帧与动态链接 动态链接的作用&#xff1a…

一文读懂Redis6的--bigkeys选项源码以及redis-bigkey-online项目介绍

一文读懂Redis6的--bigkeys选项源码以及redis-bigkey-online项目介绍 本文分为两个部分&#xff0c;第一是详细讲解Redis6的--bigkeys选项相关源码是怎样实现的&#xff0c;第二部分为自己对--bigkeys源码的优化项目redis-bigkey-online的介绍。redis-bigkey-online是自己开发的…

Go语言跨平台桌面应用开发新纪元:LCL、CEF与Webview全解析

开篇寄语 在Go语言的广阔生态中&#xff0c;桌面应用开发一直是一个备受关注的领域。今天&#xff0c;我将为大家介绍三款基于Go语言的跨平台桌面应用开发框架——LCL、CEF与Webview&#xff0c;它们分别拥有独特的魅力和广泛的应用场景。通过这三款框架&#xff0c;你将能够轻…

音视频入门基础:MPEG2-TS专题(5)——FFmpeg源码中,判断某文件是否为TS文件的实现

一、引言 通过FFmpeg命令&#xff1a; ./ffmpeg -i XXX.ts 可以判断出某个文件是否为TS文件&#xff1a; 所以FFmpeg是怎样判断出某个文件是否为TS文件呢&#xff1f;它内部其实是通过mpegts_probe函数来判断的。从《FFmpeg源码&#xff1a;av_probe_input_format3函数和AVI…

C++初阶学习第十一弹——list的用法和模拟实现

目录 一、list的使用 二.list的模拟实现 三.总结 一、list的使用 list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向 其前一个元素和后一个元素。 常见的list的函数的使用 std::list<int> It {1,…

Qlik Sense QVD 文件

QVD 文件 QVD (QlikView Data) 文件是包含从 Qlik Sense 或 QlikView 中所导出数据的表格的文件。QVD 是本地 Qlik 格式&#xff0c;只能由 Qlik Sense 或 QlikView 写入和读取。当从 Qlik Sense 脚本中读取数据时&#xff0c;该文件格式可提升速度&#xff0c;同时又非常紧凑…

攻防世界 Web新手练习区

GFSJ0475 get_post 获取在线场景后&#xff0c;点开网址 依据提示在搜索框输入信息 给出第二条提示信息 打开hackbar&#xff0c;将网址Load下来&#xff0c;勾选Post data&#xff0c;在下方输入框输入b2 点击Execute 出现flag值 GFSJ0476 robots 打开御剑扫描域名&#…

MySQL —— explain 查看执行计划与 MySQL 优化

文章目录 explain 查看执行计划explain 的作用——查看执行计划explain 查看执行计划返回信息详解表的读取顺序&#xff08;id&#xff09;查询类型&#xff08;select_type&#xff09;数据库表名&#xff08;table&#xff09;联接类型&#xff08;type&#xff09;可用的索引…

前端研发高德地图,如何根据经纬度获取地点名称和两点之间的距离?

地理编码与逆地理编码 引入插件&#xff0c;此示例采用异步引入&#xff0c;更多引入方式 https://lbs.amap.com/api/javascript-api-v2/guide/abc/plugins AMap.plugin("AMap.Geocoder", function () {var geocoder new AMap.Geocoder({city: "010", /…

React(二)

文章目录 项目地址七、数据流7.1 子组件传递数据给父组件7.1.1 方式一:給父设置回调函数,传递给子7.1.2 方式二:直接将父的setState传递给子7.2 给props传递jsx7.2.1 方式一:直接传递组件给子类7.2.2 方式二:传递函数给子组件7.3 props类型验证7.4 props的多层传递7.5 cla…

SpringBootTest常见错误解决

1.启动类所在包错误 问题 由于启动类所在包与需要自动注入的类的包不在一个包下&#xff1a; 启动类所在包&#xff1a; com.exmaple.test_02 但是对于需要注入的类却不在com.exmaple.test_02下或者其子包下&#xff0c;就会导致启动类无法扫描到该类&#xff0c;从而无法对…

Redis面试篇笔记(持续更新)

一、redis主从集群 单节点redis的并发能力是由上限的&#xff0c;要进一步提高redis的并发能力可以搭建主从集群&#xff0c;实现读写分离&#xff0c;一主多从&#xff0c;主节点写数据&#xff0c;从节点读数据 部署redis主从节点的docker-compose文件命令解析 version: &q…