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 miao zhicheng

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

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;