diff --git a/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorPlugin.cpp b/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorPlugin.cpp index cc19bd5f7..7b1da06c8 100755 --- a/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorPlugin.cpp +++ b/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorPlugin.cpp @@ -9,10 +9,19 @@ namespace RSUHealthMonitor RSUHealthMonitorPlugin::RSUHealthMonitorPlugin(std::string name) : PluginClient(name) { _rsuWorker = std::make_shared(); + UpdateConfigSettings(); + // Send SNMP call to RSU periodically at configurable interval. - std::thread rsuStatus_t(&RSUHealthMonitorPlugin::PeriodicRSUStatusReq, this); - rsuStatus_t.join(); + _rsuStatusTimer = make_unique(); + _rsuStatusTimer->AddPeriodicTick([this]() + { + // Periodic SNMP call to get RSU status based on RSU MIB version 4.1 + auto rsuStatusJson = getRSUStatus(); + + //Broadcast RSU status periodically at _interval + BroadcastRSUStatus(rsuStatusJson); }, + chrono::seconds(_interval)); } void RSUHealthMonitorPlugin::UpdateConfigSettings() @@ -37,7 +46,7 @@ namespace RSUHealthMonitor else { _rsuMibVersion = UNKOWN_MIB_V; - PLOG(logERROR) << "Uknown RSU MIB version: " <<_rsuMIBVersionStr; + PLOG(logERROR) << "Uknown RSU MIB version: " << _rsuMIBVersionStr; } } @@ -47,40 +56,34 @@ namespace RSUHealthMonitor UpdateConfigSettings(); } - void RSUHealthMonitorPlugin::PeriodicRSUStatusReq() + void RSUHealthMonitorPlugin::BroadcastRSUStatus(const Json::Value &rsuStatusJson) { - while (true) + try { - try + // Broadcast the RSU status info when there are RSU responses. + if (!rsuStatusJson.empty()) { - // Periodic SNMP call to get RSU status based on RSU MIB version 4.1 - auto rsuStatusJson = getRSUStatus(); - // Broadcast the RSU status info when there are RSU responses. - if (!rsuStatusJson.empty()) + vector rsuStatusFields; + for (auto const &field : rsuStatusJson.getMemberNames()) { - vector rsuStatusFields; - for (auto const &field : rsuStatusJson.getMemberNames()) - { - rsuStatusFields.push_back(field); - } - // Only broadcast RSU status when all required fields are present. - if (_rsuWorker && _rsuWorker->isAllRequiredFieldsPresent(_rsuMibVersion, rsuStatusFields)) - { - Json::FastWriter fasterWirter; - string json_str = fasterWirter.write(rsuStatusJson); - tmx::messages::RSUStatusMessage sendRsuStatusMsg; - sendRsuStatusMsg.set_contents(json_str); - string source = RSUHealthMonitorPlugin::GetName(); - BroadcastMessage(sendRsuStatusMsg, source); - PLOG(logINFO) << "Broadcast RSU status: " << json_str; - } + rsuStatusFields.push_back(field); + } + // Only broadcast RSU status when all required fields are present. + if (_rsuWorker && _rsuWorker->isAllRequiredFieldsPresent(_rsuMibVersion, rsuStatusFields)) + { + Json::FastWriter fasterWirter; + string json_str = fasterWirter.write(rsuStatusJson); + tmx::messages::RSUStatusMessage sendRsuStatusMsg; + sendRsuStatusMsg.set_contents(json_str); + string source = RSUHealthMonitorPlugin::GetName(); + BroadcastMessage(sendRsuStatusMsg, source); + PLOG(logINFO) << "Broadcast RSU status: " << json_str; } } - catch (const std::exception &ex) - { - PLOG(logERROR) << ex.what(); - } - this_thread::sleep_for(chrono::seconds(_interval)); + } + catch (const std::exception &ex) + { + PLOG(logERROR) << ex.what(); } } diff --git a/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorPlugin.h b/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorPlugin.h index 604be6714..08ce67e6f 100755 --- a/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorPlugin.h +++ b/src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorPlugin.h @@ -28,7 +28,8 @@ namespace RSUHealthMonitor RSUMibVersion _rsuMibVersion; const char *RSU4_1_str = "RSU4.1"; const char *RSU1218_str = "RSU1218"; - std::shared_ptr _rsuWorker; + shared_ptr _rsuWorker; + unique_ptr _rsuStatusTimer; const long SEC_TO_MICRO = 1000000; // std::shared_ptr _snmpClientPtr; /** @@ -37,9 +38,9 @@ namespace RSUHealthMonitor */ void UpdateRSUOIDConfig(string &json_str); /** - * @brief Periodically sending SNMP requests to get RSU status info. + * @brief Broadcast RSU status */ - void PeriodicRSUStatusReq(); + void BroadcastRSUStatus(const Json::Value& rsuStatusJson); /** * @brief Sending SNMP requests to get info for each field in the RSUStatusConfigTable, and return the RSU status in JSON * Use RSU Status configuration table include RSU field, OIDs, and whether fields are required or optional