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:
Fri May 19 12:42:57 2017 +0000
Revision:
2:d4dcf1ebaa99
Parent:
1:5a896191c3c4
Child:
3:0a48c984e15b
separate config.hpp out

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 2:d4dcf1ebaa99 4 #include "config.hpp"
miaotwilio 0:b32fa0c757d7 5 #include <mbed.h>
miaotwilio 0:b32fa0c757d7 6 #include <mtsas.h>
miaotwilio 0:b32fa0c757d7 7 #include <ssl.h>
miaotwilio 0:b32fa0c757d7 8
miaotwilio 0:b32fa0c757d7 9 // This line controls the regulator's battery charger.
miaotwilio 0:b32fa0c757d7 10 // BC_NCE = 0 enables the battery charger
miaotwilio 0:b32fa0c757d7 11 // BC_NCE = 1 disables the battery charger
miaotwilio 0:b32fa0c757d7 12 DigitalOut bc_nce(PB_2);
miaotwilio 1:5a896191c3c4 13 DigitalOut ledMQTTYield(D5);
miaotwilio 1:5a896191c3c4 14 DigitalOut ledGPS(D8);
miaotwilio 1:5a896191c3c4 15
miaotwilio 1:5a896191c3c4 16 static const int VEHICLE_DATA_POLLING_PERIOD_MS = 5000;
miaotwilio 0:b32fa0c757d7 17
miaotwilio 0:b32fa0c757d7 18 static bool exitCmd = false;
miaotwilio 0:b32fa0c757d7 19
miaotwilio 1:5a896191c3c4 20 static void sendVehicleData(MTSCellularManager::GPSStatus& gpsStatus);
miaotwilio 0:b32fa0c757d7 21 static void test2Handler(MQTT::MessageData& data);
miaotwilio 0:b32fa0c757d7 22
miaotwilio 0:b32fa0c757d7 23 int main() {
miaotwilio 0:b32fa0c757d7 24 // Disable the battery charger unless a battery is attached.
miaotwilio 0:b32fa0c757d7 25 bc_nce = 1;
miaotwilio 1:5a896191c3c4 26
miaotwilio 1:5a896191c3c4 27 ledMQTTYield = 1;
miaotwilio 1:5a896191c3c4 28 ledGPS = 1;
miaotwilio 0:b32fa0c757d7 29
miaotwilio 0:b32fa0c757d7 30 // Change the baud rate of the debug port from the default 9600 to 115200.
miaotwilio 0:b32fa0c757d7 31 Serial debug(USBTX, USBRX);
miaotwilio 0:b32fa0c757d7 32 debug.baud(115200);
miaotwilio 0:b32fa0c757d7 33
miaotwilio 0:b32fa0c757d7 34 //Sets the log level to INFO, higher log levels produce more log output.
miaotwilio 0:b32fa0c757d7 35 //Possible levels: NONE, FATAL, ERROR, WARNING, INFO, DEBUG, TRACE
miaotwilio 0:b32fa0c757d7 36 mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL);
miaotwilio 0:b32fa0c757d7 37
miaotwilio 1:5a896191c3c4 38 logInfo("Program started");
miaotwilio 1:5a896191c3c4 39
miaotwilio 1:5a896191c3c4 40 logInfo("Initializing cellular");
miaotwilio 0:b32fa0c757d7 41 MTSCellularManager cellularManager("wireless.twilio.com");
miaotwilio 0:b32fa0c757d7 42 if (! cellularManager.init()) {
miaotwilio 0:b32fa0c757d7 43 while (true) {
miaotwilio 0:b32fa0c757d7 44 logError("failed to initialize cellular radio");
miaotwilio 0:b32fa0c757d7 45 wait(1);
miaotwilio 0:b32fa0c757d7 46 }
miaotwilio 0:b32fa0c757d7 47 }
miaotwilio 0:b32fa0c757d7 48
miaotwilio 1:5a896191c3c4 49 {
miaotwilio 1:5a896191c3c4 50 logInfo("Initializing GPS");
miaotwilio 1:5a896191c3c4 51 cellularManager.enableGps();
miaotwilio 1:5a896191c3c4 52 logInfo("GPS Initialized");
miaotwilio 1:5a896191c3c4 53 }
miaotwilio 1:5a896191c3c4 54
miaotwilio 1:5a896191c3c4 55 logInfo("Initializing CyaSSL");
miaotwilio 0:b32fa0c757d7 56 CyaSSL_Init();
miaotwilio 0:b32fa0c757d7 57
miaotwilio 1:5a896191c3c4 58 while (!exitCmd) {
miaotwilio 1:5a896191c3c4 59 MTSCellularManager::GPSStatus gpsStatus = cellularManager.gpsPollStatus();
miaotwilio 1:5a896191c3c4 60 if (gpsStatus.success) {
miaotwilio 1:5a896191c3c4 61 ledGPS = 0;
miaotwilio 1:5a896191c3c4 62 sendVehicleData(gpsStatus);
miaotwilio 1:5a896191c3c4 63 } else {
miaotwilio 1:5a896191c3c4 64 ledGPS = 1;
miaotwilio 1:5a896191c3c4 65 }
miaotwilio 1:5a896191c3c4 66 wait_ms(VEHICLE_DATA_POLLING_PERIOD_MS);
miaotwilio 1:5a896191c3c4 67 }
miaotwilio 1:5a896191c3c4 68
miaotwilio 1:5a896191c3c4 69 logInfo("Cleaning up CyaSSL");
miaotwilio 1:5a896191c3c4 70 CyaSSL_Cleanup();
miaotwilio 1:5a896191c3c4 71
miaotwilio 1:5a896191c3c4 72 logInfo("Shutting down cellular");
miaotwilio 1:5a896191c3c4 73 cellularManager.uninit();
miaotwilio 1:5a896191c3c4 74
miaotwilio 1:5a896191c3c4 75 logInfo("Program finished");
miaotwilio 1:5a896191c3c4 76 wait(1E12);
miaotwilio 1:5a896191c3c4 77 return 0;
miaotwilio 1:5a896191c3c4 78 }
miaotwilio 1:5a896191c3c4 79
miaotwilio 1:5a896191c3c4 80 static void sendVehicleData(MTSCellularManager::GPSStatus& gpsStatus) {
miaotwilio 1:5a896191c3c4 81 ledMQTTYield = 0;
miaotwilio 1:5a896191c3c4 82
miaotwilio 1:5a896191c3c4 83 logInfo("Connecting MQTT Client");
miaotwilio 0:b32fa0c757d7 84 TlsMQTTClient client = TlsMQTTClient();
miaotwilio 0:b32fa0c757d7 85 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
miaotwilio 2:d4dcf1ebaa99 86 data.clientID.cstring = VEHICLE_ID;
miaotwilio 2:d4dcf1ebaa99 87 data.username.cstring = VEHICLE_KEY;
miaotwilio 2:d4dcf1ebaa99 88 data.password.cstring = VEHICLE_SECRET;
miaotwilio 2:d4dcf1ebaa99 89 if (MQTT::SUCCESS == client.connect(MQTT_GATEWAY_HOST, MQTT_GATEWAY_PORT, NULL /*MQTT_GATEWAY_PROD_ROOT_CA_PEM*/, data)) {
miaotwilio 0:b32fa0c757d7 90 MQTT::Message message;
miaotwilio 0:b32fa0c757d7 91 char buf[512];
miaotwilio 0:b32fa0c757d7 92
miaotwilio 1:5a896191c3c4 93 logInfo("MQTT connected");
miaotwilio 0:b32fa0c757d7 94
miaotwilio 1:5a896191c3c4 95 sprintf(buf, "{"
miaotwilio 1:5a896191c3c4 96 "\"driver_id\": 1,"
miaotwilio 1:5a896191c3c4 97 "\"runtime\": 10,"
miaotwilio 1:5a896191c3c4 98 "\"miles\": 10,"
miaotwilio 1:5a896191c3c4 99 "\"speed\": %f,"
miaotwilio 1:5a896191c3c4 100 "\"minT\": 40,"
miaotwilio 1:5a896191c3c4 101 "\"maxT\": 60,"
miaotwilio 1:5a896191c3c4 102 "\"avgT\": 50,"
miaotwilio 1:5a896191c3c4 103 "\"fuel\": 50,"
miaotwilio 1:5a896191c3c4 104 "\"brake\": 0,"
miaotwilio 1:5a896191c3c4 105 "\"lat\": %lf,"
miaotwilio 1:5a896191c3c4 106 "\"lon\": %lf"
miaotwilio 1:5a896191c3c4 107 "}",
miaotwilio 1:5a896191c3c4 108 gpsStatus.speedVal,
miaotwilio 1:5a896191c3c4 109 gpsStatus.latitudeVal,
miaotwilio 1:5a896191c3c4 110 gpsStatus.longitudeVal);
miaotwilio 0:b32fa0c757d7 111 message.qos = MQTT::QOS1;
miaotwilio 0:b32fa0c757d7 112 message.payload = (void*)buf;
miaotwilio 0:b32fa0c757d7 113 message.payloadlen = strlen(buf) + 1;
miaotwilio 1:5a896191c3c4 114 logInfo("MQTT message publishing buf: %s", buf);
miaotwilio 2:d4dcf1ebaa99 115 int rc = client.publish("sync/lists/vehicle-" VEHICLE_ID "-data", message);
miaotwilio 1:5a896191c3c4 116 logInfo("MQTT message publish result: %d", rc);
miaotwilio 0:b32fa0c757d7 117
miaotwilio 1:5a896191c3c4 118 logInfo("MQTT disconnecting");
miaotwilio 0:b32fa0c757d7 119 client.disconnect();
miaotwilio 0:b32fa0c757d7 120 }
miaotwilio 1:5a896191c3c4 121 ledMQTTYield = 1;
miaotwilio 1:5a896191c3c4 122 }
miaotwilio 0:b32fa0c757d7 123
miaotwilio 1:5a896191c3c4 124 /*
miaotwilio 1:5a896191c3c4 125 static void subscribeToTest2() {
miaotwilio 1:5a896191c3c4 126 rc = client.subscribe("sync/lists/test2", MQTT::QOS1, test2Handler);
miaotwilio 1:5a896191c3c4 127 logInfo("MQTT subscription result: %d", rc);
miaotwilio 0:b32fa0c757d7 128 }
miaotwilio 0:b32fa0c757d7 129
miaotwilio 0:b32fa0c757d7 130 static void test2Handler(MQTT::MessageData& data) {
miaotwilio 0:b32fa0c757d7 131 static const size_t MAX_DISPLAY_MESSAGE_SIZE = 30;
miaotwilio 0:b32fa0c757d7 132 char buf[MAX_DISPLAY_MESSAGE_SIZE + 1];
miaotwilio 0:b32fa0c757d7 133 if (data.message.payloadlen <= MAX_DISPLAY_MESSAGE_SIZE) {
miaotwilio 0:b32fa0c757d7 134 strncpy(buf, (char*)data.message.payload, data.message.payloadlen);
miaotwilio 0:b32fa0c757d7 135 buf[data.message.payloadlen] = '\0';
miaotwilio 0:b32fa0c757d7 136 } else {
miaotwilio 0:b32fa0c757d7 137 strncpy(buf, (char*)data.message.payload, MAX_DISPLAY_MESSAGE_SIZE - 3);
miaotwilio 0:b32fa0c757d7 138 buf[MAX_DISPLAY_MESSAGE_SIZE-3] = '.';
miaotwilio 0:b32fa0c757d7 139 buf[MAX_DISPLAY_MESSAGE_SIZE-2] = '.';
miaotwilio 0:b32fa0c757d7 140 buf[MAX_DISPLAY_MESSAGE_SIZE-1] = '.';
miaotwilio 0:b32fa0c757d7 141 buf[MAX_DISPLAY_MESSAGE_SIZE] = '\0';
miaotwilio 0:b32fa0c757d7 142 }
miaotwilio 0:b32fa0c757d7 143 logDebug("topic %s payload received len %d data %s", data.topicName.lenstring.data, data.message.payloadlen, buf);
miaotwilio 0:b32fa0c757d7 144
miaotwilio 0:b32fa0c757d7 145 // sync client can send binary data using payload format:
miaotwilio 0:b32fa0c757d7 146 // {
miaotwilio 0:b32fa0c757d7 147 // "payload": "ZXhpdA==", # base64 encoded "exit"
miaotwilio 0:b32fa0c757d7 148 // "_iot_meta": {
miaotwilio 0:b32fa0c757d7 149 // "payload_encoding": "base64",
miaotwilio 0:b32fa0c757d7 150 // "payload_type": "application/octet-stream",
miaotwilio 0:b32fa0c757d7 151 // }
miaotwilio 0:b32fa0c757d7 152 // }
miaotwilio 0:b32fa0c757d7 153 if (0 == strncmp((char*)data.message.payload, "exit", data.message.payloadlen)) {
miaotwilio 0:b32fa0c757d7 154 exitCmd = true;
miaotwilio 0:b32fa0c757d7 155 }
miaotwilio 1:5a896191c3c4 156 }*/