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@9:2d119fbe7482, 2017-09-15 (annotated)
- Committer:
- pkamp
- Date:
- Fri Sep 15 22:41:22 2017 +0000
- Revision:
- 9:2d119fbe7482
- Parent:
- 8:f8a346582627
- Child:
- 10:e9abab84df23
Initial commit, blink an LED
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
miaotwilio | 0:b32fa0c757d7 | 1 | #include <mbed.h> |
miaotwilio | 0:b32fa0c757d7 | 2 | #include <mtsas.h> |
miaotwilio | 0:b32fa0c757d7 | 3 | #include <ssl.h> |
pkamp | 9:2d119fbe7482 | 4 | #include <MbedJSONValue.h> |
pkamp | 9:2d119fbe7482 | 5 | #include <string> |
pkamp | 9:2d119fbe7482 | 6 | #include "MTSCellularManager.hpp" |
pkamp | 9:2d119fbe7482 | 7 | #include "TlsMQTTClient.hpp" |
pkamp | 9:2d119fbe7482 | 8 | #include "certificates.hpp" |
miaotwilio | 5:ded8fe5991a2 | 9 | |
pkamp | 9:2d119fbe7482 | 10 | /* |
pkamp | 9:2d119fbe7482 | 11 | * Sync Settings |
pkamp | 9:2d119fbe7482 | 12 | * |
pkamp | 9:2d119fbe7482 | 13 | * Enter a Sync Key & Password, your document unique name, |
pkamp | 9:2d119fbe7482 | 14 | * and the device name |
pkamp | 9:2d119fbe7482 | 15 | */ |
pkamp | 9:2d119fbe7482 | 16 | char* sync_key = "KYXXXXXXXXXXXXXXXXXXXX"; |
pkamp | 9:2d119fbe7482 | 17 | char* sync_password = "SECRET_HERE"; |
pkamp | 9:2d119fbe7482 | 18 | char* sync_document = "sync/docs/BoardLED"; |
pkamp | 9:2d119fbe7482 | 19 | char* sync_device_name = "MST Dragonfly"; |
pkamp | 9:2d119fbe7482 | 20 | |
pkamp | 9:2d119fbe7482 | 21 | /* Sync server and MQTT setup; you probably don't have to change these. */ |
pkamp | 9:2d119fbe7482 | 22 | const char* mqtt_server = "mqtt-sync.us1.twilio.com"; |
pkamp | 9:2d119fbe7482 | 23 | const uint16_t mqtt_port = 8883; |
pkamp | 9:2d119fbe7482 | 24 | const uint16_t maxMQTTpackageSize = 512; |
pkamp | 9:2d119fbe7482 | 25 | |
pkamp | 9:2d119fbe7482 | 26 | TlsMQTTClient client = TlsMQTTClient(); |
pkamp | 9:2d119fbe7482 | 27 | DigitalOut led(D7); |
pkamp | 9:2d119fbe7482 | 28 | DigitalOut bc_nce(PB_2); |
pkamp | 9:2d119fbe7482 | 29 | const uint8_t MQTT_HEARTBEAT = 15; |
miaotwilio | 1:5a896191c3c4 | 30 | |
pkamp | 9:2d119fbe7482 | 31 | /* |
pkamp | 9:2d119fbe7482 | 32 | * Our Twilio Connected Devices message handling callback. This is passed as a |
pkamp | 9:2d119fbe7482 | 33 | * callback function when we subscribe to the document, and any messages will |
pkamp | 9:2d119fbe7482 | 34 | * appear here. |
pkamp | 9:2d119fbe7482 | 35 | */ |
pkamp | 9:2d119fbe7482 | 36 | void callback(MQTT::MessageData& data) |
pkamp | 9:2d119fbe7482 | 37 | { |
pkamp | 9:2d119fbe7482 | 38 | if (data.message.payloadlen > maxMQTTpackageSize) { |
pkamp | 9:2d119fbe7482 | 39 | return; |
pkamp | 9:2d119fbe7482 | 40 | } |
pkamp | 9:2d119fbe7482 | 41 | char buf[maxMQTTpackageSize + 1]; |
pkamp | 9:2d119fbe7482 | 42 | strncpy(buf, (char*)data.message.payload, data.message.payloadlen); |
pkamp | 9:2d119fbe7482 | 43 | buf[data.message.payloadlen] = '\0'; |
pkamp | 9:2d119fbe7482 | 44 | |
pkamp | 9:2d119fbe7482 | 45 | logDebug("Received new update %s", buf); |
pkamp | 9:2d119fbe7482 | 46 | /* JSON Parse 'led' */ |
pkamp | 9:2d119fbe7482 | 47 | MbedJSONValue parser; |
pkamp | 9:2d119fbe7482 | 48 | parse(parser, buf); |
pkamp | 9:2d119fbe7482 | 49 | |
pkamp | 9:2d119fbe7482 | 50 | /* The parser will segfault and reset the board if "led" isn't contained. */ |
pkamp | 9:2d119fbe7482 | 51 | if (parser.hasMember("led")) { |
pkamp | 9:2d119fbe7482 | 52 | std::string led_str; |
pkamp | 9:2d119fbe7482 | 53 | led_str = parser["led"][0].get<std::string>(); |
pkamp | 9:2d119fbe7482 | 54 | |
pkamp | 9:2d119fbe7482 | 55 | if (led_str.compare("ON") == 0) { |
pkamp | 9:2d119fbe7482 | 56 | logDebug("Turning LED ON"); |
pkamp | 9:2d119fbe7482 | 57 | led = 0; // Active LOW |
pkamp | 9:2d119fbe7482 | 58 | } else { |
pkamp | 9:2d119fbe7482 | 59 | logDebug("Turning LED OFF"); |
pkamp | 9:2d119fbe7482 | 60 | led = 1; // Active LOW |
pkamp | 9:2d119fbe7482 | 61 | } |
pkamp | 9:2d119fbe7482 | 62 | } |
pkamp | 9:2d119fbe7482 | 63 | } |
miaotwilio | 5:ded8fe5991a2 | 64 | |
miaotwilio | 0:b32fa0c757d7 | 65 | |
pkamp | 9:2d119fbe7482 | 66 | /* |
pkamp | 9:2d119fbe7482 | 67 | * This function connects to Sync via MQTT. We connect using the key, password, |
pkamp | 9:2d119fbe7482 | 68 | * and device name defined as constants above, and checks the server |
pkamp | 9:2d119fbe7482 | 69 | * certificate. |
pkamp | 9:2d119fbe7482 | 70 | * |
pkamp | 9:2d119fbe7482 | 71 | * If everything works, we subscribe to the document topic and return. |
pkamp | 9:2d119fbe7482 | 72 | */ |
pkamp | 9:2d119fbe7482 | 73 | void connect_mqtt() |
pkamp | 9:2d119fbe7482 | 74 | { |
pkamp | 9:2d119fbe7482 | 75 | MQTTPacket_connectData conn_data = MQTTPacket_connectData_initializer; |
pkamp | 9:2d119fbe7482 | 76 | conn_data.clientID.cstring = sync_device_name; |
pkamp | 9:2d119fbe7482 | 77 | conn_data.username.cstring = sync_key; |
pkamp | 9:2d119fbe7482 | 78 | conn_data.password.cstring = sync_password; |
pkamp | 9:2d119fbe7482 | 79 | int rc = client.connect( |
pkamp | 9:2d119fbe7482 | 80 | mqtt_server, |
pkamp | 9:2d119fbe7482 | 81 | mqtt_port, |
pkamp | 9:2d119fbe7482 | 82 | MQTT_GATEWAY_PROD_ROOT_CA_PEM, |
pkamp | 9:2d119fbe7482 | 83 | conn_data |
pkamp | 9:2d119fbe7482 | 84 | ); |
pkamp | 9:2d119fbe7482 | 85 | logInfo("MQTT connect result: %d", rc); |
pkamp | 9:2d119fbe7482 | 86 | |
pkamp | 9:2d119fbe7482 | 87 | rc = client.subscribe( |
pkamp | 9:2d119fbe7482 | 88 | "sync/docs/BoardLED", |
pkamp | 9:2d119fbe7482 | 89 | MQTT::QOS1, |
pkamp | 9:2d119fbe7482 | 90 | callback |
pkamp | 9:2d119fbe7482 | 91 | ); |
pkamp | 9:2d119fbe7482 | 92 | logInfo("MQTT subscription result: %d", rc); |
pkamp | 9:2d119fbe7482 | 93 | } |
miaotwilio | 1:5a896191c3c4 | 94 | |
miaotwilio | 6:4a25f3b9caef | 95 | |
pkamp | 9:2d119fbe7482 | 96 | /* |
pkamp | 9:2d119fbe7482 | 97 | * Very basic device loop - all we do is reconnect when disconnected |
pkamp | 9:2d119fbe7482 | 98 | */ |
pkamp | 9:2d119fbe7482 | 99 | void loop() |
pkamp | 9:2d119fbe7482 | 100 | { |
pkamp | 9:2d119fbe7482 | 101 | if (client.isConnected()) { |
pkamp | 9:2d119fbe7482 | 102 | client.yield(MQTT_HEARTBEAT/2.0); |
pkamp | 9:2d119fbe7482 | 103 | wait(MQTT_HEARTBEAT); |
pkamp | 9:2d119fbe7482 | 104 | } else { |
pkamp | 9:2d119fbe7482 | 105 | wait(MQTT_HEARTBEAT*10); |
pkamp | 9:2d119fbe7482 | 106 | connect_mqtt(); |
pkamp | 9:2d119fbe7482 | 107 | } |
pkamp | 9:2d119fbe7482 | 108 | } |
pkamp | 9:2d119fbe7482 | 109 | |
pkamp | 9:2d119fbe7482 | 110 | |
pkamp | 9:2d119fbe7482 | 111 | /* |
pkamp | 9:2d119fbe7482 | 112 | * In main, we configure our LEDs, connect to Twilio Programmable Wireless, |
pkamp | 9:2d119fbe7482 | 113 | * and initialize CyaSSL. We then connect our MQTT client for the first time. |
pkamp | 9:2d119fbe7482 | 114 | * |
pkamp | 9:2d119fbe7482 | 115 | * When done, we pass control to the MQTT loop, which handles yield()s. |
pkamp | 9:2d119fbe7482 | 116 | */ |
pkamp | 9:2d119fbe7482 | 117 | int main() |
pkamp | 9:2d119fbe7482 | 118 | { |
pkamp | 9:2d119fbe7482 | 119 | led = 1; // Active LOW |
pkamp | 9:2d119fbe7482 | 120 | bc_nce = 1; |
miaotwilio | 0:b32fa0c757d7 | 121 | Serial debug(USBTX, USBRX); |
miaotwilio | 0:b32fa0c757d7 | 122 | debug.baud(115200); |
miaotwilio | 0:b32fa0c757d7 | 123 | mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL); |
miaotwilio | 0:b32fa0c757d7 | 124 | |
pkamp | 9:2d119fbe7482 | 125 | // Be sure your SIM is registered in the Twilio console. |
pkamp | 9:2d119fbe7482 | 126 | // https://www.twilio.com/console/wireless/sims/ |
pkamp | 9:2d119fbe7482 | 127 | logInfo("Initializing Twilio Programmable Wireless"); |
miaotwilio | 0:b32fa0c757d7 | 128 | MTSCellularManager cellularManager("wireless.twilio.com"); |
miaotwilio | 0:b32fa0c757d7 | 129 | if (! cellularManager.init()) { |
miaotwilio | 0:b32fa0c757d7 | 130 | while (true) { |
pkamp | 9:2d119fbe7482 | 131 | logError("failed to initialize cellular radio"); wait(10); |
miaotwilio | 1:5a896191c3c4 | 132 | } |
miaotwilio | 1:5a896191c3c4 | 133 | } |
pkamp | 9:2d119fbe7482 | 134 | CyaSSL_Init(); |
pkamp | 9:2d119fbe7482 | 135 | connect_mqtt(); |
miaotwilio | 0:b32fa0c757d7 | 136 | |
pkamp | 9:2d119fbe7482 | 137 | /* We're done; pass off control to the loop */ |
pkamp | 9:2d119fbe7482 | 138 | while (1) { |
pkamp | 9:2d119fbe7482 | 139 | loop(); |
miaotwilio | 0:b32fa0c757d7 | 140 | } |
pkamp | 9:2d119fbe7482 | 141 | } |