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
Diff: TlsMQTTClient.hpp
- Revision:
- 0:b32fa0c757d7
- Child:
- 1:5a896191c3c4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TlsMQTTClient.hpp Tue May 09 13:16:48 2017 +0000 @@ -0,0 +1,107 @@ +#include <ssl.h> +#include <mbed.h> +#include <mtsas.h> +#include <TCPSocketConnection.h> +#include <MQTTClient.h> +#include <MQTTmbed.h> + +class TlsMQTTClient { +public: + TlsMQTTClient(); + ~TlsMQTTClient(); + +private: + typedef MQTT::Client<TlsMQTTClient, Countdown> MQTTClient; + + // MQTT Operations +public: + /** MQTT Connect - send an MQTT connect packet down the network and wait for a Connack + * The nework object must be connected to the network endpoint before calling this + * @param host - host of the mqtt server + * @param port - port of the mqtt server + * @param certificates - CA certs to be verified, can be NULL to bypass CA checking(not recommended) + * @param options - connect options + * @return success code - + */ + int connect(const char* host, const int port, + const char* certificates, + MQTTPacket_connectData& options); + + /** MQTT Publish - send an MQTT publish packet and wait for all acks to complete for all QoSs + * @param topic - the topic to publish to + * @param message - the message to send + * @return success code - + */ + int publish(const char* topicName, MQTT::Message& message); + + /** MQTT Publish - send an MQTT publish packet and wait for all acks to complete for all QoSs + * @param topic - the topic to publish to + * @param payload - the data to send + * @param payloadlen - the length of the data + * @param qos - the QoS to send the publish at + * @param retained - whether the message should be retained + * @return success code - + */ + int publish(const char* topicName, void* payload, size_t payloadlen, enum MQTT::QoS qos = MQTT::QOS0, bool retained = false); + + /** MQTT Publish - send an MQTT publish packet and wait for all acks to complete for all QoSs + * @param topic - the topic to publish to + * @param payload - the data to send + * @param payloadlen - the length of the data + * @param id - the packet id used - returned + * @param qos - the QoS to send the publish at + * @param retained - whether the message should be retained + * @return success code - + */ + int publish(const char* topicName, void* payload, size_t payloadlen, unsigned short& id, enum MQTT::QoS qos = MQTT::QOS1, bool retained = false); + + typedef void (*MessageHandler)(MQTT::MessageData&); + + /** MQTT Subscribe - send an MQTT subscribe packet and wait for the suback + * @param topicFilter - a topic pattern which can include wildcards + * @param qos - the MQTT QoS to subscribe at + * @param mh - the callback function to be invoked when a message is received for this subscription + * @return success code - + */ + int subscribe(const char* topicFilter, enum MQTT::QoS qos, MessageHandler mh); + + /** MQTT Unsubscribe - send an MQTT unsubscribe packet and wait for the unsuback + * @param topicFilter - a topic pattern which can include wildcards + * @return success code - + */ + int unsubscribe(const char* topicFilter); + + /** MQTT Disconnect - send an MQTT disconnect packet, and clean up any state + * @return success code - + */ + int disconnect(); + + /** A call to this API must be made within the keepAlive interval to keep the MQTT connection alive + * yield can be called if no other MQTT operation is needed. This will also allow messages to be + * received. + * @param timeout_ms the time to wait, in milliseconds + * @return success code - on failure, this means the client has disconnected + */ + int yield(unsigned long timeout_ms = 1000L); + + /** Is the client connected? + * @return flag - is the client connected or not? + */ + bool isConnected(); + + // Network interface for MQTT::Client +public: + int read(unsigned char* data, int max, int timeout = -1); + int write(const unsigned char* data, int length, int timeout = -1); + +private: + void cleanupTransport(); + static int ioRecv(CYASSL* ssl, char *buf, int sz, void *ctx); + static int ioSend(CYASSL* ssl, char *buf, int sz, void *ctx); + +private: + TCPSocketConnection* tcp; + CYASSL_CTX* ctx; + CYASSL *ssl; + MQTT::Client<TlsMQTTClient, Countdown>* mqttClient; +};