diff --git a/cfg_parse/cfg_parser.cpp b/cfg_parse/cfg_parser.cpp index 3153b91..10fe6bd 100644 --- a/cfg_parse/cfg_parser.cpp +++ b/cfg_parse/cfg_parser.cpp @@ -142,6 +142,9 @@ public: char port[64]; char timestamp[64]; + //lnk20250210添加进程号 + char processNo[64]; + ledger_monitor line[10]; char count_cfg[64]; //不是台账的一部分,用来记录数据库或业务中台的台账数量 @@ -4117,6 +4120,7 @@ void parse_terminal_from_data(trigger_update_xml_t* trigger_update_xml, const st strcpy(work_terminal.dev_type, extract_value(data, "devType").c_str()); strcpy(work_terminal.dev_key, extract_value(data, "devKey").c_str()); strcpy(work_terminal.dev_series, extract_value(data, "series").c_str()); + strcpy(work_terminal.processNo, extract_value(data, "processNo").c_str()); strcpy(work_terminal.addr_str, extract_value(data, "ip").c_str()); strcpy(work_terminal.port, extract_value(data, "port").c_str()); strcpy(work_terminal.timestamp, extract_value(data, "updateTime").c_str()); @@ -11526,6 +11530,7 @@ void printTerminalDevMap(const QMap& terminal_dev_map) { << ", Device Type:" << QString(dev->dev_type) << ", Device Key:" << QString(dev->dev_key) << ", Device Series:" << QString(dev->dev_series) + << ", Device processNo:" << QString(dev->processNo) << ", Address:" << QString(dev->addr_str) << ", Port:" << QString(dev->port) << ", Timestamp:" << QString(dev->timestamp); @@ -11636,6 +11641,7 @@ void printLedgerinshell(const ied_usr_t& ied_usr, QIODevice* outputDevice) { outputDevice->write("|-- dev_type: " + QByteArray(ied_usr.dev_type) + "\n"); outputDevice->write("|-- dev_key: " + QByteArray(ied_usr.dev_key) + "\n"); outputDevice->write("|-- dev_series: " + QByteArray(ied_usr.dev_series) + "\n"); + outputDevice->write("|-- dev_processNo: " + QByteArray(ied_usr.processNo) + "\n"); outputDevice->write("|-- dev_flag: " + QByteArray::number(ied_usr.dev_flag) + "\n"); outputDevice->write("|-- last_call_wavelist_time: " + QByteArray::number(ied_usr.last_call_wavelist_time) + "\n"); @@ -11745,6 +11751,28 @@ void ledger(const char* terminal_id, QIODevice* outputDevice) { } pthread_mutex_unlock(&mtx); } + +//lnk20250210打印指定的变量名 +void value_print(const char *variableName, QTcpSocket *clientSocket) { + char buffer[256]; // 用于存储变量值的缓冲区 + + // 打印变量值 + if (strcmp(variableName, "frontindex") == 0) { + sprintf(buffer, "frontindex = %d", g_front_seg_index); // 将 int 转换为字符串 + clientSocket->write(buffer); // 发送字符串到客户端 + } else if (strcmp(variableName, "iedcount") == 0) { + sprintf(buffer, "g_node->n_clients = %d, ied config count = %d", IED_COUNT); + clientSocket->write(buffer); + } else if (strcmp(variableName, "frontfun") == 0) { + sprintf(buffer, "frontfun = %s", subdir); + clientSocket->write(buffer); + } else { + clientSocket->write("Unknown variable name\n> "); + } + + clientSocket->flush(); +} + ////////////////////////////////////////////////////////////////////////////////////////////////// // 解析 JSON 的函数 多前置动态均分 int terminal_ledger_web(QMap* terminal_dev_map, @@ -11854,6 +11882,7 @@ int terminal_ledger_web(QMap* terminal_dev_map, } //后续修改为根据index来获取对应的台账,将不再均分,获取所有台账并判断进程号 +#if 0 int base_size = 0; int remainder = 0; int start_index = 0; @@ -11873,6 +11902,9 @@ int terminal_ledger_web(QMap* terminal_dev_map, end_index = data_size; } } +#endif + int start_index = 0; + int end_index = data_size; // 遍历指定范围内的元素 for (int i = start_index; i < end_index; ++i) { @@ -11930,6 +11962,11 @@ int terminal_ledger_web(QMap* terminal_dev_map, if (series && series->type == cJSON_String) strncpy(dev->dev_series, series->valuestring, sizeof(dev->dev_series) - 1); else strncpy(dev->dev_series, "N/A", sizeof(dev->dev_series) - 1); + //lnk20250210台账进程号 + cJSON* processNo = cJSON_GetObjectItem(item, "processNo"); // processNo转为字符串 + if (processNo && processNo->type == cJSON_Number) snprintf(dev->processNo, sizeof(dev->processNo), "%d", processNo->valueint); + else strncpy(dev->processNo, "N/A", sizeof(dev->processNo) - 1); + cJSON* port = cJSON_GetObjectItem(item, "port"); // port if (port && port->type == cJSON_String) strncpy(dev->port, port->valuestring, sizeof(dev->port) - 1); else strncpy(dev->port, "N/A", sizeof(dev->port) - 1); @@ -11992,10 +12029,16 @@ int terminal_ledger_web(QMap* terminal_dev_map, terminal_dev_map->remove(key); // 插入新的 terminal_dev 对象 - terminal_dev_map->insert(key, dev);//后续修改为只有进程号匹配上index才录入当前进程 + if(atoi(dev->processNo) == g_front_seg_index){//lnk20250210匹配进程号 + //调试用 + std::cout<< "process num match" << std::endl; + terminal_dev_map->insert(key, dev);}//后续修改为只有进程号匹配上index才录入当前进程 } else { // 插入新的 terminal_dev 对象 - terminal_dev_map->insert(key, dev);//后续修改为只有进程号匹配上index才录入当前进程 + if(atoi(dev->processNo) == g_front_seg_index){//lnk20250210匹配进程号 + //调试用 + std::cout<< "process num match" << std::endl; + terminal_dev_map->insert(key, dev);}//后续修改为只有进程号匹配上index才录入当前进程 //调试用 //std::cout << "i = " << i << std::endl; //std::cout << "terminal_dev_map.size:" << terminal_dev_map->size() << std::endl; @@ -12186,6 +12229,10 @@ int parse_device_cfg_web() char dev_series[255]; char addr_str[64]; char port_char[64]; + + //lnk20250210添加进程号 + char processNo[64]; + otl_datetime timestamp; // 遍历终端台账容器 @@ -12208,6 +12255,7 @@ int parse_device_cfg_web() strncpy(dev_series, value->dev_series, sizeof(dev_series) - 1); strncpy(addr_str, value->addr_str, sizeof(addr_str) - 1); strncpy(port_char, value->port, sizeof(port_char) - 1); + strncpy(processNo, value->processNo, sizeof(processNo) - 1);//进程号 timestamp = parseTimestamp(value->timestamp); //处理终端台账 @@ -12270,6 +12318,13 @@ int parse_device_cfg_web() apr_snprintf(ied_usr->dev_type, sizeof(ied_usr->dev_type), "%s", dev_type);//dev_type cout << "ied_usr->dev_type:" << ied_usr->dev_type << endl; } + + //lnk20250210台账进程号 + if (processNo != NULL) { + apr_snprintf(ied_usr->processNo, sizeof(ied_usr->processNo), "%s", processNo);//processNo + cout << "ied_usr->processNo:" << ied_usr->processNo << endl; + } + if (dev_series != NULL) { apr_snprintf(ied_usr->dev_series, sizeof(ied_usr->dev_series), "%s", dev_series);//DEV_Series cout << "defalut dev_series:" << ied_usr->dev_series << endl; @@ -14454,18 +14509,11 @@ int parse_rpt_log_ini_one(ied_t* ied) } else {//已有则替换,在原有空间上覆盖 - //lnk20250208调试用 - std::cout << "cpuno:" << cpuno << "apr_cpystrn" <LD_info[cpuno].LD_name)" << strlen(ied_usr->LD_info[cpuno].LD_name) <LD_info[cpuno].LD_name)) { - apr_cpystrn(ied_usr->LD_info[cpuno].LD_name, str, 256); - } else { - std::cerr << "Error: target buffer is too small." << std::endl; - // 可以选择分配更大的内存或者其他处理方式 - } + apr_cpystrn(ied_usr->LD_info[cpuno].LD_name, str, 256);//apr_palloc 只是分配了一个固定大小的内存块,而没有提供直接的机制来跟踪或验证它的空间是否已被使用或填充到最大值,直接覆盖即可 + } delete[] tmp;//Get_IED中分配了内存,使用后删除 diff --git a/json/save2json.cpp b/json/save2json.cpp index bf66278..6eae0da 100644 --- a/json/save2json.cpp +++ b/json/save2json.cpp @@ -1197,6 +1197,10 @@ std::string prepare_update(const std::string& code_str, const terminal& json_dat add_indent(xmlStream, indentLevel); xmlStream << "" << json_data.dev_series << "" << std::endl; + //lnk20250210 + add_indent(xmlStream, indentLevel); + xmlStream << "" << json_data.processNo << "" << std::endl; + add_indent(xmlStream, indentLevel); xmlStream << "" << json_data.dev_key << "" << std::endl; @@ -1426,6 +1430,11 @@ void parse_control(const std::string& json_str, const std::string& output_dir) { else std::strncpy(json_data.dev_series, "N/A", sizeof(json_data.dev_series) - 1); + //lnk20250210台账进程号 + cJSON* processNo = cJSON_GetObjectItem(item, "processNo"); // processNo转为字符串 + if (processNo && processNo->type == cJSON_Number) snprintf(json_data.processNo, sizeof(json_data.processNo), "%d", processNo->valueint); + else strncpy(json_data.processNo, "N/A", sizeof(json_data.processNo) - 1); + cJSON* ip = cJSON_GetObjectItem(item, "ip"); // addr_str if (ip && ip->type == cJSON_String) std::strncpy(json_data.addr_str, ip->valuestring, sizeof(json_data.addr_str) - 1); diff --git a/json/save2json.h b/json/save2json.h index 73df100..a229573 100644 --- a/json/save2json.h +++ b/json/save2json.h @@ -44,6 +44,7 @@ extern "C" { #include extern int G_TEST_NUM; extern void ledger(const char* terminal_id = NULL,QIODevice* outputDevice = NULL); +extern void value_print(const char *variableName, QTcpSocket *clientSocket); extern int TEST_PORT; ////////////////////////////////////////////////////////////////////////////// @@ -107,24 +108,29 @@ class Worker : public QObject Q_OBJECT public: - Worker(QObject *parent = NULL) : QObject(parent), server(NULL), TEST_NUM(G_TEST_NUM) {} + Worker(QObject *parent = NULL) : QObject(parent), server(NULL), TEST_NUM(G_TEST_NUM) { + timer = NULL; + } ~Worker() { - if (server) { - server->close(); - delete server; - } + // 清理定时器和服务器 + stopServer(); } public slots: void startServer() { - server = new QTcpServer(); + if (server) { + qDebug() << "Server is already running!"; + return; // 防止重复启动服务器 + } + + // 创建 QTcpServer 并设置信号与槽 + server = new QTcpServer(this); connect(server, SIGNAL(newConnection()), this, SLOT(onNewConnection())); + // 尝试监听端口 if (!server->listen(QHostAddress::Any, TEST_PORT)) { std::cout << "Server failed to start!" << std::endl; qDebug() << "Server failed to start!"; - delete server; - server = NULL; emit serverError(); return; } else { @@ -135,12 +141,30 @@ public slots: // 创建并启动定时器 timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(doPeriodicTask())); - timer->start(60000); // 每60秒触发一次 + timer->start(60000); // 每60秒触发一次 std::cout << "Timer started, event loop running in thread: " << QThread::currentThreadId() << std::endl; qDebug() << "Timer started, event loop running in thread:" << QThread::currentThreadId(); } + void stopServer() { + // 停止服务器并清理资源 + if (server) { + server->close(); + delete server; + server = NULL; + qDebug() << "Server stopped."; + } + + // 停止定时器 + if (timer) { + timer->stop(); + delete timer; + timer = NULL; + qDebug() << "Timer stopped."; + } + } + void setTestNum(int num) { QMutexLocker locker(&mutex); TEST_NUM = num; @@ -167,6 +191,7 @@ private slots: std::cout << "New connection established!\n"; connect(clientSocket, SIGNAL(readyRead()), this, SLOT(onReadyRead())); + connect(clientSocket, SIGNAL(disconnected()), clientSocket, SLOT(deleteLater())); // 自动清理连接 // 向客户端发送提示符 if (clientSocket) { @@ -178,12 +203,10 @@ private slots: void onReadyRead() { QTcpSocket *clientSocket = qobject_cast(sender()); - std::cout << "onReadyRead\n"; if (!clientSocket) { std::cout << "Invalid socket\n"; return; } - std::cout << "read all\n"; QByteArray data = clientSocket->readAll(); QString command = QString::fromUtf8(data).trimmed(); // 获取输入的命令并去除前后空格 @@ -191,16 +214,35 @@ private slots: qDebug() << "Received command:" << command; std::cout << "Received command: " << command.toStdString() << "\n"; + // 存储历史命令 + if (!command.isEmpty() && (commandHistory.isEmpty() || command != commandHistory.last())) { + commandHistory.append(command); + historyIndex = commandHistory.size(); // 新命令的索引 + } + // 向客户端发送“指令已输入”反馈 clientSocket->write("Received command\n> "); clientSocket->flush(); - - // 重新显示提示符 clientSocket->write("test_shell> "); clientSocket->flush(); // 确保提示符立即显示 + // 处理 help 命令 + if (command == "help") { + QString helpText = "Available commands:\n"; + helpText += "TEST_NUM= - Set the TEST_NUM\n"; + helpText += "rc - Execute rocketmq_test_rc\n"; + helpText += "rt - Execute rocketmq_test_rt\n"; + helpText += "ud - Execute rocketmq_test_ud\n"; + helpText += "set - Execute rocketmq_test_set\n"; + helpText += "ledger - Execute ledger with optional terminal_id\n"; + helpText += "value - Execute value print with valuename : iedcount frontfun frontindex\n"; + helpText += "exit - Exit the shell\n"; + helpText += "help - Show this help message\n"; + clientSocket->write(helpText.toUtf8()); + clientSocket->flush(); + } // 处理 TEST_NUM - if (command.startsWith("TEST_NUM=")) { + else if (command.startsWith("TEST_NUM=")) { bool ok; int num = command.mid(9).toInt(&ok); // 获取等号后面的数字部分 if (ok) { @@ -262,7 +304,57 @@ private slots: clientSocket->write("Executed ledger without parameters\n> "); } } - + else if (command.startsWith("value")) { + std::cout << "Executing value()" << std::endl; + + // 提取命令中的参数,获取变量名 + QStringList parts = command.split(" "); // 根据空格分割命令 + if (parts.size() > 1) { // 如果命令中包含参数 + QString variableName = parts[1]; + + std::cout << "Calling value() with variable name: " << variableName.toStdString() << std::endl; + + // 调用 value() 输出变量值 + value_print(variableName.toStdString().c_str(), clientSocket); // 假设 value() 函数可以根据变量名输出值 + + clientSocket->write("Executed value with variable name: " + variableName.toUtf8() + "\n> "); + } else { + std::cout << "Calling value without parameters" << std::endl; + + // 提示用户需要提供变量名 + clientSocket->write("Please provide a variable name\n> "); + } + } + // 处理历史命令 + else if (command == "up" || command == "down") { + // 上下箭头命令处理 + if (command == "up") { + // 上箭头:选择前一个历史命令 + if (historyIndex > 0) { + historyIndex--; + } + } else if (command == "down") { + // 下箭头:选择下一个历史命令 + if (historyIndex < commandHistory.size() - 1) { + historyIndex++; + } + } + // 如果有历史命令,返回历史命令 + if (historyIndex >= 0 && historyIndex < commandHistory.size()) { + clientSocket->write(commandHistory[historyIndex].toUtf8()); + } else { + clientSocket->write("No history available\n> "); + } + clientSocket->flush(); + } + // 处理 exit 命令 + else if (command == "exit") { + // 发送退出信息并关闭客户端连接 + clientSocket->write("Goodbye! Exiting shell...\n"); + clientSocket->flush(); + clientSocket->disconnectFromHost(); // 关闭连接 + clientSocket->waitForDisconnected(); // 确保连接断开 + } // 处理未知命令 else { clientSocket->write("Unknown command\n> "); @@ -275,12 +367,15 @@ signals: void serverError(); private: + QList commandHistory; // 存储历史命令 + int historyIndex = -1; // 当前历史命令索引 QTcpServer *server; QTimer *timer; int TEST_NUM; QMutex mutex; }; + //lnk20241213 class mqconsumerThread : public QThread { @@ -330,6 +425,7 @@ struct terminal // char dev_type[64]; char dev_key[255]; char dev_series[255]; + char processNo[64]; //lnk20250210进程号 char addr_str[64]; char port[64]; char timestamp[64]; diff --git a/mms/main.c b/mms/main.c index 7fcf6c1..8539a8f 100644 --- a/mms/main.c +++ b/mms/main.c @@ -330,6 +330,9 @@ int main(int argc, const char **argv) pthread_mutex_lock(&mtx);//主线程定时任务扫描读取台账加锁 if (!G_TEST_FLAG && g_front_num_count >= 30 && g_onlyIP[0] == 0 && g_node->n_clients>10) {//30分钟连接数量过低且不是单连且台账大于十个终端 MVL_LOG_ACSE0("MYLOG: g_front_num_count>=20, so exit to restart "); + + pthread_mutex_unlock(&mtx); + apr_sleep(apr_time_from_sec(10)); exit(-1039); } diff --git a/mms/mms_process.c b/mms/mms_process.c index 4e22341..ab6f5c4 100644 --- a/mms/mms_process.c +++ b/mms/mms_process.c @@ -922,7 +922,7 @@ void process_ledger_update(trigger_update_xml_t *ledger_update_xml) //2-处理终端台账/////////////////////////////////// ied = g_node->clients[new_client_count - 1];//终端台账指针定向到ied数组当前位置的后一位 - terminal_index = new_client_count - 1;//新的台账终端 + terminal_index = new_client_count;//新的台账终端 ied_usr = (ied_usr_t*)apr_pcalloc(g_init_pool, sizeof(ied_usr_t)); ied->usr_ext = ied_usr;//内存挂到ied上 diff --git a/mms/rdb_client.h b/mms/rdb_client.h index 3a736ce..7fde5a4 100644 --- a/mms/rdb_client.h +++ b/mms/rdb_client.h @@ -327,6 +327,7 @@ struct ied_usr_t{ char terminal_code[256];//CZY 2023-08-30 终端编码 int update_flag;//CZY 2023-08-20 台账更新标志 0:keep 2:delete 4:update 8:add + char processNo[64];//台账进程号 };