From ab654a754c330de444025fac29b1013142db5c8a Mon Sep 17 00:00:00 2001 From: Vladislav Ostapov Date: Thu, 9 Jan 2025 11:28:35 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B0=D1=82=D1=87=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA=20API=20=D0=B2=20=D1=81?= =?UTF-8?q?=D0=BB=D1=83=D1=87=D0=B0=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE?= =?UTF-8?q?=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/terminal_api_driver.cpp | 115 ++++++++++++++++++++++-------------- 1 file changed, 72 insertions(+), 43 deletions(-) diff --git a/src/terminal_api_driver.cpp b/src/terminal_api_driver.cpp index c7eb252..a41c66b 100644 --- a/src/terminal_api_driver.cpp +++ b/src/terminal_api_driver.cpp @@ -107,17 +107,19 @@ static std::ostream& operator<<(std::ostream& out, CP_Result result) { return out; } -static void logCpApiError(const char* desc, CP_Result err) { - if (err != OK) { - BOOST_LOG_TRIVIAL(error) << "CP API error in " << desc << ": " << err; - } -} - /** * Этот демон нужен для того, чтобы получать статистику из API, а так же корректно сохранять настройки */ class api_driver::TerminalApiDaemon { private: + CP_Result lastCpError = OK; + void logCpApiError(const char* desc, CP_Result err) { + if (err != OK) { + BOOST_LOG_TRIVIAL(error) << "CP API error in " << desc << ": " << err; + this->lastCpError = err; + } + } + void updateState() { modulator_state modulator{}; demodulator_state demodulator{}; @@ -224,38 +226,52 @@ private: } } + void connectToApi() { + { + std::lock_guard _lock(this->stateMutex); + this->deviceInitState = "Not connected to API"; + } + + unsigned int access{}; + for (int connectAttempt = 0;; connectAttempt++) { + BOOST_LOG_TRIVIAL(info) << "api_driver::TerminalApiDaemon::connectToApi(): Try to connect api (attempt " << connectAttempt << ")..."; + auto res = CP_Login("admin", "pass", &sid, &access); + logCpApiError(R"(api_driver::TerminalApiDaemon::connectToApi()->CP_Login("admin", "pass"))", res); + if (res != OK) { + boost::this_thread::sleep_for(boost::chrono::duration(boost::chrono::milliseconds(1000))); + } else { + break; + } + } + + std::string tmp; + logCpApiError("api_driver::TerminalApiDaemon::run()->CP_GetDmaDebug(status_init)", CP_GetDmaDebug(sid, "status_init", &tmp)); + { + std::lock_guard _lock(this->stateMutex); + this->deviceInitState = tmp; + } + BOOST_LOG_TRIVIAL(info) << "api_driver::TerminalApiDaemon::connectToApi(): Success connect!"; + BOOST_LOG_TRIVIAL(info) << "api_driver::TerminalApiDaemon::connectToApi(): API status: " << tmp; + + TerminalFirmwareVersion f; + logCpApiError("api_driver::TerminalApiDaemon::connectToApi()->CP_GetNetwork(version)", CP_GetNetwork(sid, "version", &f.version)); + logCpApiError("api_driver::TerminalApiDaemon::connectToApi()->CP_GetNetwork(chip_id)", CP_GetNetwork(sid, "chip_id", &f.modemId)); + rtrim(f.modemId); + logCpApiError("api_driver::TerminalApiDaemon::connectToApi()->CP_GetNetwork(serial)", CP_GetNetwork(sid, "serial", &f.modemSn)); + logCpApiError("api_driver::TerminalApiDaemon::connectToApi()->CP_GetNetwork(mac_eth0)", CP_GetNetwork(sid, "mac_eth0", &f.macMang)); + logCpApiError("api_driver::TerminalApiDaemon::connectToApi()->CP_GetNetwork(mac_eth1)", CP_GetNetwork(sid, "mac_eth1", &f.macData)); + + { + std::lock_guard _lock(this->firmwareMutex); + this->firmware = f; + } + + this->lastCpError = OK; + } + void run() { // это демон, который в бесконечном цикле опрашивает API - { - TSID sid{}; - unsigned int access{}; - for (int connectAttempt = 0;; connectAttempt++) { - BOOST_LOG_TRIVIAL(info) << "api_driver::TerminalApiDaemon::run(): Try to connect api (attempt " << connectAttempt << ")..."; - auto res = CP_Login("admin", "pass", &sid, &access); - logCpApiError(R"(api_driver::TerminalApiDaemon::run()->CP_Login("admin", "pass"))", res); - if (res != OK) { - boost::this_thread::sleep_for(boost::chrono::duration(boost::chrono::milliseconds(1000))); - } else { - break; - } - } - - std::string tmp; - logCpApiError("api_driver::TerminalApiDaemon::run()->CP_GetDmaDebug(status_init)", CP_GetDmaDebug(sid, "status_init", &tmp)); - { - std::lock_guard _lock(this->stateMutex); - this->deviceInitState = tmp; - } - BOOST_LOG_TRIVIAL(info) << "api_driver::TerminalApiDaemon::run(): Success connect!"; - BOOST_LOG_TRIVIAL(info) << "api_driver::TerminalApiDaemon::run(): API status: " << tmp; - - logCpApiError("api_driver::TerminalApiDaemon::run()->CP_GetNetwork(version)", CP_GetNetwork(sid, "version", &firmware.version)); - logCpApiError("api_driver::TerminalApiDaemon::run()->CP_GetNetwork(chip_id)", CP_GetNetwork(sid, "chip_id", &firmware.modemId)); - rtrim(firmware.modemId); - logCpApiError("api_driver::TerminalApiDaemon::run()->CP_GetNetwork(serial)", CP_GetNetwork(sid, "serial", &firmware.modemSn)); - logCpApiError("api_driver::TerminalApiDaemon::run()->CP_GetNetwork(mac_eth0)", CP_GetNetwork(sid, "mac_eth0", &firmware.macMang)); - logCpApiError("api_driver::TerminalApiDaemon::run()->CP_GetNetwork(mac_eth1)", CP_GetNetwork(sid, "mac_eth1", &firmware.macData)); - } + this->connectToApi(); struct IntervalUpdate_t { int64_t lastUpdate; @@ -317,6 +333,12 @@ private: }; while (true) { + if (this->lastCpError == ERROR || this->lastCpError == TIMEOUT) { + BOOST_LOG_TRIVIAL(error) << "api_driver::TerminalApiDaemon::run(): close current daemon session caused error " << this->lastCpError; + CP_Logout(this->sid); + this->connectToApi(); + } + int64_t sleepTime = 60000; // минута по-умолчанию auto now = std::chrono::time_point_cast(std::chrono::system_clock::now()).time_since_epoch().count(); for (auto& u: updaters) { @@ -360,13 +382,14 @@ private: bool qosEnabled; std::string qosClassesJson; + std::shared_mutex firmwareMutex; + TerminalFirmwareVersion firmware; + public: std::mutex cpApiMutex; TSID sid; boost::thread daemon; - TerminalFirmwareVersion firmware; - explicit TerminalApiDaemon(): deviceInitState("Not connected to API"), qosEnabled(false), sid(0), daemon([this]() { this->run(); }) { this->qosClassesJson = DEFAULT_QOS_CLASSES; } @@ -584,6 +607,11 @@ public: logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetDmaDebug(save_config)", CP_SetDmaDebug(sid, "save_config", "")); } + TerminalFirmwareVersion getFirmware() { + std::shared_lock lock(this->firmwareMutex); + return firmware; + } + void resetPacketStatistics() { std::string tmp; std::lock_guard lock(this->cpApiMutex); @@ -884,11 +912,12 @@ std::string api_driver::ApiDriver::loadFirmwareVersion() const { } std::stringstream result; - result << "{\n\"fw.version\":" << buildEscapedString(daemon->firmware.version); - result << ",\"fw.modemId\":" << buildEscapedString(daemon->firmware.modemId); - result << ",\"fw.modemSn\":" << buildEscapedString(daemon->firmware.modemSn); - result << ",\"fw.macMang\":" << buildEscapedString(daemon->firmware.macMang); - result << ",\"fw.macData\":" << buildEscapedString(daemon->firmware.macData); + auto firmware = daemon->getFirmware(); + result << "{\n\"fw.version\":" << buildEscapedString(firmware.version); + result << ",\"fw.modemId\":" << buildEscapedString(firmware.modemId); + result << ",\"fw.modemSn\":" << buildEscapedString(firmware.modemSn); + result << ",\"fw.macMang\":" << buildEscapedString(firmware.macMang); + result << ",\"fw.macData\":" << buildEscapedString(firmware.macData); result << "\n}"; return result.str(); }