diff --git a/src/iflytop/components/iflytop_front_end_service/iflytop_front_end_service.cpp b/src/iflytop/components/iflytop_front_end_service/iflytop_front_end_service.cpp new file mode 100644 index 0000000..7e405bc --- /dev/null +++ b/src/iflytop/components/iflytop_front_end_service/iflytop_front_end_service.cpp @@ -0,0 +1,73 @@ +#include "iflytop_front_end_service.hpp" +using namespace nlohmann; +using namespace iflytop; +using namespace std; +using namespace core; +using namespace ix; + +void IflytopFrontEndService::initialize() { + logger->info("IflytopFrontEndService initialize {}", 19001); + + m_server.reset(new WebSocketServer(19001, "0.0.0.0")); + m_server->setOnConnectionCallback([this](weak_ptr webSocket, shared_ptr connectionState) { + logger->info("Remote ip: {}", connectionState->getRemoteIp()); + auto ws = webSocket.lock(); + if (!ws) return; + ws->setOnMessageCallback([this, webSocket, connectionState](const ix::WebSocketMessagePtr& msg) { + try { + onMessageCallback(webSocket, connectionState, msg); + } catch (const std::exception& e) { + logger->error("catch exception,onMessageCallback error: {}", e.what()); + } + }); + }); + + m_initialized = true; +} +void IflytopFrontEndService::startListen() { + auto res = m_server->listen(); + if (!res.first) { + logger->error("listen error!!!!"); + return; + } + m_server->disablePerMessageDeflate(); + m_server->start(); + // m_server->wait(); + logger->info("IflytopFrontEndService initialize done"); +} + +void IflytopFrontEndService::sendMessage(const string& message) { + if (!m_initialized) { + logger->error("IflytopFrontEndService not initialized"); + return; + } + /** + * @brief 广播消息给所有连接的客户端 + */ + logger->debug("uplink msg: {}", message); + auto clients = m_server->getClients(); + for (auto& each : clients) { + if (each) { + each->sendText(message); + } + } +} + +void IflytopFrontEndService::onMessageCallback(weak_ptr webSocket, shared_ptr connectionState, const ix::WebSocketMessagePtr& msg) { + if (msg->type == ix::WebSocketMessageType::Open) { + logger->info("New connection"); + logger->info("id : {}", connectionState->getId()); + logger->info("Uri : {}", msg->openInfo.uri); + logger->info("Headers:"); + for (auto it : msg->openInfo.headers) { + logger->info(" {}: {}", it.first, it.second); + } + onConnect(webSocket, msg); + } else if (msg->type == ix::WebSocketMessageType::Message) { + logger->debug("downlink msg: {}", msg->str); + onMessage(webSocket, msg); + } else if (msg->type == ix::WebSocketMessageType::Close) { + logger->info("{} Closed connection", msg->closeInfo.remote); + onDisconnect(webSocket, msg); + } +} diff --git a/src/iflytop/components/iflytop_front_end_service/iflytop_front_end_service.hpp b/src/iflytop/components/iflytop_front_end_service/iflytop_front_end_service.hpp new file mode 100644 index 0000000..8ec0c2a --- /dev/null +++ b/src/iflytop/components/iflytop_front_end_service/iflytop_front_end_service.hpp @@ -0,0 +1,63 @@ +// +// Created by iflytop +// + +#pragma once +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "iflytop/core/basic/nod/nod.hpp" +#include "iflytop/core/spdlogfactory/logger.hpp" +/** + * @brief + * + * service: IflytopHardwareWSService + * + * 协议文档 + * https://iflytop1.feishu.cn/docx/XCeWddMyzoktUdx6EeMcOV5HnAb + * 端口号 + * 19001 + * 参考https://iflytop1.feishu.cn/wiki/wikcnukbr3vOdBfrNdnVXX8YkLg + */ + +namespace iflytop { +using namespace std; +using namespace iflytop; +using namespace core; +using namespace ix; + + +class IflytopFrontEndService : public enable_shared_from_this { + ENABLE_LOGGER(IflytopFrontEndService); + + public: + nod::signal webSocket, const ix::WebSocketMessagePtr& msg)> onMessage; + nod::signal webSocket, const ix::WebSocketMessagePtr& msg)> onConnect; + nod::signal webSocket, const ix::WebSocketMessagePtr& msg)> onDisconnect; + + private: + // + // WebSocketServer的使用参考:http://192.168.1.3:3000/z3rd_lib/IXWebSocket/src/branch/master/docs/usage.md + // + shared_ptr m_server; + bool m_initialized = false; + + public: + void initialize(); + void startListen(); + + void sendMessage(const string& message); + + private: + void onMessageCallback(weak_ptr webSocket, shared_ptr connectionState, const ix::WebSocketMessagePtr& msg); +}; +} // namespace iflytop \ No newline at end of file