// main.cpp #include "network/tcp_server.h" #include "mqtt/mqtt_client.h" #include "mqtt/mqtt_router.h" #include "systemMonitor/system_monitor.h" #include "spdlog/spdlog.h" #include "deviceManager/device_manager.h" // <<< MODIFIED: 包含新的设备管理器头文件 #include #include #include #include #include // 用于 ASIO 服务的全局 io_context boost::asio::io_context g_io_context; /** * @brief 处理终止信号 (SIGINT, SIGTERM). */ void signalHandler(int signum) { spdlog::warn("Interrupt signal ({}) received. Shutting down.", signum); g_io_context.stop(); } /** * @brief 周期性轮询系统状态并发布到 MQTT */ void poll_system_metrics( boost::asio::steady_timer& timer, SystemMonitor::SystemMonitor& monitor, MqttClient& mqtt_client ) { auto cpu_util = monitor.getCpuUtilization(); auto mem_info = monitor.getMemoryInfo(); double mem_total_gb = mem_info.total_kb / 1024.0 / 1024.0; std::string topic = "proxy/system_status"; std::string payload = "{\"cpu_usage\":" + std::to_string(cpu_util.totalUsagePercentage) + ",\"mem_total_gb\":" + std::to_string(mem_total_gb) + "}"; mqtt_client.publish(topic, payload); spdlog::debug("System metrics published."); timer.expires_at(timer.expiry() + std::chrono::seconds(15)); timer.async_wait(std::bind(poll_system_metrics, std::ref(timer), std::ref(monitor), std::ref(mqtt_client))); } int main(int argc, char* argv[]) { try { spdlog::set_level(spdlog::level::debug); spdlog::info("Edge Proxy starting up..."); } catch (const spdlog::spdlog_ex& ex) { std::cerr << "Log initialization failed: " << ex.what() << std::endl; return 1; } signal(SIGINT, signalHandler); signal(SIGTERM, signalHandler); try { // --- 1. 初始化核心服务 --- MqttClient mqtt_client("tcp://mqtt-broker:1883", "edge-proxy-main-client"); MqttRouter mqtt_router(mqtt_client); std::vector listen_ports = { 8888 }; TCPServer tcp_server(g_io_context, listen_ports, mqtt_client); SystemMonitor::SystemMonitor monitor; mqtt_client.connect(); mqtt_router.start(); // --- 2. 启动系统状态监控定时器 --- monitor.getCpuUtilization(); // 首次调用以初始化 boost::asio::steady_timer system_monitor_timer(g_io_context, std::chrono::seconds(15)); system_monitor_timer.async_wait(std::bind(poll_system_metrics, std::ref(system_monitor_timer), std::ref(monitor), std::ref(mqtt_client))); // --- 3. 创建统一的数据上报回调函数 --- auto report_to_mqtt = [&](const UnifiedData& data) { std::string topic = "devices/" + data.device_id + "/data"; // 使用 post 确保 MQTT 发布操作在 io_context 的主事件循环中执行,保证线程安全 g_io_context.post([&, topic, payload = data.data_json]() { mqtt_client.publish(topic, payload, 1, false); }); }; // --- 4. 实例化设备管理器并从文件加载所有设备 --- DeviceManager device_manager(g_io_context, report_to_mqtt); // 默认从程序运行目录下的 "devices.json" 文件加载 device_manager.load_and_start("../config/devices.json"); // --- 5. 启动主事件循环 (程序将阻塞在这里直到被信号中断) --- spdlog::info("All services are running. Press Ctrl+C to exit."); g_io_context.run(); // --- 清理工作 --- // io_context.run() 返回后,程序将退出 try 块。 // device_manager 的析构函数会自动被调用,它会负责停止所有设备服务线程。 spdlog::info("Shutting down MQTT client..."); mqtt_client.disconnect(); } catch (const std::exception& e) { spdlog::critical("An unhandled exception occurred: {}", e.what()); return 1; } spdlog::info("Server has been shut down gracefully. Exiting."); return 0; }