Skip to content

Commit c6723e8

Browse files
authored
Merge pull request #128 from arduino-libraries/bearssl-static-allocation
Both MqttClient and BearSSLClient are allocated on the stack instead of the heap.
2 parents 6a54e17 + 52cb45c commit c6723e8

File tree

2 files changed

+33
-38
lines changed

2 files changed

+33
-38
lines changed

Diff for: 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
}

Diff for: 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)