add log4cplus

This commit is contained in:
lnk
2025-05-09 16:53:07 +08:00
parent 92117de97e
commit 8a2e6ea537
109 changed files with 18240 additions and 4034 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -22,46 +22,46 @@
#include <QMap>
#define STAT_DATA_BASE_NODE_ID 100 //<EFBFBD><EFBFBD>̬<EFBFBD><EFBFBD>ͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define THREE_SECS_DATA_BASE_NODE_ID 200 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD>ʵʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define SOE_COMTRADE_BASE_NODE_ID 300 // soe ¼<EFBFBD><EFBFBD>
#define HIS_DATA_BASE_NODE_ID 400 //<EFBFBD><EFBFBD>ʷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define STAT_DATA_BASE_NODE_ID 100 //稳态、统计数据
#define THREE_SECS_DATA_BASE_NODE_ID 200 // 三秒数据、实时数据
#define SOE_COMTRADE_BASE_NODE_ID 300 // soe 录波
#define HIS_DATA_BASE_NODE_ID 400 //历史、补招
class json_block_data //jsonƴ<EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
class json_block_data //json拼接参数类
{
public:
int monitorId; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID
int func_type; //<EFBFBD><EFBFBD>Ӧ(#define<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>100 <EFBFBD><EFBFBD> 400)<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>
int flag; //<EFBFBD>޳<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD>1<EFBFBD><EFBFBD><EFBFBD>޳<EFBFBD><EFBFBD><EFBFBD>0<EFBFBD>޳<EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD><EFBFBD>޳<EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ρ<EFBFBD><CEA1><EFBFBD>˲<EFBFBD><CBB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD>·װ<C2B7>ô<EFBFBD><C3B4><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2018-11-21 19:32:38
long long time; //ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>)
double voltage_level; //CZY 2023-08-23 <EFBFBD><EFBFBD>ѹ<EFBFBD>ȼ<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>double<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
QString mp_id; //char<EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
QString dev_type;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int monitorId; //监测点ID
int func_type; //对应(#define宏定义中100 400)功能选项
int flag; //剔除标记1不剔除0剔除默认剔除 ——————问下王巍,此参数如何从线路装置处获取???2018-11-21 19:32:38
long long time; //时间戳(毫秒)
double voltage_level; //CZY 2023-08-23 电压等级(翻译后的double类型)
QString mp_id; //char型监测点
QString dev_type;//设备类型
QMap<QString, double> mms_str_map; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ(61850<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>ֵ)
QMap<QString, double> mms_str_map; //数据值(61850数据属性名, 数据值)
};
class Ckafka_data_t //kafka<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ<EFBFBD><EFBFBD>
class Ckafka_data_t //kafka发送数据结构类
{
public:
int monitor_id; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID
QString strTopic; //kafka<EFBFBD><EFBFBD><EFBFBD><EFBFBD>topic
QString strText; //kafka<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>json<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
QString mp_id; //char<EFBFBD><EFBFBD><EFBFBD><EFBFBD>id
int monitor_id; //监测点ID
QString strTopic; //kafka发送topic
QString strText; //kafka发送的json字符串
QString mp_id; //char类型id
};
class oss_data_t //oss<EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ<EFBFBD><EFBFBD> zw 2023-9-22 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
class oss_data_t //oss推送发送数据结构类 zw 2023-9-22 新增
{
public:
QString filename; //<EFBFBD>Ʊ<EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD>
QString savename; //<EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD>
QString data; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
QString filename; //云保存路径
QString savename; //本地保存路径
QString data; //保存的数据
//<EFBFBD><EFBFBD>־ͨ<EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD>
QString log_name; //<EFBFBD>ն<EFBFBD>id<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>id
QString id; //<EFBFBD>ն<EFBFBD>id<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>id
QString time; //ʱ<EFBFBD><EFBFBD>
//日志通用参数
QString log_name; //终端id或监测点id
QString id; //终端id或监测点id
QString time; //时间
int base_mat_num;
int adv_mat_num;
int base_act_num;
@@ -69,7 +69,7 @@ public:
int list_num;
};
int transfer_json_block_data(char v_wiring_type[], json_block_data* data);//lnk2024-8-16<EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD>
int transfer_json_block_data(char v_wiring_type[], json_block_data* data);//lnk2024-8-16添加参数
#endif /* __cplusplus */
@@ -80,8 +80,8 @@ extern "C" {
int transfer_json_qvvr_data(unsigned int func_type,int monitor_id,double mag,double dur,long long start_tm,long long end_tm,int dis_kind, char* uuid_cfg, char* uuid_dat, char* mp_id, char* Qvvr_rptname, char* devtype);
void processGGIO_start_data_end(char* mp_id, char* fullname, double v,long long time,char* devtype,int monitor_id);
void Set_xml_databaseinfo(char* MODEL_ID, char* TMNL_TYPE, char* TMNL_FACTORY, char* FILE_NAME, int year, int month, int day, int hour, int minute, int second);//zw<EFBFBD>޸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><C3BA><EFBFBD>
void Set_xml_nodeinfo();//zw<EFBFBD>޸<EFBFBD>
void Set_xml_databaseinfo(char* MODEL_ID, char* TMNL_TYPE, char* TMNL_FACTORY, char* FILE_NAME, int year, int month, int day, int hour, int minute, int second);//zw修改 新增调用函数
void Set_xml_nodeinfo();//zw修改
char* Get_xmlpath(char* devtype);
char* Get_IED(char* devtype);
char* Get_LDevice(char* devtype);

File diff suppressed because it is too large Load Diff

View File

@@ -32,8 +32,8 @@ extern "C" {
#include <QThread>
//lnk20250106
#include "../include/rocketmq/SimpleProducer.h"
//<EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#include "../rocketmq/SimpleProducer.h"
//日志功能
#include "../cfg_parse/custom_printf.h"//lnk20250225
#include <csignal>
#include <unistd.h>
@@ -63,7 +63,7 @@ class KafkaSendThread : public QThread
protected:
void run();
};
//WW 2023-08-22 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD>̺߳<EFBFBD>WebSocket<EFBFBD>߳<EFBFBD>
//WW 2023-08-22 增加数据库线程和WebSocket线程
class WebSocketThread : public QThread
{
@@ -96,21 +96,21 @@ void doMonitorTaskmain(void);
}
#endif
// ====================== Telnet <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ======================
// Telnet <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>:
// ====================== Telnet 常量定义 ======================
// Telnet 命令字节:
#define IAC 255 // Interpret As Command
#define DONT 254
#define TELDO 253
#define WONT 252
#define WILL 251
// Telnet ѡ<EFBFBD><EFBFBD><EFBFBD>:
#define TELOPT_ECHO 1 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Telnet 选项常量:
#define TELOPT_ECHO 1 // 回显
#define TELOPT_SUPPRESS_GO_AHEAD 3 // SGA
#define TELOPT_LINEMODE 34 // <EFBFBD><EFBFBD>ģʽ
#define TELOPT_LINEMODE 34 // 行模式
/**
* @brief Worker<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Telnet<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD>
* @brief Worker包含启动服务器、处理Telnet交互等逻辑
*/
class Worker : public QObject
{
@@ -130,7 +130,7 @@ public:
}
~Worker() {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 清理定时器和服务器
stopServer();
}
@@ -141,19 +141,19 @@ public:
public slots:
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @brief 启动服务器
*/
void startServer() {
if (server) {
qDebug() << "Server is already running!";
return; // <EFBFBD><EFBFBD>ֹ<EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return; // 防止重复启动服务器
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> QTcpServer <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 创建 QTcpServer 并设置信号与槽
server = new QTcpServer(this);
connect(server, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
// <EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
// 尝试监听端口
if (!server->listen(QHostAddress::Any, TEST_PORT)) {
std::cout << "Server failed to start!" << std::endl;
qDebug() << "Server failed to start!";
@@ -164,15 +164,15 @@ public slots:
qDebug() << QString("Server is running on port %1").arg(TEST_PORT);
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
// 创建并启动定时器
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(doPeriodicTask()));
timer->start(60000); // ÿ60<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
timer->start(60000); // 60秒触发一次
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵߳ļ<EFBFBD><EFBFBD><EFBFBD>
// 开启另一个周期函数用来替换主线程的监控
QTimer *monitorTimer = new QTimer(this);
connect(monitorTimer, SIGNAL(timeout()), this, SLOT(doMonitorTask()));
monitorTimer->start(1000); // ÿ1<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
monitorTimer->start(1000); // 每1秒触发一次
std::cout << "Timer started, event loop running in thread: "
<< QThread::currentThreadId() << std::endl;
@@ -180,10 +180,10 @@ public slots:
}
/**
* @brief ֹͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @brief 停止服务器
*/
void stopServer() {
// ֹͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
// 停止服务器并清理资源
if (server) {
server->close();
delete server;
@@ -191,7 +191,7 @@ public slots:
qDebug() << "Server stopped.";
}
// ֹͣ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
// 停止定时器
if (timer) {
timer->stop();
delete timer;
@@ -201,7 +201,7 @@ public slots:
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>TEST_NUM
* @brief 设置TEST_NUM
*/
void setTestNum(int num) {
QMutexLocker locker(&mutex);
@@ -217,7 +217,7 @@ public slots:
private slots:
/**
* @brief <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @brief 定时任务
*/
void doPeriodicTask() {
QMutexLocker locker(&mutex);
@@ -232,14 +232,14 @@ private slots:
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @brief 监控任务
*/
void doMonitorTask() {
doMonitorTaskmain();
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¿ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @brief 当有新客户端连接时处理
*/
void onNewConnection() {
if (!server) return;
@@ -248,24 +248,24 @@ private slots:
qDebug() << "New connection established!";
std::cout << "New connection established!\n";
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> readyRead / disconnected
// 绑定 readyRead / disconnected
connect(clientSocket, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
connect(clientSocket, SIGNAL(disconnected()), clientSocket, SLOT(deleteLater()));
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Telnet Э<EFBFBD><EFBFBD>
// 发送 Telnet 协商
sendTelnetNegotiation(clientSocket);
// <EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD>ӭ<EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>
// 发送欢迎信息和提示符
if (clientSocket) {
std::cout << "clientSocket OK\n";
clientSocket->write("\r\x1B[K");
clientSocket->write("Welcome to the test shell. Type 'help' for available commands.\r\n");
printPrompt(clientSocket); // ͳһ<EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>
printPrompt(clientSocket); // 统一打印提示符
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD>˷<EFBFBD><EFBFBD>͵<EFBFBD>Telnet<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @brief 处理客户端发送的Telnet数据
*/
void onReadyRead() {
QTcpSocket *clientSocket = qobject_cast<QTcpSocket *>(sender());
@@ -278,22 +278,22 @@ private slots:
for (int i = 0; i < data.size(); ++i) {
unsigned char c = static_cast<unsigned char>(data[i]);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IAC(255)<EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Telnet Э<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
// 如果检测到 IAC(255),说明是 Telnet 协商指令
if (c == IAC) {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TELDO/DONT/WILL/WONT + option
// 简单跳过 TELDO/DONT/WILL/WONT + option
if (i + 1 < data.size()) {
unsigned char cmd = static_cast<unsigned char>(data[i+1]);
if (cmd == TELDO || cmd == DONT || cmd == WILL || cmd == WONT) {
i += 2; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>ֽ<EFBFBD>
i += 2; // 跳过这2字节
} else {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>IAC SB)<29><><EFBFBD>˴<EFBFBD><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>
// 遇到其它情况(比如IAC SB),此处仅简单跳过一个字节
i += 1;
}
}
continue;
}
// 1) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> '`' <EFBFBD>˳<EFBFBD> viewlog <EFBFBD><EFBFBD>ping
// 1) 处理 '`' 退出 viewlog ping
if (c == '`') {
std::cout << "Received '`' from shell socket! Exiting viewlog...\n";
if (activeClient == clientSocket) {
@@ -306,29 +306,29 @@ private slots:
return;
}
// 2) <EFBFBD>س<EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 2) 回车换行:执行命令
if (c == '\r' || c == '\n') {
if (!currentCommand.isEmpty()) {
// <EFBFBD>ӵ<EFBFBD><EFBFBD><EFBFBD>ʷ
// 加到历史
if (commandHistory.isEmpty() || commandHistory.last() != currentCommand) {
commandHistory.append(currentCommand);
}
historyIndex = commandHistory.size();
// ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>հ<EFBFBD>
// 执行命令时,忽略前后空白
//QString trimmedCmd = currentCommand.trimmed();
currentCommand.remove(0, 1);
processCommand(currentCommand, clientSocket);
currentCommand.clear();
} else {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> => <20><><EFBFBD><EFBFBD>ӡ<EFBFBD>µ<EFBFBD><C2B5><EFBFBD>ʾ<EFBFBD><CABE>
// 空行 => 仅打印新的提示符
printPrompt(clientSocket);
}
continue;
}
// 3) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 3) 方向键
if (c == '\x1b') {
if (i + 2 < data.size() && data[i+1] == '[') {
char arrow = data[i+2];
@@ -342,22 +342,22 @@ private slots:
continue;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD>Ϊ "> "<22><><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ2
// 假设提示符固定为 "> ",提示符长度为2
const int promptLength = 1;
// 4) <EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD>
// 4) 退格键
if (c == '\x7f' || c == '\b') {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> currentCommand <EFBFBD>ij<EFBFBD><EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
// 仅当 currentCommand 的长度大于提示符长度时,允许删除字符
if (currentCommand.length() > promptLength) {
currentCommand.chop(1);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "\b \b" <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD>
// 回显退格:用 "\b \b" 来擦除屏幕上最后一个字符
clientSocket->write("\b \b");
clientSocket->flush();
}
continue;
}
// 5) <EFBFBD><EFBFBD>ͨ<EFBFBD>ַ<EFBFBD>
// 5) 普通字符
currentCommand.append(static_cast<char>(c));
clientSocket->write((const char*)&c, 1);
clientSocket->flush();
@@ -368,10 +368,10 @@ signals:
void serverError();
private:
// ========== Telnet Э<EFBFBD>̺<EFBFBD><EFBFBD><EFBFBD> ==========
// ========== Telnet 协商函数 ==========
void sendTelnetNegotiation(QTcpSocket *socket)
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> WILL ECHO / WILL SUPPRESS-GO-AHEAD / DONT LINEMODE
// 发送 WILL ECHO / WILL SUPPRESS-GO-AHEAD / DONT LINEMODE
static const unsigned char will_echo[3] = { IAC, WILL, TELOPT_ECHO };
static const unsigned char will_sga[3] = { IAC, WILL, TELOPT_SUPPRESS_GO_AHEAD };
static const unsigned char dont_linemode[3] = { IAC, DONT, TELOPT_LINEMODE };
@@ -383,7 +383,7 @@ private:
}
/**
* @brief <EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳһʹ<EFBFBD><EFBFBD>\r\n<><6E><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>Ҵ<EFBFBD>ӡ"> "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @brief 打印提示符:统一使用\r\n换行并且打印"> "于行首
*/
void printPrompt(QTcpSocket *clientSocket)
{
@@ -392,13 +392,13 @@ private:
}
/**
* @brief ִ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѱ<EFBFBD>trimmed<EFBFBD><EFBFBD>
* @brief 执行一条命令(已被trimmed
*/
void processCommand(const QString &cmd, QTcpSocket *clientSocket) {
qDebug() << "Received command:" << cmd;
std::cout << "Received command: " << cmd.toStdString() << "\n";
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 命令解析
if (cmd == "help") {
QString helpText = "Available commands:\r\n";
helpText += "TEST_NUM=<num> - Set the TEST_NUM\r\n";
@@ -539,19 +539,19 @@ private:
clientSocket->flush();
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󣬴<EFBFBD>ӡ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>
// 命令处理结束后,打印提示符
printPrompt(clientSocket);
}
/**
* @brief <EFBFBD>ϼ<EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @brief 上箭头:历史命令回溯
*/
void handleUpArrow(QTcpSocket *clientSocket) {
if (!commandHistory.isEmpty() && historyIndex > 0) {
historyIndex--;
currentCommand = commandHistory[historyIndex];
// <EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>\r<>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD> + \x1B[K<><4B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 清行:\r回到行首 + \x1B[K清除光标后文字
clientSocket->write("\r\x1B[K> ");
clientSocket->write(currentCommand.toUtf8());
clientSocket->flush();
@@ -559,7 +559,7 @@ private:
}
/**
* @brief <EFBFBD>¼<EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>
* @brief 下箭头:历史命令前进
*/
void handleDownArrow(QTcpSocket *clientSocket) {
if (!commandHistory.isEmpty() && historyIndex < commandHistory.size() - 1) {
@@ -585,14 +585,14 @@ private:
int TEST_NUM;
QMutex mutex;
// <EFBFBD><EFBFBD>ʷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
QList<QString> commandHistory; // <EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int historyIndex; // <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>ʷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
QString currentCommand; // <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 历史命令相关
QList<QString> commandHistory; // 存储历史命令
int historyIndex; // 当前历史命令索引
QString currentCommand; // 当前正在输入的命令
// viewlog <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// viewlog 相关
bool stopViewLog;
//ping<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//ping相关
bool g_stopTelnetTest;
QTcpSocket* activeClient;
};
@@ -606,7 +606,7 @@ protected:
};
class OnTimerThread : public QThread//<EFBFBD><EFBFBD>ʱ<EFBFBD>߳<EFBFBD>
class OnTimerThread : public QThread//定时线程
{
protected:
void run();
@@ -617,10 +617,10 @@ protected:
extern "C" {
#endif
//lnk20250106<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD>˽ṹ
//lnk20250106添加台账结构
typedef struct terminal terminal;
typedef struct monitor monitor;
struct monitor // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><EFBFBD>
struct monitor // 监测点台账
{
char monitor_id[64];
char terminal_code[64];
@@ -632,8 +632,11 @@ struct monitor //
char status[255];
};
struct terminal // <EFBFBD>ն<EFBFBD>̨<EFBFBD><EFBFBD>
struct terminal // 终端台账
{
char guid[128];
char terminal_id[64];
char terminal_code[64];
char org_name[64];
@@ -644,11 +647,11 @@ struct terminal //
char dev_type[64];
char dev_key[255];
char dev_series[255];
char processNo[64]; //lnk20250210<EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD>
char processNo[64]; //lnk20250210进程号
char addr_str[64];
char port[64];
char timestamp[64];
monitor line[10]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 10 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
monitor line[10]; // 最多 10 个监测点
};