патч для переподключения к API в случае ошибок
This commit is contained in:
parent
8990fed8f0
commit
ab654a754c
@ -107,17 +107,19 @@ static std::ostream& operator<<(std::ostream& out, CP_Result result) {
|
|||||||
return out;
|
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, а так же корректно сохранять настройки
|
* Этот демон нужен для того, чтобы получать статистику из API, а так же корректно сохранять настройки
|
||||||
*/
|
*/
|
||||||
class api_driver::TerminalApiDaemon {
|
class api_driver::TerminalApiDaemon {
|
||||||
private:
|
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() {
|
void updateState() {
|
||||||
modulator_state modulator{};
|
modulator_state modulator{};
|
||||||
demodulator_state demodulator{};
|
demodulator_state demodulator{};
|
||||||
@ -224,15 +226,17 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void run() {
|
void connectToApi() {
|
||||||
// это демон, который в бесконечном цикле опрашивает API
|
|
||||||
{
|
{
|
||||||
TSID sid{};
|
std::lock_guard _lock(this->stateMutex);
|
||||||
|
this->deviceInitState = "Not connected to API";
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int access{};
|
unsigned int access{};
|
||||||
for (int connectAttempt = 0;; connectAttempt++) {
|
for (int connectAttempt = 0;; connectAttempt++) {
|
||||||
BOOST_LOG_TRIVIAL(info) << "api_driver::TerminalApiDaemon::run(): Try to connect api (attempt " << connectAttempt << ")...";
|
BOOST_LOG_TRIVIAL(info) << "api_driver::TerminalApiDaemon::connectToApi(): Try to connect api (attempt " << connectAttempt << ")...";
|
||||||
auto res = CP_Login("admin", "pass", &sid, &access);
|
auto res = CP_Login("admin", "pass", &sid, &access);
|
||||||
logCpApiError(R"(api_driver::TerminalApiDaemon::run()->CP_Login("admin", "pass"))", res);
|
logCpApiError(R"(api_driver::TerminalApiDaemon::connectToApi()->CP_Login("admin", "pass"))", res);
|
||||||
if (res != OK) {
|
if (res != OK) {
|
||||||
boost::this_thread::sleep_for(boost::chrono::duration(boost::chrono::milliseconds(1000)));
|
boost::this_thread::sleep_for(boost::chrono::duration(boost::chrono::milliseconds(1000)));
|
||||||
} else {
|
} else {
|
||||||
@ -246,17 +250,29 @@ private:
|
|||||||
std::lock_guard _lock(this->stateMutex);
|
std::lock_guard _lock(this->stateMutex);
|
||||||
this->deviceInitState = tmp;
|
this->deviceInitState = tmp;
|
||||||
}
|
}
|
||||||
BOOST_LOG_TRIVIAL(info) << "api_driver::TerminalApiDaemon::run(): Success connect!";
|
BOOST_LOG_TRIVIAL(info) << "api_driver::TerminalApiDaemon::connectToApi(): Success connect!";
|
||||||
BOOST_LOG_TRIVIAL(info) << "api_driver::TerminalApiDaemon::run(): API status: " << tmp;
|
BOOST_LOG_TRIVIAL(info) << "api_driver::TerminalApiDaemon::connectToApi(): API status: " << tmp;
|
||||||
|
|
||||||
logCpApiError("api_driver::TerminalApiDaemon::run()->CP_GetNetwork(version)", CP_GetNetwork(sid, "version", &firmware.version));
|
TerminalFirmwareVersion f;
|
||||||
logCpApiError("api_driver::TerminalApiDaemon::run()->CP_GetNetwork(chip_id)", CP_GetNetwork(sid, "chip_id", &firmware.modemId));
|
logCpApiError("api_driver::TerminalApiDaemon::connectToApi()->CP_GetNetwork(version)", CP_GetNetwork(sid, "version", &f.version));
|
||||||
rtrim(firmware.modemId);
|
logCpApiError("api_driver::TerminalApiDaemon::connectToApi()->CP_GetNetwork(chip_id)", CP_GetNetwork(sid, "chip_id", &f.modemId));
|
||||||
logCpApiError("api_driver::TerminalApiDaemon::run()->CP_GetNetwork(serial)", CP_GetNetwork(sid, "serial", &firmware.modemSn));
|
rtrim(f.modemId);
|
||||||
logCpApiError("api_driver::TerminalApiDaemon::run()->CP_GetNetwork(mac_eth0)", CP_GetNetwork(sid, "mac_eth0", &firmware.macMang));
|
logCpApiError("api_driver::TerminalApiDaemon::connectToApi()->CP_GetNetwork(serial)", CP_GetNetwork(sid, "serial", &f.modemSn));
|
||||||
logCpApiError("api_driver::TerminalApiDaemon::run()->CP_GetNetwork(mac_eth1)", CP_GetNetwork(sid, "mac_eth1", &firmware.macData));
|
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
|
||||||
|
this->connectToApi();
|
||||||
|
|
||||||
struct IntervalUpdate_t {
|
struct IntervalUpdate_t {
|
||||||
int64_t lastUpdate;
|
int64_t lastUpdate;
|
||||||
int64_t periodMs;
|
int64_t periodMs;
|
||||||
@ -317,6 +333,12 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
while (true) {
|
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; // минута по-умолчанию
|
int64_t sleepTime = 60000; // минута по-умолчанию
|
||||||
auto now = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()).time_since_epoch().count();
|
auto now = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()).time_since_epoch().count();
|
||||||
for (auto& u: updaters) {
|
for (auto& u: updaters) {
|
||||||
@ -360,13 +382,14 @@ private:
|
|||||||
bool qosEnabled;
|
bool qosEnabled;
|
||||||
std::string qosClassesJson;
|
std::string qosClassesJson;
|
||||||
|
|
||||||
|
std::shared_mutex firmwareMutex;
|
||||||
|
TerminalFirmwareVersion firmware;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
std::mutex cpApiMutex;
|
std::mutex cpApiMutex;
|
||||||
TSID sid;
|
TSID sid;
|
||||||
boost::thread daemon;
|
boost::thread daemon;
|
||||||
|
|
||||||
TerminalFirmwareVersion firmware;
|
|
||||||
|
|
||||||
explicit TerminalApiDaemon(): deviceInitState("Not connected to API"), qosEnabled(false), sid(0), daemon([this]() { this->run(); }) {
|
explicit TerminalApiDaemon(): deviceInitState("Not connected to API"), qosEnabled(false), sid(0), daemon([this]() { this->run(); }) {
|
||||||
this->qosClassesJson = DEFAULT_QOS_CLASSES;
|
this->qosClassesJson = DEFAULT_QOS_CLASSES;
|
||||||
}
|
}
|
||||||
@ -584,6 +607,11 @@ public:
|
|||||||
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetDmaDebug(save_config)", CP_SetDmaDebug(sid, "save_config", ""));
|
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() {
|
void resetPacketStatistics() {
|
||||||
std::string tmp;
|
std::string tmp;
|
||||||
std::lock_guard lock(this->cpApiMutex);
|
std::lock_guard lock(this->cpApiMutex);
|
||||||
@ -884,11 +912,12 @@ std::string api_driver::ApiDriver::loadFirmwareVersion() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::stringstream result;
|
std::stringstream result;
|
||||||
result << "{\n\"fw.version\":" << buildEscapedString(daemon->firmware.version);
|
auto firmware = daemon->getFirmware();
|
||||||
result << ",\"fw.modemId\":" << buildEscapedString(daemon->firmware.modemId);
|
result << "{\n\"fw.version\":" << buildEscapedString(firmware.version);
|
||||||
result << ",\"fw.modemSn\":" << buildEscapedString(daemon->firmware.modemSn);
|
result << ",\"fw.modemId\":" << buildEscapedString(firmware.modemId);
|
||||||
result << ",\"fw.macMang\":" << buildEscapedString(daemon->firmware.macMang);
|
result << ",\"fw.modemSn\":" << buildEscapedString(firmware.modemSn);
|
||||||
result << ",\"fw.macData\":" << buildEscapedString(daemon->firmware.macData);
|
result << ",\"fw.macMang\":" << buildEscapedString(firmware.macMang);
|
||||||
|
result << ",\"fw.macData\":" << buildEscapedString(firmware.macData);
|
||||||
result << "\n}";
|
result << "\n}";
|
||||||
return result.str();
|
return result.str();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user