#ifndef PCCU_WEB_SERVER_H #define PCCU_WEB_SERVER_H #define UNIX #include "mongoose.h" #include #include #include #include #include #include namespace ccu { //============================================================================ // WebServer:HTTP + WebSocket 监控服务器(基于 mongoose)。 // // 路由: // / -> 内嵌监控页面(纯展示) // /ws -> WebSocket,推送 JSON 快照(由 CCU 周期调用 broadcast) // /api/logs -> 最近原始帧日志(JSON) // 采用与仓库内 pPowerMangerHost/WebServer 一致的回调模式。 //============================================================================ class WebServer { public: WebServer(); ~WebServer(); bool start(int port); void stop(); bool isRunning() const { return m_running; } // 向所有 WebSocket 客户端广播文本 // 线程安全:mongoose 非线程安全,本接口只把文本放入待发队列, // 由 Web 线程在 mg_mgr_poll 返回后统一发送(禁止跨线程直接 mg_ws_send) void broadcast(const std::string& text); // 新客户端连接时调用,返回初始快照 void setOnOpen(std::function handler); // 处理 /api/* 请求,返回 JSON 响应体(空串表示 404) void setApiHandler(std::function handler); private: static bool serverThreadCB(void* pParam); bool serverThreadFunc(); void handleEvent(struct mg_connection* c, int ev, void* ev_data); // Web 线程内:把待发队列中的快照推给所有 WS 客户端(仅本线程触碰连接列表) void flushPending(); struct mg_mgr m_mgr; int m_port = 0; std::atomic m_running{false}; std::thread m_thread; std::mutex m_pendingMutex; // 保护 m_pending std::string m_pending; // 最新待广播快照(新快照覆盖旧快照) std::vector m_wsConnections; // 仅 Web 线程访问 std::function m_onOpen; std::function m_apiHandler; }; } // namespace ccu #endif // PCCU_WEB_SERVER_H