diff --git a/lib/AgrirouterClient/inc/AgrirouterClient.h b/lib/AgrirouterClient/inc/AgrirouterClient.h index 11dbec8..d094846 100644 --- a/lib/AgrirouterClient/inc/AgrirouterClient.h +++ b/lib/AgrirouterClient/inc/AgrirouterClient.h @@ -17,6 +17,8 @@ class AgrirouterClient { explicit AgrirouterClient(Settings *settings, uint32_t chunkSize); ~AgrirouterClient(); + void renewConnection(); + void registerDeviceWithRegCode(const std::string& registrationCode, AgrirouterSettings& agrirouterSettings); // Messages without specific recipients @@ -36,7 +38,7 @@ class AgrirouterClient { void sendTaskdataZip(Addressing& addressing, std::string *messageId, const std::string& teamsetId, char *taskdataZip, int size, const std::string& fileName = ""); void sendChunk(AgrirouterMessage& message); - AgrirouterMessage createChunkMessage(std::string *messageId, Addressing& addressing, uint16_t numberOfChunk, uint16_t numberOfChunks, + AgrirouterMessage createChunkMessage(std::string *messageId, Addressing& addressing, uint16_t numberOfChunk, uint16_t numberOfChunks, const std::string& teamSetContextId, const std::string& chunkContextId, const std::string& data, uint32_t size, const std::string& technicalMessageType, const std::string& fileName = ""); diff --git a/lib/AgrirouterClient/inc/ConnectionProvider.h b/lib/AgrirouterClient/inc/ConnectionProvider.h index f30a26e..5e7d97d 100644 --- a/lib/AgrirouterClient/inc/ConnectionProvider.h +++ b/lib/AgrirouterClient/inc/ConnectionProvider.h @@ -19,6 +19,8 @@ class ConnectionProvider virtual ~ConnectionProvider() {} + virtual void renewConnection() {} + // Function pointer for callback functions typedef size_t (*Callback)(char *content, size_t size, size_t nmemb, void *member); diff --git a/lib/AgrirouterClient/inc/MqttConnectionClient.h b/lib/AgrirouterClient/inc/MqttConnectionClient.h index 7f0e910..f44bd8d 100644 --- a/lib/AgrirouterClient/inc/MqttConnectionClient.h +++ b/lib/AgrirouterClient/inc/MqttConnectionClient.h @@ -44,8 +44,8 @@ class MqttConnectionClient { void *m_member = nullptr; Settings *m_settings = nullptr; - MqttCallback m_mqttCallback; - MqttErrorCallback m_mqttErrorCallback; + MqttCallback m_mqttCallback = NULL; + MqttErrorCallback m_mqttErrorCallback = NULL; static int onPWCallback(char *buf, int size, int rwflag, void *userdata); static void connectCallback(struct mosquitto *mosq, void *obj, int result); diff --git a/lib/AgrirouterClient/inc/MqttConnectionProvider.h b/lib/AgrirouterClient/inc/MqttConnectionProvider.h index fe485c5..5069f25 100755 --- a/lib/AgrirouterClient/inc/MqttConnectionProvider.h +++ b/lib/AgrirouterClient/inc/MqttConnectionProvider.h @@ -14,8 +14,10 @@ class MqttConnectionProvider : public ConnectionProvider explicit MqttConnectionProvider(Settings *settings); ~MqttConnectionProvider(); + void renewConnection() override; + // Struct to use curl chunked callbacks - typedef struct MemoryStruct + typedef struct MemoryStruct { char *memory = nullptr; size_t size = 0; diff --git a/lib/AgrirouterClient/src/AgrirouterClient.cpp b/lib/AgrirouterClient/src/AgrirouterClient.cpp index d8d1e34..a9cd7b3 100644 --- a/lib/AgrirouterClient/src/AgrirouterClient.cpp +++ b/lib/AgrirouterClient/src/AgrirouterClient.cpp @@ -41,7 +41,6 @@ void AgrirouterClient::init(Settings *settings) m_messageProvider = nullptr; } m_messageProvider = new MessageProvider(settings, m_chunkSize); - if(m_connectionProvider != nullptr) { delete m_connectionProvider; @@ -49,7 +48,7 @@ void AgrirouterClient::init(Settings *settings) } if (settings->getConnectionType() == Settings::HTTP) - { + { m_connectionProvider = new CurlConnectionProvider(settings); } else if (settings->getConnectionType() == Settings::MQTT) @@ -83,14 +82,9 @@ void AgrirouterClient::registerDeviceWithRegCode(const std::string& registration void AgrirouterClient::registrationCallback(bool success, void *member) { AgrirouterClient *self = static_cast(member); - if(success) + if(success) { // reinit connection provider after onboard to new subscribe to the new topics - if (self->m_connectionProvider != nullptr) - { - delete self->m_connectionProvider; - self->m_connectionProvider = nullptr; - } self->init(self->m_settings); } else @@ -114,6 +108,14 @@ int32_t AgrirouterClient::getNextSeqNo() return m_seqNo; } +void AgrirouterClient::renewConnection() +{ + if (m_settings->getConnectionType() == Settings::MQTT) + { + m_connectionProvider->renewConnection(); + } +} + void AgrirouterClient::sendCapabilities(std::string *messageId, CapabilitySpecification *capabilities) { AgrirouterMessage message = m_messageProvider->getCapabilityMessage(messageId, getNextSeqNo(), "", capabilities); @@ -220,10 +222,9 @@ void AgrirouterClient::requestMessages() size_t AgrirouterClient::requestMessagesCallback(char *content, size_t size, size_t nmemb, void *member) { - size_t realsize = size * nmemb; - AgrirouterClient *self = static_cast(member); + size_t realsize = size * nmemb; std::string message(content, realsize); std::list responseList; diff --git a/lib/AgrirouterClient/src/ConnectionProvider/MqttConnectionClient.cpp b/lib/AgrirouterClient/src/ConnectionProvider/MqttConnectionClient.cpp index 6ba079f..158f9d0 100644 --- a/lib/AgrirouterClient/src/ConnectionProvider/MqttConnectionClient.cpp +++ b/lib/AgrirouterClient/src/ConnectionProvider/MqttConnectionClient.cpp @@ -188,7 +188,6 @@ void MqttConnectionClient::disconnectCallback(struct mosquitto *mosq, void *obj, self->m_settings->callOnLog(MG_LFL_ERR, errorMessage); (self->m_mqttErrorCallback) (reasonCode, errorMessage, "", self->m_member); - // try to reconnect int reconn = mosquitto_reconnect(self->m_mosq); if (reconn == MOSQ_ERR_SUCCESS) diff --git a/lib/AgrirouterClient/src/ConnectionProvider/MqttConnectionProvider.cpp b/lib/AgrirouterClient/src/ConnectionProvider/MqttConnectionProvider.cpp index 630b0c9..c0b6451 100644 --- a/lib/AgrirouterClient/src/ConnectionProvider/MqttConnectionProvider.cpp +++ b/lib/AgrirouterClient/src/ConnectionProvider/MqttConnectionProvider.cpp @@ -46,6 +46,11 @@ void MqttConnectionProvider::init() } } +void MqttConnectionProvider::renewConnection() +{ + this->init(); +} + void MqttConnectionProvider::requestMqttErrorCallback(int errorCode, std::string message, std::string content, void *member) { MqttConnectionProvider *self = static_cast(member); @@ -61,7 +66,7 @@ void MqttConnectionProvider::requestMqttCallback(char *topic, void *payload, int { MqttConnectionProvider *self = static_cast(member); char* msg = (char*) payload; - + if(msg) { // If msg starts with '{', it is not an array as it comes from curl, so add the square brackets