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@0:b32fa0c757d7, 2017-05-09 (annotated)
- 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?
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 | 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 | } |