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
main.cpp@2:d4dcf1ebaa99, 2017-05-19 (annotated)
- 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?
User | Revision | Line number | New 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 | }*/ |