Skip to content

Commit a97cb7c

Browse files
sandeepmistrymattiabertorello
authored andcommitted
Switch to the new ArduinoMQTT library
1 parent 83ff24d commit a97cb7c

File tree

2 files changed

+75
-47
lines changed

2 files changed

+75
-47
lines changed

src/ArduinoIoTCloud.cpp

Lines changed: 67 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,17 @@ const static int thingIdSlot = 12;
1111
ArduinoIoTCloudClass::ArduinoIoTCloudClass() :
1212
_thing_id (""),
1313
_bearSslClient(NULL),
14-
_mqttClient (MQTT_RECEIVE_BUFFER_SIZE)
14+
_mqttClient (NULL)
1515
{
1616
}
1717

1818
ArduinoIoTCloudClass::~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

9398
int 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

106111
bool ArduinoIoTCloudClass::disconnect()
107112
{
108-
return _mqttClient.disconnect();
113+
_mqttClient->stop();
114+
115+
return true;
109116
}
110117

111118
void 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

191187
int 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
}

src/ArduinoIoTCloud.h

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#ifndef ARDUINO_IOT_CLOUD_H
22
#define ARDUINO_IOT_CLOUD_H
33

4-
#include <MQTT.h>
4+
#include <ArduinoMQTT.h>
55
#include <ArduinoIoTCloudBearSSL.h>
66
#include <ArduinoCloudThing.h>
77

@@ -29,10 +29,9 @@ class ArduinoIoTCloudClass {
2929
int begin(Client& net, String brokerAddress = "mqtts-sa.iot.arduino.cc");
3030

3131
// Class constant declaration
32-
static const int MQTT_RECEIVE_BUFFER_SIZE = 256;
32+
static const int MQTT_TRANSMIT_BUFFER_SIZE = 256;
3333
static const int MAX_RETRIES = 5;
3434
static const int RECONNECTION_TIMEOUT = 2000;
35-
const mqttConnectionOptions mqttOpt = {30, false, 1500};
3635

3736
int connect ();
3837
bool disconnect();
@@ -81,23 +80,23 @@ class ArduinoIoTCloudClass {
8180

8281
protected:
8382
friend class CloudSerialClass;
84-
int writeStdout(const byte data[], int const length);
85-
int writeProperties(const byte data[], int const length);
83+
int writeStdout(const byte data[], int length);
84+
int writeProperties(const byte data[], int length);
8685
// Used to initialize MQTTClient
87-
void mqttClientBegin(Client& net);
86+
void mqttClientBegin();
8887
// Function in charge of perform MQTT reconnection, basing on class parameters(retries,and timeout)
8988
bool mqttReconnect(int const maxRetries, int const timeout);
9089

9190
private:
92-
static void onMessage(MQTTClient *client, char topic[], char bytes[], int const length);
93-
void handleMessage(char topic[], char bytes[], int const length);
91+
static void onMessage(int length);
92+
void handleMessage(int length);
9493

9594
String _id,
9695
_thing_id,
9796
_brokerAddress;
9897
ArduinoCloudThing Thing;
9998
BearSSLClient* _bearSslClient;
100-
MQTTClient _mqttClient;
99+
MQTTClient* _mqttClient;
101100

102101
// Class attribute to define MTTQ topics 2 for stdIn/out and 2 for data, in order to avoid getting previous pupblished payload
103102
String _stdinTopic;

0 commit comments

Comments
 (0)