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

Committer:
miaotwilio
Date:
Tue May 09 13:16:48 2017 +0000
Revision:
0:b32fa0c757d7
Child:
1:5a896191c3c4
working prototype without CA validation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
miaotwilio 0:b32fa0c757d7 1 #include "MTSCellularManager.hpp"
miaotwilio 0:b32fa0c757d7 2 #include "TlsMQTTClient.hpp"
miaotwilio 0:b32fa0c757d7 3 #include "Certificates.h"
miaotwilio 0:b32fa0c757d7 4 #include <mbed.h>
miaotwilio 0:b32fa0c757d7 5 #include <mtsas.h>
miaotwilio 0:b32fa0c757d7 6 #include <ssl.h>
miaotwilio 0:b32fa0c757d7 7
miaotwilio 0:b32fa0c757d7 8 // This line controls the regulator's battery charger.
miaotwilio 0:b32fa0c757d7 9 // BC_NCE = 0 enables the battery charger
miaotwilio 0:b32fa0c757d7 10 // BC_NCE = 1 disables the battery charger
miaotwilio 0:b32fa0c757d7 11 DigitalOut bc_nce(PB_2);
miaotwilio 0:b32fa0c757d7 12
miaotwilio 0:b32fa0c757d7 13 static bool exitCmd = false;
miaotwilio 0:b32fa0c757d7 14
miaotwilio 0:b32fa0c757d7 15 static void test2Handler(MQTT::MessageData& data);
miaotwilio 0:b32fa0c757d7 16
miaotwilio 0:b32fa0c757d7 17 int main() {
miaotwilio 0:b32fa0c757d7 18 // Disable the battery charger unless a battery is attached.
miaotwilio 0:b32fa0c757d7 19 bc_nce = 1;
miaotwilio 0:b32fa0c757d7 20
miaotwilio 0:b32fa0c757d7 21 // Change the baud rate of the debug port from the default 9600 to 115200.
miaotwilio 0:b32fa0c757d7 22 Serial debug(USBTX, USBRX);
miaotwilio 0:b32fa0c757d7 23 debug.baud(115200);
miaotwilio 0:b32fa0c757d7 24
miaotwilio 0:b32fa0c757d7 25 //Sets the log level to INFO, higher log levels produce more log output.
miaotwilio 0:b32fa0c757d7 26 //Possible levels: NONE, FATAL, ERROR, WARNING, INFO, DEBUG, TRACE
miaotwilio 0:b32fa0c757d7 27 mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL);
miaotwilio 0:b32fa0c757d7 28
miaotwilio 0:b32fa0c757d7 29 logDebug("Program started");
miaotwilio 0:b32fa0c757d7 30
miaotwilio 0:b32fa0c757d7 31 logDebug("Initializing cellular");
miaotwilio 0:b32fa0c757d7 32 MTSCellularManager cellularManager("wireless.twilio.com");
miaotwilio 0:b32fa0c757d7 33 if (! cellularManager.init()) {
miaotwilio 0:b32fa0c757d7 34 while (true) {
miaotwilio 0:b32fa0c757d7 35 logError("failed to initialize cellular radio");
miaotwilio 0:b32fa0c757d7 36 wait(1);
miaotwilio 0:b32fa0c757d7 37 }
miaotwilio 0:b32fa0c757d7 38 }
miaotwilio 0:b32fa0c757d7 39
miaotwilio 0:b32fa0c757d7 40 logDebug("Initializing CyaSSL");
miaotwilio 0:b32fa0c757d7 41 CyaSSL_Init();
miaotwilio 0:b32fa0c757d7 42
miaotwilio 0:b32fa0c757d7 43 logDebug("Connecting MQTT Client");
miaotwilio 0:b32fa0c757d7 44 TlsMQTTClient client = TlsMQTTClient();
miaotwilio 0:b32fa0c757d7 45 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
miaotwilio 0:b32fa0c757d7 46 data.MQTTVersion = 3;
miaotwilio 0:b32fa0c757d7 47 // Account: AC79339963a99f476e6f0b3214abd48a9d
miaotwilio 0:b32fa0c757d7 48 // Fleet: FL1a84e19cd6014020b7a26a6f89521d4f
miaotwilio 0:b32fa0c757d7 49 // Deployment: DL1daae5d60c5941aea5cd8cf2b693e990
miaotwilio 0:b32fa0c757d7 50 // Sync List: https://preview.twilio.com/Sync/Services/IS1a84e19cd6014020b7a26a6f89521d4f/Lists/
miaotwilio 0:b32fa0c757d7 51 // Device: TH6008344511ed4286b249c3d21891b5ae
miaotwilio 0:b32fa0c757d7 52 data.clientID.cstring = "dragonfly-mqtt";
miaotwilio 0:b32fa0c757d7 53 data.username.cstring = "KY977b46cdd67645b494da001ced07e40f";
miaotwilio 0:b32fa0c757d7 54 data.password.cstring = "RteF2I/fwCjmmdIOoe32qw";
miaotwilio 0:b32fa0c757d7 55 if (MQTT::SUCCESS == client.connect("mqtt-sync.us1.twilio.com", 8883, NULL /*MQTT_GATEWAY_PROD_ROOT_CA_PEM*/, data)) {
miaotwilio 0:b32fa0c757d7 56 int rc;
miaotwilio 0:b32fa0c757d7 57 MQTT::Message message;
miaotwilio 0:b32fa0c757d7 58 char buf[512];
miaotwilio 0:b32fa0c757d7 59
miaotwilio 0:b32fa0c757d7 60 logDebug("MQTT connected");
miaotwilio 0:b32fa0c757d7 61
miaotwilio 0:b32fa0c757d7 62 // QoS 1 list item
miaotwilio 0:b32fa0c757d7 63 sprintf(buf, "{\"test\": 42}");
miaotwilio 0:b32fa0c757d7 64 message.qos = MQTT::QOS1;
miaotwilio 0:b32fa0c757d7 65 message.payload = (void*)buf;
miaotwilio 0:b32fa0c757d7 66 message.payloadlen = strlen(buf) + 1;
miaotwilio 0:b32fa0c757d7 67 rc = client.publish("sync/lists/test", message);
miaotwilio 0:b32fa0c757d7 68 logDebug("MQTT message publish result: %d", rc);
miaotwilio 0:b32fa0c757d7 69
miaotwilio 0:b32fa0c757d7 70 rc = client.subscribe("sync/lists/test2", MQTT::QOS1, test2Handler);
miaotwilio 0:b32fa0c757d7 71 logDebug("MQTT subscription result: %d", rc);
miaotwilio 0:b32fa0c757d7 72
miaotwilio 0:b32fa0c757d7 73 while (!exitCmd) {
miaotwilio 0:b32fa0c757d7 74 client.yield(); // keep alive aconnection
miaotwilio 0:b32fa0c757d7 75 }
miaotwilio 0:b32fa0c757d7 76
miaotwilio 0:b32fa0c757d7 77 logDebug("MQTT disconnecting");
miaotwilio 0:b32fa0c757d7 78 client.disconnect();
miaotwilio 0:b32fa0c757d7 79 }
miaotwilio 0:b32fa0c757d7 80
miaotwilio 0:b32fa0c757d7 81 logDebug("Cleaning up CyaSSL");
miaotwilio 0:b32fa0c757d7 82 CyaSSL_Cleanup();
miaotwilio 0:b32fa0c757d7 83
miaotwilio 0:b32fa0c757d7 84 logDebug("Shutting down cellular");
miaotwilio 0:b32fa0c757d7 85 cellularManager.uninit();
miaotwilio 0:b32fa0c757d7 86
miaotwilio 0:b32fa0c757d7 87 logDebug("Program finished");
miaotwilio 0:b32fa0c757d7 88 wait(1E12);
miaotwilio 0:b32fa0c757d7 89 return 0;
miaotwilio 0:b32fa0c757d7 90 }
miaotwilio 0:b32fa0c757d7 91
miaotwilio 0:b32fa0c757d7 92 static void test2Handler(MQTT::MessageData& data) {
miaotwilio 0:b32fa0c757d7 93 static const size_t MAX_DISPLAY_MESSAGE_SIZE = 30;
miaotwilio 0:b32fa0c757d7 94 char buf[MAX_DISPLAY_MESSAGE_SIZE + 1];
miaotwilio 0:b32fa0c757d7 95 if (data.message.payloadlen <= MAX_DISPLAY_MESSAGE_SIZE) {
miaotwilio 0:b32fa0c757d7 96 strncpy(buf, (char*)data.message.payload, data.message.payloadlen);
miaotwilio 0:b32fa0c757d7 97 buf[data.message.payloadlen] = '\0';
miaotwilio 0:b32fa0c757d7 98 } else {
miaotwilio 0:b32fa0c757d7 99 strncpy(buf, (char*)data.message.payload, MAX_DISPLAY_MESSAGE_SIZE - 3);
miaotwilio 0:b32fa0c757d7 100 buf[MAX_DISPLAY_MESSAGE_SIZE-3] = '.';
miaotwilio 0:b32fa0c757d7 101 buf[MAX_DISPLAY_MESSAGE_SIZE-2] = '.';
miaotwilio 0:b32fa0c757d7 102 buf[MAX_DISPLAY_MESSAGE_SIZE-1] = '.';
miaotwilio 0:b32fa0c757d7 103 buf[MAX_DISPLAY_MESSAGE_SIZE] = '\0';
miaotwilio 0:b32fa0c757d7 104 }
miaotwilio 0:b32fa0c757d7 105 logDebug("topic %s payload received len %d data %s", data.topicName.lenstring.data, data.message.payloadlen, buf);
miaotwilio 0:b32fa0c757d7 106
miaotwilio 0:b32fa0c757d7 107 // sync client can send binary data using payload format:
miaotwilio 0:b32fa0c757d7 108 // {
miaotwilio 0:b32fa0c757d7 109 // "payload": "ZXhpdA==", # base64 encoded "exit"
miaotwilio 0:b32fa0c757d7 110 // "_iot_meta": {
miaotwilio 0:b32fa0c757d7 111 // "payload_encoding": "base64",
miaotwilio 0:b32fa0c757d7 112 // "payload_type": "application/octet-stream",
miaotwilio 0:b32fa0c757d7 113 // }
miaotwilio 0:b32fa0c757d7 114 // }
miaotwilio 0:b32fa0c757d7 115 if (0 == strncmp((char*)data.message.payload, "exit", data.message.payloadlen)) {
miaotwilio 0:b32fa0c757d7 116 exitCmd = true;
miaotwilio 0:b32fa0c757d7 117 }
miaotwilio 0:b32fa0c757d7 118 }