diff --git a/3rdparty/libwebsockets/lib/core-net/client/connect4.c b/3rdparty/libwebsockets/lib/core-net/client/connect4.c index c34d2253..7c9a4f50 100644 --- a/3rdparty/libwebsockets/lib/core-net/client/connect4.c +++ b/3rdparty/libwebsockets/lib/core-net/client/connect4.c @@ -57,7 +57,7 @@ lws_client_connect_4_established(struct lws *wsi, struct lws *wsi_piggyback, if (wsi->a.vhost->http.http_proxy_port) { const char *cpa; - cpa = lws_wsi_client_stash_item(wsi, CIS_ADDRESS, + cpa = lws_wsi_client_stash_item(wsi, CIS_HOST, _WSI_TOKEN_CLIENT_PEER_ADDRESS); if (!cpa) goto failed; diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ed74c43..b672f149 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ cmake_minimum_required(VERSION 3.13) project(OpenOCPP DESCRIPTION "Open Source C++ implementation of the OCPP 1.6 protocol" - VERSION 1.5.7 + VERSION 1.5.8 ) # Definitions for Version.h file diff --git a/src/centralsystem/chargepoint/ChargePointHandler.cpp b/src/centralsystem/chargepoint/ChargePointHandler.cpp index e0cc4602..75140ce2 100644 --- a/src/centralsystem/chargepoint/ChargePointHandler.cpp +++ b/src/centralsystem/chargepoint/ChargePointHandler.cpp @@ -341,6 +341,12 @@ bool ChargePointHandler::handleMessage(const ocpp::messages::HeartbeatReq& reque // Empty request (void)request; + // Notify request + if (m_handler) + { + m_handler->heartbeat(); + } + // Prepare response response.currentTime = DateTime::now(); diff --git a/src/centralsystem/interface/IChargePointRequestHandler.h b/src/centralsystem/interface/IChargePointRequestHandler.h index c238f3c2..956d03c1 100644 --- a/src/centralsystem/interface/IChargePointRequestHandler.h +++ b/src/centralsystem/interface/IChargePointRequestHandler.h @@ -44,6 +44,11 @@ class IChargePointRequestHandler /** @brief Called to notify the disconnection of the charge point */ virtual void disconnected() = 0; + /** + * @brief Called when an heartbeat has been received + */ + virtual void heartbeat() { } + /** * @brief Called to get authorization informations for an id tag * @param id_tag Id tag to check diff --git a/src/chargepoint/iso15118/Iso15118Manager.cpp b/src/chargepoint/iso15118/Iso15118Manager.cpp index 14aeb522..3243de09 100644 --- a/src/chargepoint/iso15118/Iso15118Manager.cpp +++ b/src/chargepoint/iso15118/Iso15118Manager.cpp @@ -375,7 +375,8 @@ void Iso15118Manager::handle(const ocpp::messages::Iso15118GetInstalledCertifica // Notify handler to get the list of installed certificates std::vector>> certificates; - m_events_handler.iso15118GetInstalledCertificates(v2g_root_certificate, mo_root_certificate, v2g_certificate_chain, oem_root_certificate, certificates); + m_events_handler.iso15118GetInstalledCertificates( + v2g_root_certificate, mo_root_certificate, v2g_certificate_chain, oem_root_certificate, certificates); if (!certificates.empty()) { // Compute hashes for each certificate diff --git a/src/chargepoint/status/StatusManager.cpp b/src/chargepoint/status/StatusManager.cpp index 3c70abef..b2ecde50 100644 --- a/src/chargepoint/status/StatusManager.cpp +++ b/src/chargepoint/status/StatusManager.cpp @@ -434,7 +434,15 @@ void StatusManager::bootNotificationProcess() // Configure hearbeat std::chrono::seconds interval(boot_conf.interval); - m_ocpp_config.heartbeatInterval(interval); + if(boot_conf.interval == 0) + { + interval = m_ocpp_config.heartbeatInterval(); + } + else + { + m_ocpp_config.heartbeatInterval(interval); + } + m_heartbeat_timer.start(std::chrono::milliseconds(interval)); } else @@ -551,7 +559,15 @@ void StatusManager::sendBootNotification() // Restart hearbeat timer std::chrono::seconds interval(boot_conf.interval); - m_ocpp_config.heartbeatInterval(interval); + if(boot_conf.interval == 0) + { + interval = m_ocpp_config.heartbeatInterval(); + } + else + { + m_ocpp_config.heartbeatInterval(interval); + } + m_heartbeat_timer.restart(std::chrono::milliseconds(interval)); // Save registration status diff --git a/src/messages/IMessageConverter.h b/src/messages/IMessageConverter.h index cb922e06..0636aaa1 100644 --- a/src/messages/IMessageConverter.h +++ b/src/messages/IMessageConverter.h @@ -290,25 +290,19 @@ class IMessageConverter class MessageType##ReqConverter : public IMessageConverter \ { \ public: \ - IMessageConverter* clone() const override \ - { \ - return new MessageType##ReqConverter(); \ - } \ + IMessageConverter* clone() const override { return new MessageType##ReqConverter(); } \ bool fromJson(const rapidjson::Value& json, MessageType##Req& data, std::string& error_code, std::string& error_message) override; \ bool toJson(const MessageType##Req& data, rapidjson::Document& json) override; \ }; \ class MessageType##ConfConverter : public IMessageConverter \ { \ public: \ - IMessageConverter* clone() const override \ - { \ - return new MessageType##ConfConverter(); \ - } \ - bool fromJson(const rapidjson::Value& json, \ - MessageType##Conf& data, \ - std::string& error_code, \ - std::string& error_message) override; \ - bool toJson(const MessageType##Conf& data, rapidjson::Document& json) override; \ + IMessageConverter* clone() const override { return new MessageType##ConfConverter(); } \ + bool fromJson(const rapidjson::Value& json, \ + MessageType##Conf& data, \ + std::string& error_code, \ + std::string& error_message) override; \ + bool toJson(const MessageType##Conf& data, rapidjson::Document& json) override; \ }; } // namespace messages diff --git a/src/websockets/IWebsocketClient.h b/src/websockets/IWebsocketClient.h index 981831c9..6f231e05 100644 --- a/src/websockets/IWebsocketClient.h +++ b/src/websockets/IWebsocketClient.h @@ -149,6 +149,8 @@ class IWebsocketClient /** @brief Skip server name check in certificates for TLS connections * (Warning : enabling this feature is not recommended in production) */ bool skip_server_name_check; + /** @brief Server name (used for server certificate check) */ + std::string server_name; }; }; diff --git a/src/websockets/libwebsockets/LibWebsocketClient.cpp b/src/websockets/libwebsockets/LibWebsocketClient.cpp index 70074138..6e3e0b38 100644 --- a/src/websockets/libwebsockets/LibWebsocketClient.cpp +++ b/src/websockets/libwebsockets/LibWebsocketClient.cpp @@ -358,8 +358,15 @@ void LibWebsocketClient::connectCallback(struct lws_sorted_usec_list* sul) noexc i.context = client->m_context; i.address = client->m_url.address().c_str(); i.path = client->m_url.path().c_str(); - i.host = i.address; - i.origin = i.address; + if (client->m_credentials.server_name.empty()) + { + i.host = i.address; + } + else + { + i.host = client->m_credentials.server_name.c_str(); + } + i.origin = i.address; if (client->m_url.protocol() == "wss") { i.ssl_connection = LCCSCF_USE_SSL; diff --git a/src/websockets/libwebsockets/LibWebsocketClientPool.cpp b/src/websockets/libwebsockets/LibWebsocketClientPool.cpp index 98b4dc8e..a3d07825 100644 --- a/src/websockets/libwebsockets/LibWebsocketClientPool.cpp +++ b/src/websockets/libwebsockets/LibWebsocketClientPool.cpp @@ -147,7 +147,7 @@ void LibWebsocketClientPool::process() // Dummy vhost to handle context related events struct lws_protocols protocols[] = {{"LibWebsocketClientPool", &LibWebsocketClientPool::eventCallback, 0, 0, 0, this, 0}, - LWS_PROTOCOL_LIST_TERM}; + LWS_PROTOCOL_LIST_TERM}; struct lws_context_creation_info vhost_info; memset(&vhost_info, 0, sizeof(vhost_info)); vhost_info.protocols = protocols; @@ -537,8 +537,15 @@ void LibWebsocketClientPool::Client::connectCallback(struct lws_sorted_usec_list connect_info.vhost = client->m_vhost; connect_info.address = client->m_url.address().c_str(); connect_info.path = client->m_url.path().c_str(); - connect_info.host = connect_info.address; - connect_info.origin = connect_info.address; + if (client->m_credentials.server_name.empty()) + { + connect_info.host = connect_info.address; + } + else + { + connect_info.host = client->m_credentials.server_name.c_str(); + } + connect_info.origin = connect_info.address; if (client->m_url.protocol() == "wss") { connect_info.ssl_connection = LCCSCF_USE_SSL; diff --git a/tests/tools/test_database.cpp b/tests/tools/test_database.cpp index 9620bd8c..01db7425 100644 --- a/tests/tools/test_database.cpp +++ b/tests/tools/test_database.cpp @@ -135,8 +135,5 @@ TEST_SUITE("Database class test suite") CHECK_EQ(query.get(), nullptr); } - TEST_CASE("Cleanup") - { - std::filesystem::remove(test_database_path); - } + TEST_CASE("Cleanup") { std::filesystem::remove(test_database_path); } } diff --git a/tests/tools/test_logs.cpp b/tests/tools/test_logs.cpp index 1dc35008..1ca83ff6 100644 --- a/tests/tools/test_logs.cpp +++ b/tests/tools/test_logs.cpp @@ -201,10 +201,7 @@ TEST_SUITE("Database class test suite") CHECK_FALSE(query->next()); } - TEST_CASE("Cleanup") - { - std::filesystem::remove(test_database_path); - } + TEST_CASE("Cleanup") { std::filesystem::remove(test_database_path); } } #endif // EXTERNAL_LOGGER