From c024a82b222a82b519bad4c200e9ef0df2f1b4e8 Mon Sep 17 00:00:00 2001 From: lyq Date: Mon, 3 Nov 2025 09:25:06 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9A=8F=E6=9C=BA=E7=94=9F=E6=88=90mqtt=20clie?= =?UTF-8?q?nt=20id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mqtt_report/src/mqtt_report.cpp | 2 +- src/pub_gps/src/pub_gps_node.cpp | 22 +++++++++++++++++++- src/sub/src/sub_node.cpp | 24 ++++++++++++++++++++-- src/task_manager/src/task_manager_node.cpp | 24 ++++++++++++++++++++-- 4 files changed, 66 insertions(+), 6 deletions(-) diff --git a/src/mqtt_report/src/mqtt_report.cpp b/src/mqtt_report/src/mqtt_report.cpp index ac80348..50cf918 100644 --- a/src/mqtt_report/src/mqtt_report.cpp +++ b/src/mqtt_report/src/mqtt_report.cpp @@ -323,7 +323,7 @@ private: for (int code : vehicle_error_code.getAllErrorCodes()) { std::string fault_json = generateFaultJson(code, config.vid, getCurrentTimestampMs()); - if (!mqtt_client_.publish(fault_topic_, fault_json, 1)) // QoS=1 + if (!mqtt_client_.publish(fault_topic_, fault_json, 0)) { RCLCPP_WARN(this->get_logger(), "Failed to publish fault code %d to MQTT", code); } diff --git a/src/pub_gps/src/pub_gps_node.cpp b/src/pub_gps/src/pub_gps_node.cpp index 093cdd2..07ba726 100644 --- a/src/pub_gps/src/pub_gps_node.cpp +++ b/src/pub_gps/src/pub_gps_node.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -227,6 +228,25 @@ private: rclcpp::Subscription::SharedPtr gps_subscribe_; }; +std::string generate_mqtt_client_id() +{ + // 获取当前时间戳(以毫秒为单位) + auto now = std::chrono::system_clock::now(); + auto millis = std::chrono::duration_cast(now.time_since_epoch()).count(); + + // 生成一个 4 位随机数 + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution<> dis(1000, 9999); + int random_num = dis(gen); + + // 拼接成 client ID + std::ostringstream oss; + oss << "client_" << millis << "_" << std::setw(4) << std::setfill('0') << random_num; + + return oss.str(); +} + bool load_config(const std::string &path) { Json::Reader reader; @@ -250,7 +270,7 @@ bool load_config(const std::string &path) // int port = m["inter_net_port"].asInt(); // 11883 g_conf.address = ip + ":" + std::to_string(port); - g_conf.client_id = "sweeper_CLIENT_1532_GPS"; // 如需可改成 VID 等 + g_conf.client_id = generate_mqtt_client_id(); g_conf.user = m["mqtt_user"].asString(); g_conf.password = m["mqtt_password"].asString(); g_conf.pub_gps_topic = m["pub_gps_topic"].asString(); diff --git a/src/sub/src/sub_node.cpp b/src/sub/src/sub_node.cpp index 8e2f99b..4f558ce 100644 --- a/src/sub/src/sub_node.cpp +++ b/src/sub/src/sub_node.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -43,7 +44,7 @@ std::string mqtt_topic_remote; // 新增:声明未定义的常量 std::string ADDRESS; -std::string CLIENTID_SUB = "sweeper200_sub"; // 客户端ID,提供默认值 +std::string CLIENTID_SUB; // 客户端ID,提供默认值 std::chrono::steady_clock::time_point last_message_time = std::chrono::steady_clock::now(); constexpr auto QOS = 1; @@ -53,6 +54,25 @@ char sub_buff[500]; car_ctrl car_ctrl_mes; +std::string generate_mqtt_client_id() +{ + // 获取当前时间戳(以毫秒为单位) + auto now = std::chrono::system_clock::now(); + auto millis = std::chrono::duration_cast(now.time_since_epoch()).count(); + + // 生成一个 4 位随机数 + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution<> dis(1000, 9999); + int random_num = dis(gen); + + // 拼接成 client ID + std::ostringstream oss; + oss << "client_" << millis << "_" << std::setw(4) << std::setfill('0') << random_num; + + return oss.str(); +} + void sendResponse(MQTTClient client, const std::string &topic, long long seqNo, int code, std::string msg) { // 使用JSON库构建响应数据 @@ -428,7 +448,7 @@ void init_main() mqtt_topic_remote = root["mqtt"]["remote_topic"].asString(); // 添加对sub_topic的初始化 sub_topic = mqtt_topic_remote; - CLIENTID_SUB = CLIENTID_SUB + "_" + mqtt_vid; + CLIENTID_SUB = generate_mqtt_client_id(); // ADDRESS = mqtt_inter_net_address + ":" + std::to_string(mqtt_inter_net_port); ADDRESS = mqtt_external_net_address + ":" + std::to_string(mqtt_external_net_port); cout << "ADDRESS: " << ADDRESS << endl; diff --git a/src/task_manager/src/task_manager_node.cpp b/src/task_manager/src/task_manager_node.cpp index c776613..57ee823 100644 --- a/src/task_manager/src/task_manager_node.cpp +++ b/src/task_manager/src/task_manager_node.cpp @@ -6,6 +6,7 @@ #include "task_manager_node.hpp" #include "sweeper_interfaces/msg/sub.hpp" #include // 添加信号处理头文件 +#include using namespace std; @@ -35,7 +36,7 @@ std::string sub_topic; // 修复变量声明和初始化 std::string ADDRESS; -std::string CLIENTID_SUB = "sweeper200_task"; // 客户端ID +std::string CLIENTID_SUB; // 客户端ID std::string destinationFilePath1 = "./gps_load_now.txt"; std::chrono::steady_clock::time_point last_message_time = std::chrono::steady_clock::now(); constexpr auto QOS = 0; @@ -49,6 +50,25 @@ TaskStatus status_up = TaskStatus::PENDING; CurrentTask currentTask; std::mutex taskMutex; +std::string generate_mqtt_client_id() +{ + // 获取当前时间戳(以毫秒为单位) + auto now = std::chrono::system_clock::now(); + auto millis = std::chrono::duration_cast(now.time_since_epoch()).count(); + + // 生成一个 4 位随机数 + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution<> dis(1000, 9999); + int random_num = dis(gen); + + // 拼接成 client ID + std::ostringstream oss; + oss << "client_" << millis << "_" << std::setw(4) << std::setfill('0') << random_num; + + return oss.str(); +} + // 信号处理函数 void signalHandler(int signum) { @@ -732,7 +752,7 @@ void init_main() mqtt_topic_push_status = root["mqtt"]["mqtt_topic_push_status"].asString(); // 添加对sub_topic的初始化 sub_topic = mqtt_topic_sub_task; - CLIENTID_SUB = CLIENTID_SUB + "_" + mqtt_vid; + CLIENTID_SUB = generate_mqtt_client_id(); // ADDRESS = mqtt_inter_net_address + ":" + std::to_string(mqtt_inter_net_port); ADDRESS = mqtt_external_net_address + ":" + std::to_string(mqtt_external_net_port); cout << "ADDRESS: " << ADDRESS << endl;