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
TlsMQTTClient.hpp@10:e9abab84df23, 2017-09-19 (annotated)
- Committer:
- pkamp
- Date:
- Tue Sep 19 21:45:19 2017 +0000
- Revision:
- 10:e9abab84df23
- Parent:
- 9:2d119fbe7482
Adding publishing
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pkamp | 9:2d119fbe7482 | 1 | #pragma once |
miaotwilio | 2:d4dcf1ebaa99 | 2 | |
miaotwilio | 0:b32fa0c757d7 | 3 | #include <ssl.h> |
miaotwilio | 0:b32fa0c757d7 | 4 | #include <mbed.h> |
miaotwilio | 0:b32fa0c757d7 | 5 | #include <mtsas.h> |
miaotwilio | 0:b32fa0c757d7 | 6 | #include <TCPSocketConnection.h> |
miaotwilio | 0:b32fa0c757d7 | 7 | #include <MQTTClient.h> |
miaotwilio | 0:b32fa0c757d7 | 8 | #include <MQTTmbed.h> |
miaotwilio | 0:b32fa0c757d7 | 9 | |
miaotwilio | 0:b32fa0c757d7 | 10 | class TlsMQTTClient { |
miaotwilio | 0:b32fa0c757d7 | 11 | public: |
miaotwilio | 0:b32fa0c757d7 | 12 | TlsMQTTClient(); |
miaotwilio | 0:b32fa0c757d7 | 13 | ~TlsMQTTClient(); |
miaotwilio | 0:b32fa0c757d7 | 14 | |
miaotwilio | 0:b32fa0c757d7 | 15 | private: |
pkamp | 9:2d119fbe7482 | 16 | typedef MQTT::Client< |
pkamp | 9:2d119fbe7482 | 17 | TlsMQTTClient, |
pkamp | 9:2d119fbe7482 | 18 | Countdown, |
pkamp | 9:2d119fbe7482 | 19 | 1024 /* MAX_MQTT_PACKET_SIZE */ |
pkamp | 9:2d119fbe7482 | 20 | > MQTTClient; |
miaotwilio | 0:b32fa0c757d7 | 21 | |
miaotwilio | 0:b32fa0c757d7 | 22 | // MQTT Operations |
miaotwilio | 0:b32fa0c757d7 | 23 | public: |
miaotwilio | 0:b32fa0c757d7 | 24 | /** MQTT Connect - send an MQTT connect packet down the network and wait for a Connack |
miaotwilio | 0:b32fa0c757d7 | 25 | * The nework object must be connected to the network endpoint before calling this |
miaotwilio | 0:b32fa0c757d7 | 26 | * @param host - host of the mqtt server |
miaotwilio | 0:b32fa0c757d7 | 27 | * @param port - port of the mqtt server |
miaotwilio | 0:b32fa0c757d7 | 28 | * @param certificates - CA certs to be verified, can be NULL to bypass CA checking(not recommended) |
miaotwilio | 0:b32fa0c757d7 | 29 | * @param options - connect options |
miaotwilio | 0:b32fa0c757d7 | 30 | * @return success code - |
miaotwilio | 0:b32fa0c757d7 | 31 | */ |
pkamp | 9:2d119fbe7482 | 32 | int connect( |
pkamp | 9:2d119fbe7482 | 33 | const char* host, |
pkamp | 9:2d119fbe7482 | 34 | const int port, |
miaotwilio | 0:b32fa0c757d7 | 35 | const char* certificates, |
pkamp | 9:2d119fbe7482 | 36 | MQTTPacket_connectData& options |
pkamp | 9:2d119fbe7482 | 37 | ); |
miaotwilio | 0:b32fa0c757d7 | 38 | |
miaotwilio | 0:b32fa0c757d7 | 39 | /** MQTT Publish - send an MQTT publish packet and wait for all acks to complete for all QoSs |
miaotwilio | 0:b32fa0c757d7 | 40 | * @param topic - the topic to publish to |
miaotwilio | 0:b32fa0c757d7 | 41 | * @param message - the message to send |
miaotwilio | 0:b32fa0c757d7 | 42 | * @return success code - |
miaotwilio | 0:b32fa0c757d7 | 43 | */ |
pkamp | 9:2d119fbe7482 | 44 | int publish( |
pkamp | 9:2d119fbe7482 | 45 | const char* topicName, |
pkamp | 9:2d119fbe7482 | 46 | MQTT::Message& message |
pkamp | 9:2d119fbe7482 | 47 | ); |
miaotwilio | 0:b32fa0c757d7 | 48 | |
miaotwilio | 0:b32fa0c757d7 | 49 | /** MQTT Publish - send an MQTT publish packet and wait for all acks to complete for all QoSs |
miaotwilio | 0:b32fa0c757d7 | 50 | * @param topic - the topic to publish to |
miaotwilio | 0:b32fa0c757d7 | 51 | * @param payload - the data to send |
miaotwilio | 0:b32fa0c757d7 | 52 | * @param payloadlen - the length of the data |
miaotwilio | 0:b32fa0c757d7 | 53 | * @param qos - the QoS to send the publish at |
miaotwilio | 0:b32fa0c757d7 | 54 | * @param retained - whether the message should be retained |
miaotwilio | 0:b32fa0c757d7 | 55 | * @return success code - |
miaotwilio | 0:b32fa0c757d7 | 56 | */ |
pkamp | 9:2d119fbe7482 | 57 | int publish( |
pkamp | 9:2d119fbe7482 | 58 | const char* topicName, |
pkamp | 9:2d119fbe7482 | 59 | void* payload, |
pkamp | 9:2d119fbe7482 | 60 | size_t payloadlen, |
pkamp | 9:2d119fbe7482 | 61 | enum MQTT::QoS qos = MQTT::QOS0, |
pkamp | 9:2d119fbe7482 | 62 | bool retained = false |
pkamp | 9:2d119fbe7482 | 63 | ); |
miaotwilio | 0:b32fa0c757d7 | 64 | |
miaotwilio | 0:b32fa0c757d7 | 65 | /** MQTT Publish - send an MQTT publish packet and wait for all acks to complete for all QoSs |
miaotwilio | 0:b32fa0c757d7 | 66 | * @param topic - the topic to publish to |
miaotwilio | 0:b32fa0c757d7 | 67 | * @param payload - the data to send |
miaotwilio | 0:b32fa0c757d7 | 68 | * @param payloadlen - the length of the data |
miaotwilio | 0:b32fa0c757d7 | 69 | * @param id - the packet id used - returned |
miaotwilio | 0:b32fa0c757d7 | 70 | * @param qos - the QoS to send the publish at |
miaotwilio | 0:b32fa0c757d7 | 71 | * @param retained - whether the message should be retained |
miaotwilio | 0:b32fa0c757d7 | 72 | * @return success code - |
miaotwilio | 0:b32fa0c757d7 | 73 | */ |
pkamp | 9:2d119fbe7482 | 74 | int publish( |
pkamp | 9:2d119fbe7482 | 75 | const char* topicName, |
pkamp | 9:2d119fbe7482 | 76 | void* payload, |
pkamp | 9:2d119fbe7482 | 77 | size_t payloadlen, |
pkamp | 9:2d119fbe7482 | 78 | unsigned short& id, |
pkamp | 9:2d119fbe7482 | 79 | enum MQTT::QoS qos = MQTT::QOS1, |
pkamp | 9:2d119fbe7482 | 80 | bool retained = false |
pkamp | 9:2d119fbe7482 | 81 | ); |
miaotwilio | 0:b32fa0c757d7 | 82 | |
miaotwilio | 0:b32fa0c757d7 | 83 | typedef void (*MessageHandler)(MQTT::MessageData&); |
miaotwilio | 0:b32fa0c757d7 | 84 | |
miaotwilio | 0:b32fa0c757d7 | 85 | /** MQTT Subscribe - send an MQTT subscribe packet and wait for the suback |
miaotwilio | 0:b32fa0c757d7 | 86 | * @param topicFilter - a topic pattern which can include wildcards |
miaotwilio | 0:b32fa0c757d7 | 87 | * @param qos - the MQTT QoS to subscribe at |
miaotwilio | 0:b32fa0c757d7 | 88 | * @param mh - the callback function to be invoked when a message is received for this subscription |
miaotwilio | 0:b32fa0c757d7 | 89 | * @return success code - |
miaotwilio | 0:b32fa0c757d7 | 90 | */ |
pkamp | 9:2d119fbe7482 | 91 | int subscribe( |
pkamp | 9:2d119fbe7482 | 92 | const char* topicFilter, |
pkamp | 9:2d119fbe7482 | 93 | enum MQTT::QoS qos, |
pkamp | 9:2d119fbe7482 | 94 | MessageHandler mh |
pkamp | 9:2d119fbe7482 | 95 | ); |
miaotwilio | 0:b32fa0c757d7 | 96 | |
miaotwilio | 0:b32fa0c757d7 | 97 | /** MQTT Unsubscribe - send an MQTT unsubscribe packet and wait for the unsuback |
miaotwilio | 0:b32fa0c757d7 | 98 | * @param topicFilter - a topic pattern which can include wildcards |
miaotwilio | 0:b32fa0c757d7 | 99 | * @return success code - |
miaotwilio | 0:b32fa0c757d7 | 100 | */ |
miaotwilio | 0:b32fa0c757d7 | 101 | int unsubscribe(const char* topicFilter); |
miaotwilio | 0:b32fa0c757d7 | 102 | |
miaotwilio | 0:b32fa0c757d7 | 103 | /** MQTT Disconnect - send an MQTT disconnect packet, and clean up any state |
miaotwilio | 0:b32fa0c757d7 | 104 | * @return success code - |
miaotwilio | 0:b32fa0c757d7 | 105 | */ |
miaotwilio | 0:b32fa0c757d7 | 106 | int disconnect(); |
miaotwilio | 0:b32fa0c757d7 | 107 | |
miaotwilio | 0:b32fa0c757d7 | 108 | /** A call to this API must be made within the keepAlive interval to keep the MQTT connection alive |
miaotwilio | 0:b32fa0c757d7 | 109 | * yield can be called if no other MQTT operation is needed. This will also allow messages to be |
miaotwilio | 0:b32fa0c757d7 | 110 | * received. |
miaotwilio | 0:b32fa0c757d7 | 111 | * @param timeout_ms the time to wait, in milliseconds |
miaotwilio | 0:b32fa0c757d7 | 112 | * @return success code - on failure, this means the client has disconnected |
miaotwilio | 0:b32fa0c757d7 | 113 | */ |
miaotwilio | 0:b32fa0c757d7 | 114 | int yield(unsigned long timeout_ms = 1000L); |
miaotwilio | 0:b32fa0c757d7 | 115 | |
miaotwilio | 0:b32fa0c757d7 | 116 | /** Is the client connected? |
miaotwilio | 0:b32fa0c757d7 | 117 | * @return flag - is the client connected or not? |
miaotwilio | 0:b32fa0c757d7 | 118 | */ |
miaotwilio | 0:b32fa0c757d7 | 119 | bool isConnected(); |
miaotwilio | 0:b32fa0c757d7 | 120 | |
miaotwilio | 0:b32fa0c757d7 | 121 | // Network interface for MQTT::Client |
miaotwilio | 0:b32fa0c757d7 | 122 | int read(unsigned char* data, int max, int timeout = -1); |
miaotwilio | 0:b32fa0c757d7 | 123 | int write(const unsigned char* data, int length, int timeout = -1); |
miaotwilio | 0:b32fa0c757d7 | 124 | |
miaotwilio | 0:b32fa0c757d7 | 125 | private: |
miaotwilio | 0:b32fa0c757d7 | 126 | void cleanupTransport(); |
miaotwilio | 0:b32fa0c757d7 | 127 | static int ioRecv(CYASSL* ssl, char *buf, int sz, void *ctx); |
miaotwilio | 0:b32fa0c757d7 | 128 | static int ioSend(CYASSL* ssl, char *buf, int sz, void *ctx); |
miaotwilio | 0:b32fa0c757d7 | 129 | TCPSocketConnection* tcp; |
miaotwilio | 0:b32fa0c757d7 | 130 | CYASSL_CTX* ctx; |
miaotwilio | 0:b32fa0c757d7 | 131 | CYASSL *ssl; |
miaotwilio | 1:5a896191c3c4 | 132 | MQTTClient* mqttClient; |
miaotwilio | 0:b32fa0c757d7 | 133 | }; |