Connecting a Multi-Tech Systems Dragonfly™ to Twilio's Sync for IoT Quickstart. Blink a dev board LED.
Dependencies: MQTT MbedJSONValue mbed mtsas
Fork of DragonflyMQTT by
Code to connect a Multi-Tech® MultiConnect® Dragonfly™ to Twilio's Sync for IoT: https://www.twilio.com/docs/api/devices
Uses MQTT over TLS and subscribes to a topic where you can control an LED. See also our Quickstart using this code, here: https://www.twilio.com/docs/quickstart/sync-iot/mqtt-multi-tech-multiconnect-dragonfly-sync-iot
Diff: TlsMQTTClient.cpp
- Revision:
- 9:2d119fbe7482
- Parent:
- 3:0a48c984e15b
--- a/TlsMQTTClient.cpp Thu Sep 14 08:14:18 2017 +0000 +++ b/TlsMQTTClient.cpp Fri Sep 15 22:41:22 2017 +0000 @@ -1,14 +1,20 @@ #include <cyassl/ctaocrypt/types.h> #include "TlsMQTTClient.hpp" + TlsMQTTClient::TlsMQTTClient() : tcp(NULL), ctx(NULL), ssl(NULL), mqttClient(new MQTTClient(*this)) { } -int TlsMQTTClient::connect(const char* host, const int port, - const char* certificates, - MQTTPacket_connectData& options) { + +int TlsMQTTClient::connect( + const char* host, + const int port, + const char* certificates, + MQTTPacket_connectData& options +) +{ cleanupTransport(); // create TCP transport @@ -22,20 +28,33 @@ // setup SSL context ctx = CyaSSL_CTX_new((CYASSL_METHOD *)CyaSSLv23_client_method()); { //Localize pMethod array for less overall memory time-use - SSLMethod peerMethod = certificates != NULL ? (SSLMethod)(VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT) : VERIFY_NONE; + SSLMethod peerMethod = certificates != \ + NULL ? (SSLMethod)( + VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT + ) : VERIFY_NONE; + std::string pMethod; if(peerMethod == VERIFY_NONE) { pMethod = "not verify peer"; } else if (peerMethod & VERIFY_PEER) { - pMethod = "verify peer if certificates available"; - //Load the CA certificate(s) (If using multiple, concatenate them in the buffer being passed) - if (SSL_SUCCESS != CyaSSL_CTX_load_verify_buffer(ctx, (const unsigned char*)certificates, strlen(certificates), SSL_FILETYPE_PEM)) { - logError("unable to load root certificates"); + pMethod = "Verify peer if certificates available"; + //Load the CA certificate(s) + // (If using multiple, concatenate them in the buffer being passed) + if (SSL_SUCCESS != CyaSSL_CTX_load_verify_buffer( + ctx, + (const unsigned char*)certificates, + strlen(certificates), + SSL_FILETYPE_PEM) + ) { + + logError("Unable to load root certificates!"); goto fail; } } logDebug("SSL connection set to %s", pMethod.c_str()); - CyaSSL_CTX_set_verify(ctx, peerMethod, 0); //SSL_VERIFY_FAIL_IF_NO_PEER_CERT, VERIFY_NONE, SSL_VERIFY_PEER + + //SSL_VERIFY_FAIL_IF_NO_PEER_CERT, VERIFY_NONE, SSL_VERIFY_PEER + CyaSSL_CTX_set_verify(ctx, peerMethod, 0); } // setup SSL operations @@ -67,7 +86,11 @@ if(!strcmp(data,data_new)) { logError("Error code [%d] is [%s]\r\n", err, data); } else { - logError("Failed to get error code [%d], Reason: [%s]\r\n", err, data_new); + logError( + "Failed to get error code [%d], Reason: [%s]\r\n", + err, + data_new + ); } goto fail; @@ -78,42 +101,74 @@ return mqttClient->connect(options); +// Cleanup handler fail: cleanupTransport() ; return MQTT::FAILURE; } -int TlsMQTTClient::publish(const char* topicName, MQTT::Message& message) { +int TlsMQTTClient::publish(const char* topicName, MQTT::Message& message) +{ return mqttClient->publish(topicName, message); } -int TlsMQTTClient::publish(const char* topicName, void* payload, size_t payloadlen, enum MQTT::QoS qos, bool retained) { +int TlsMQTTClient::publish( + const char* topicName, + void* payload, + size_t payloadlen, + enum MQTT::QoS qos, + bool retained +) +{ return mqttClient->publish(topicName, payload, payloadlen, qos, retained); } -int TlsMQTTClient::publish(const char* topicName, void* payload, size_t payloadlen, unsigned short& id, enum MQTT::QoS qos, bool retained) { - return mqttClient->publish(topicName, payload, payloadlen, id, qos, retained); +int TlsMQTTClient::publish( + const char* topicName, + void* payload, size_t payloadlen, + unsigned short& id, + enum MQTT::QoS qos, + bool retained +) +{ + return mqttClient->publish( + topicName, + payload, + payloadlen, + id, + qos, + retained + ); } -int TlsMQTTClient::subscribe(const char* topicFilter, enum MQTT::QoS qos, MessageHandler mh) { +int TlsMQTTClient::subscribe( + const char* topicFilter, + enum MQTT::QoS qos, + MessageHandler mh +) +{ return mqttClient->subscribe(topicFilter, qos, mh); } -int TlsMQTTClient::unsubscribe(const char* topicFilter) { +int TlsMQTTClient::unsubscribe(const char* topicFilter) +{ return mqttClient->unsubscribe(topicFilter); } -int TlsMQTTClient::disconnect() { +int TlsMQTTClient::disconnect() +{ int r = mqttClient->disconnect(); cleanupTransport(); return r; } -int TlsMQTTClient::yield(unsigned long timeout_ms) { +int TlsMQTTClient::yield(unsigned long timeout_ms) +{ return mqttClient->yield(timeout_ms); } -bool TlsMQTTClient::isConnected() { +bool TlsMQTTClient::isConnected() +{ return mqttClient->isConnected(); } @@ -144,8 +199,18 @@ delete mqttClient; } -int TlsMQTTClient::read(unsigned char* data, int max, int timeout) { - //logTrace("TlsMQTTClient::read data %p max %d timeout %d", data, max, timeout); +int TlsMQTTClient::read( + unsigned char* data, + int max, + int timeout +) +{ +// logTrace( +// "TlsMQTTClient::read data %p max %d timeout %d", +// data, +// max, +// timeout +// ); Timer tmr; int bytes = 0; int totalbytes = 0; @@ -168,7 +233,12 @@ } int TlsMQTTClient::write(const unsigned char* data, int length, int timeout) { - //logTrace("TlsMQTTClient::write data %p max %d timeout %d", data, length, timeout); +// logTrace( +// "TlsMQTTClient::write data %p max %d timeout %d", +// data, +// length, +// timeout +// ); Timer tmr; int bytes = 0; int totalbytes = 0;