Skip to content

Commit 52cb45c

Browse files
committed
Both the MQTT client (MqttClient) and the BearSSL client (BearSSLClient) are allocated on the stack instead of the heap.
This means that the memory consumption of those two rather large classes are directly visibale in the compilation output since ArduinoIoTCloud is instantiated as a global variable. The heap allocation is not directly visible to the user of the library and so gives the wrong impression that there is a lot of free space left.
1 parent 6a54e17 commit 52cb45c

File tree

2 files changed

+33
-38
lines changed

2 files changed

+33
-38
lines changed

src/ArduinoIoTCloudTCP.cpp

+29-34
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,13 @@ ArduinoIoTCloudTCP::ArduinoIoTCloudTCP()
6464
, _mqtt_data_buf{0}
6565
, _mqtt_data_len{0}
6666
, _mqtt_data_request_retransmit{false}
67-
, _sslClient(NULL)
67+
#ifdef BOARD_HAS_ECCX08
68+
, _sslClient(nullptr, ArduinoIoTCloudTrustAnchor, ArduinoIoTCloudTrustAnchor_NUM)
69+
#endif
6870
#ifdef BOARD_ESP
6971
, _password("")
7072
#endif
71-
, _mqttClient(NULL)
73+
, _mqttClient{nullptr}
7274
, _syncStatus{ArduinoIoTSynchronizationStatus::SYNC_STATUS_SYNCHRONIZED}
7375
, _stdinTopic("")
7476
, _stdoutTopic("")
@@ -85,12 +87,6 @@ ArduinoIoTCloudTCP::ArduinoIoTCloudTCP()
8587

8688
}
8789

88-
ArduinoIoTCloudTCP::~ArduinoIoTCloudTCP()
89-
{
90-
delete _mqttClient; _mqttClient = NULL;
91-
delete _sslClient; _sslClient = NULL;
92-
}
93-
9490
/******************************************************************************
9591
* PUBLIC MEMBER FUNCTIONS
9692
******************************************************************************/
@@ -115,21 +111,20 @@ int ArduinoIoTCloudTCP::begin(String brokerAddress, uint16_t brokerPort)
115111
if (!CryptoUtil::readDeviceId(ECCX08, getDeviceId(), ECCX08Slot::DeviceId)) { Debug.print(DBG_ERROR, "Cryptography processor read failure."); return 0; }
116112
if (!CryptoUtil::reconstructCertificate(_eccx08_cert, getDeviceId(), ECCX08Slot::Key, ECCX08Slot::CompressedCertificate, ECCX08Slot::SerialNumberAndAuthorityKeyIdentifier)) { Debug.print(DBG_ERROR, "Cryptography certificate reconstruction failure."); return 0; }
117113
ArduinoBearSSL.onGetTime(getTime);
118-
_sslClient = new BearSSLClient(_connection->getClient(), ArduinoIoTCloudTrustAnchor, ArduinoIoTCloudTrustAnchor_NUM);
119-
_sslClient->setEccSlot(static_cast<int>(ECCX08Slot::Key), _eccx08_cert.bytes(), _eccx08_cert.length());
114+
_sslClient.setClient(_connection->getClient());
115+
_sslClient.setEccSlot(static_cast<int>(ECCX08Slot::Key), _eccx08_cert.bytes(), _eccx08_cert.length());
120116
#elif defined(BOARD_ESP)
121-
_sslClient = new WiFiClientSecure();
122-
_sslClient->setInsecure();
117+
_sslClient.setInsecure();
123118
#endif
124119

125-
_mqttClient = new MqttClient(*_sslClient);
120+
_mqttClient.setClient(_sslClient);
126121
#ifdef BOARD_ESP
127-
_mqttClient->setUsernamePassword(getDeviceId(), _password);
122+
_mqttClient.setUsernamePassword(getDeviceId(), _password);
128123
#endif
129-
_mqttClient->onMessage(ArduinoIoTCloudTCP::onMessage);
130-
_mqttClient->setKeepAliveInterval(30 * 1000);
131-
_mqttClient->setConnectionTimeout(1500);
132-
_mqttClient->setId(getDeviceId().c_str());
124+
_mqttClient.onMessage(ArduinoIoTCloudTCP::onMessage);
125+
_mqttClient.setKeepAliveInterval(30 * 1000);
126+
_mqttClient.setConnectionTimeout(1500);
127+
_mqttClient.setId(getDeviceId().c_str());
133128

134129
_stdinTopic = getTopic_stdin();
135130
_stdoutTopic = getTopic_stdout();
@@ -170,7 +165,7 @@ void ArduinoIoTCloudTCP::update()
170165
}
171166

172167
// MTTQClient connected!, poll() used to retrieve data from MQTT broker
173-
_mqttClient->poll();
168+
_mqttClient.poll();
174169

