@@ -11,12 +11,17 @@ const static int thingIdSlot = 12;
1111ArduinoIoTCloudClass::ArduinoIoTCloudClass () :
1212 _thing_id (" " ),
1313 _bearSslClient(NULL ),
14- _mqttClient (MQTT_RECEIVE_BUFFER_SIZE )
14+ _mqttClient (NULL )
1515{
1616}
1717
1818ArduinoIoTCloudClass::~ArduinoIoTCloudClass ()
1919{
20+ if (_mqttClient) {
21+ delete _mqttClient;
22+ _mqttClient = NULL ;
23+ }
24+
2025 if (_bearSslClient) {
2126 delete _bearSslClient;
2227 _bearSslClient = NULL ;
@@ -58,17 +63,18 @@ int ArduinoIoTCloudClass::begin(Client& net, String brokerAddress)
5863 }
5964 _bearSslClient = new BearSSLClient (net);
6065 _bearSslClient->setEccSlot (keySlot, ECCX08Cert.bytes (), ECCX08Cert.length ());
66+ _mqttClient = new MQTTClient (*_bearSslClient);
6167
6268 // Begin function for the MQTTClient
63- mqttClientBegin (*_bearSslClient );
69+ mqttClientBegin ();
6470
6571 Thing.begin ();
6672
6773 return 1 ;
6874}
6975
7076// private class method used to initialize mqttClient class member. (called in the begin class method)
71- void ArduinoIoTCloudClass::mqttClientBegin (Client& net )
77+ void ArduinoIoTCloudClass::mqttClientBegin ()
7278{
7379 // MQTT topics definition
7480 _stdoutTopic = " /a/d/" + _id + " /s/o" ;
@@ -83,29 +89,30 @@ void ArduinoIoTCloudClass::mqttClientBegin(Client& net)
8389 }
8490
8591 // use onMessage as callback for received mqtt messages
86- _mqttClient.onMessageAdvanced (ArduinoIoTCloudClass::onMessage);
87- _mqttClient.begin (_brokerAddress.c_str (), 8883 , net);
88-
89- // Set MQTT connection options
90- _mqttClient.setOptions (mqttOpt.keepAlive , mqttOpt.cleanSession , mqttOpt.timeout );
92+ _mqttClient->onMessage (ArduinoIoTCloudClass::onMessage);
93+ _mqttClient->setKeepAliveInterval (30 * 1000 );
94+ _mqttClient->setConnectionTimeout (1500 );
95+ _mqttClient->setId (_id.c_str ());
9196}
9297
9398int ArduinoIoTCloudClass::connect ()
9499{
95100 // Username: device id
96101 // Password: empty
97- if (!_mqttClient. connect (_id .c_str ())) {
102+ if (!_mqttClient-> connect (_brokerAddress .c_str (), 8883 )) {
98103 return 0 ;
99104 }
100- _mqttClient. subscribe (_stdinTopic);
101- _mqttClient. subscribe (_dataTopicIn);
105+ _mqttClient-> subscribe (_stdinTopic);
106+ _mqttClient-> subscribe (_dataTopicIn);
102107
103108 return 1 ;
104109}
105110
106111bool ArduinoIoTCloudClass::disconnect ()
107112{
108- return _mqttClient.disconnect ();
113+ _mqttClient->stop ();
114+
115+ return true ;
109116}
110117
111118void ArduinoIoTCloudClass::poll ()
@@ -127,10 +134,8 @@ bool ArduinoIoTCloudClass::mqttReconnect(int const maxRetries, int const timeout
127134
128135 // Check for MQTT broker connection, of if maxReties limit is reached
129136 // if MQTTClient is connected , simply do nothing and retun true
130- while (!_mqttClient.connected () && (retries++ < maxRetries) && (millis () - start < timeout)) {
131-
132- // Get last MTTQClient error, (a common error may be a buffer overflow)
133- lwmqtt_err_t err = _mqttClient.lastError ();
137+ while (!_mqttClient->connected () && (retries++ < maxRetries) && (millis () - start < timeout)) {
138+ // int connectError = _mqttClient->connectError();
134139
135140 // try establish the MQTT broker connection
136141 connect ();
@@ -154,31 +159,22 @@ void ArduinoIoTCloudClass::update(int const reconnectionMaxRetries, int const re
154159 return ;
155160
156161 // MTTQClient connected!, poll() used to retrieve data from MQTT broker
157- _mqttClient. loop ();
162+ _mqttClient-> poll ();
158163
159- uint8_t data[MQTT_RECEIVE_BUFFER_SIZE ];
164+ uint8_t data[MQTT_TRANSMIT_BUFFER_SIZE ];
160165 int const length = Thing.encode (data, sizeof (data));
161166 if (length > 0 ) {
162167 writeProperties (data, length);
163168 }
164169}
165170
166- int ArduinoIoTCloudClass::reconnect (Client& net)
171+ int ArduinoIoTCloudClass::reconnect (Client& /* net*/ )
167172{
168173 // check if MQTT client is still connected
169- if (_mqttClient. connected ()) {
170- while (! _mqttClient. disconnect () );
174+ if (_mqttClient-> connected ()) {
175+ _mqttClient-> stop ( );
171176 }
172177
173- // Re-initialize _bearSslClient
174- if (_bearSslClient) {
175- delete _bearSslClient;
176- }
177- _bearSslClient = new BearSSLClient (net);
178- _bearSslClient->setEccSlot (keySlot, ECCX08Cert.bytes (), ECCX08Cert.length ());
179-
180- // Initialize again the MQTTClient, otherwise it would not be able to receive messages through its callback
181- mqttClientBegin (*_bearSslClient);
182178 // Connect to the broker
183179 return connect ();
184180}
@@ -190,26 +186,59 @@ void ArduinoIoTCloudClass::onGetTime(unsigned long(*callback)(void))
190186
191187int ArduinoIoTCloudClass::connected ()
192188{
193- return _mqttClient. connected ();
189+ return _mqttClient-> connected ();
194190}
195191
196- int ArduinoIoTCloudClass::writeProperties (const byte data[], int const length)
192+ int ArduinoIoTCloudClass::writeProperties (const byte data[], int length)
197193{
198- return _mqttClient.publish (_dataTopicOut.c_str (), (const char *)data, length);
194+ if (!_mqttClient->beginMessage (_dataTopicOut, length, false , 0 )) {
195+ return 0 ;
196+ }
197+
198+ if (!_mqttClient->write (data, length)) {
199+ return 0 ;
200+ }
201+
202+ if (!_mqttClient->endMessage ()) {
203+ return 0 ;
204+ }
205+
206+ return 1 ;
199207}
200208
201- int ArduinoIoTCloudClass::writeStdout (const byte data[], int const length)
209+ int ArduinoIoTCloudClass::writeStdout (const byte data[], int length)
202210{
203- return _mqttClient.publish (_stdoutTopic.c_str (), (const char *)data, length);
211+ if (!_mqttClient->beginMessage (_stdoutTopic, length, false , 0 )) {
212+ return 0 ;
213+ }
214+
215+ if (!_mqttClient->write (data, length)) {
216+ return 0 ;
217+ }
218+
219+ if (!_mqttClient->endMessage ()) {
220+ return 0 ;
221+ }
222+
223+ return 1 ;
204224}
205225
206- void ArduinoIoTCloudClass::onMessage (MQTTClient* /* client */ , char topic[], char bytes[], int const length)
226+ void ArduinoIoTCloudClass::onMessage (int length)
207227{
208- ArduinoCloud.handleMessage (topic, bytes, length);
228+ ArduinoCloud.handleMessage (length);
209229}
210230
211- void ArduinoIoTCloudClass::handleMessage (char topic[], char bytes[], int const length)
231+ void ArduinoIoTCloudClass::handleMessage (int length)
212232{
233+ String topic = _mqttClient->messageTopic ();
234+
235+ byte bytes[length];
236+ int index = 0 ;
237+
238+ for (int i = 0 ; i < length; i++) {
239+ bytes[i] = _mqttClient->read ();
240+ }
241+
213242 if (_stdinTopic == topic) {
214243 CloudSerial.appendStdin ((uint8_t *)bytes, length);
215244 }
0 commit comments