175170
switch (_syncStatus)
176171
{
@@ -197,7 +192,7 @@ void ArduinoIoTCloudTCP::update()
197192

198193
int ArduinoIoTCloudTCP::connected()
199194
{
200-
return _mqttClient->connected();
195+
return _mqttClient.connected();
201196
}
202197

203198
void ArduinoIoTCloudTCP::printDebugInfo()
@@ -220,8 +215,8 @@ void ArduinoIoTCloudTCP::setOTAStorage(OTAStorage & ota_storage)
220215

221216
int ArduinoIoTCloudTCP::reconnect()
222217
{
223-
if (_mqttClient->connected()) {
224-
_mqttClient->stop();
218+
if (_mqttClient.connected()) {
219+
_mqttClient.stop();
225220
}
226221
return connect();
227222
}
@@ -232,14 +227,14 @@ int ArduinoIoTCloudTCP::reconnect()
232227

233228
int ArduinoIoTCloudTCP::connect()
234229
{
235-
if (!_mqttClient->connect(_brokerAddress.c_str(), _brokerPort)) return CONNECT_FAILURE;
236-
if (_mqttClient->subscribe(_stdinTopic) == 0) return CONNECT_FAILURE_SUBSCRIBE;
237-
if (_mqttClient->subscribe(_dataTopicIn) == 0) return CONNECT_FAILURE_SUBSCRIBE;
238-
if (_mqttClient->subscribe(_ota_topic_in) == 0) return CONNECT_FAILURE_SUBSCRIBE;
230+
if (!_mqttClient.connect(_brokerAddress.c_str(), _brokerPort)) return CONNECT_FAILURE;
231+
if (_mqttClient.subscribe(_stdinTopic) == 0) return CONNECT_FAILURE_SUBSCRIBE;
232+
if (_mqttClient.subscribe(_dataTopicIn) == 0) return CONNECT_FAILURE_SUBSCRIBE;
233+
if (_mqttClient.subscribe(_ota_topic_in) == 0) return CONNECT_FAILURE_SUBSCRIBE;
239234

240235
if (_shadowTopicIn != "")
241236
{
242-
if (_mqttClient->subscribe(_shadowTopicIn) == 0) return CONNECT_FAILURE_SUBSCRIBE;
237+
if (_mqttClient.subscribe(_shadowTopicIn) == 0) return CONNECT_FAILURE_SUBSCRIBE;
243238
_syncStatus = ArduinoIoTSynchronizationStatus::SYNC_STATUS_WAIT_FOR_CLOUD_VALUES;
244239
_lastSyncRequestTickTime = 0;
245240
}
@@ -249,7 +244,7 @@ int ArduinoIoTCloudTCP::connect()
249244

250245
void ArduinoIoTCloudTCP::disconnect()
251246
{
252-
_mqttClient->stop();
247+
_mqttClient.stop();
253248
}
254249

255250
/******************************************************************************
@@ -263,12 +258,12 @@ void ArduinoIoTCloudTCP::onMessage(int length)
263258

264259
void ArduinoIoTCloudTCP::handleMessage(int length)
265260
{
266-
String topic = _mqttClient->messageTopic();
261+
String topic = _mqttClient.messageTopic();
267262

268263
byte bytes[length];
269264

270265
for (int i = 0; i < length; i++) {
271-
bytes[i] = _mqttClient->read();
266+
bytes[i] = _mqttClient.read();
272267
}
273268

274269
if (_stdinTopic == topic) {
@@ -354,7 +349,7 @@ ArduinoIoTConnectionStatus ArduinoIoTCloudTCP::checkCloudConnection()
354349

355350
case ArduinoIoTConnectionStatus::CONNECTED:
356351
{
357-
if (!_mqttClient->connected())
352+
if (!_mqttClient.connected())
358353
{
359354
next_iot_status = ArduinoIoTConnectionStatus::DISCONNECTED;
360355
_mqtt_data_request_retransmit = true;
@@ -376,9 +371,9 @@ ArduinoIoTConnectionStatus ArduinoIoTCloudTCP::checkCloudConnection()
376371

377372
int ArduinoIoTCloudTCP::write(String const topic, byte const data[], int const length)
378373
{
379-
if (_mqttClient->beginMessage(topic, length, false, 0)) {
380-
if (_mqttClient->write(data, length)) {
381-
if (_mqttClient->endMessage()) {
374+
if (_mqttClient.beginMessage(topic, length, false, 0)) {
375+
if (_mqttClient.write(data, length)) {
376+
if (_mqttClient.endMessage()) {
382377
return 1;
383378
}
384379
}

src/ArduinoIoTCloudTCP.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class ArduinoIoTCloudTCP: public ArduinoIoTCloudClass
5858
public:
5959

6060
ArduinoIoTCloudTCP();
61-
virtual ~ArduinoIoTCloudTCP();
61+
virtual ~ArduinoIoTCloudTCP() { }
6262

6363

6464
virtual void update () override;
@@ -108,13 +108,13 @@ class ArduinoIoTCloudTCP: public ArduinoIoTCloudClass
108108

109109
#ifdef BOARD_HAS_ECCX08
110110
ECCX08CertClass _eccx08_cert;
111-
BearSSLClient* _sslClient;
111+
BearSSLClient _sslClient;
112112
#elif defined(BOARD_ESP)
113-
WiFiClientSecure* _sslClient;
113+
WiFiClientSecure _sslClient;
114114
String _password;
115115
#endif
116116

117-
MqttClient* _mqttClient;
117+
MqttClient _mqttClient;
118118

119119
ArduinoIoTSynchronizationStatus _syncStatus;
120120

0 commit comments

Comments
 (0)