miao zhicheng
/
DragonflyMQTT
Using MQTT on Dragonfly
Diff: main.cpp
- Revision:
- 0:b32fa0c757d7
- Child:
- 1:5a896191c3c4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue May 09 13:16:48 2017 +0000 @@ -0,0 +1,118 @@ +#include "MTSCellularManager.hpp" +#include "TlsMQTTClient.hpp" +#include "Certificates.h" +#include <mbed.h> +#include <mtsas.h> +#include <ssl.h> + +// This line controls the regulator's battery charger. +// BC_NCE = 0 enables the battery charger +// BC_NCE = 1 disables the battery charger +DigitalOut bc_nce(PB_2); + +static bool exitCmd = false; + +static void test2Handler(MQTT::MessageData& data); + +int main() { + // Disable the battery charger unless a battery is attached. + bc_nce = 1; + + // Change the baud rate of the debug port from the default 9600 to 115200. + Serial debug(USBTX, USBRX); + debug.baud(115200); + + //Sets the log level to INFO, higher log levels produce more log output. + //Possible levels: NONE, FATAL, ERROR, WARNING, INFO, DEBUG, TRACE + mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL); + + logDebug("Program started"); + + logDebug("Initializing cellular"); + MTSCellularManager cellularManager("wireless.twilio.com"); + if (! cellularManager.init()) { + while (true) { + logError("failed to initialize cellular radio"); + wait(1); + } + } + + logDebug("Initializing CyaSSL"); + CyaSSL_Init(); + + logDebug("Connecting MQTT Client"); + TlsMQTTClient client = TlsMQTTClient(); + MQTTPacket_connectData data = MQTTPacket_connectData_initializer; + data.MQTTVersion = 3; + // Account: AC79339963a99f476e6f0b3214abd48a9d + // Fleet: FL1a84e19cd6014020b7a26a6f89521d4f + // Deployment: DL1daae5d60c5941aea5cd8cf2b693e990 + // Sync List: https://preview.twilio.com/Sync/Services/IS1a84e19cd6014020b7a26a6f89521d4f/Lists/ + // Device: TH6008344511ed4286b249c3d21891b5ae + data.clientID.cstring = "dragonfly-mqtt"; + data.username.cstring = "KY977b46cdd67645b494da001ced07e40f"; + data.password.cstring = "RteF2I/fwCjmmdIOoe32qw"; + if (MQTT::SUCCESS == client.connect("mqtt-sync.us1.twilio.com", 8883, NULL /*MQTT_GATEWAY_PROD_ROOT_CA_PEM*/, data)) { + int rc; + MQTT::Message message; + char buf[512]; + + logDebug("MQTT connected"); + + // QoS 1 list item + sprintf(buf, "{\"test\": 42}"); + message.qos = MQTT::QOS1; + message.payload = (void*)buf; + message.payloadlen = strlen(buf) + 1; + rc = client.publish("sync/lists/test", message); + logDebug("MQTT message publish result: %d", rc); + + rc = client.subscribe("sync/lists/test2", MQTT::QOS1, test2Handler); + logDebug("MQTT subscription result: %d", rc); + + while (!exitCmd) { + client.yield(); // keep alive aconnection + } + + logDebug("MQTT disconnecting"); + client.disconnect(); + } + + logDebug("Cleaning up CyaSSL"); + CyaSSL_Cleanup(); + + logDebug("Shutting down cellular"); + cellularManager.uninit(); + + logDebug("Program finished"); + wait(1E12); + return 0; +} + +static void test2Handler(MQTT::MessageData& data) { + static const size_t MAX_DISPLAY_MESSAGE_SIZE = 30; + char buf[MAX_DISPLAY_MESSAGE_SIZE + 1]; + if (data.message.payloadlen <= MAX_DISPLAY_MESSAGE_SIZE) { + strncpy(buf, (char*)data.message.payload, data.message.payloadlen); + buf[data.message.payloadlen] = '\0'; + } else { + strncpy(buf, (char*)data.message.payload, MAX_DISPLAY_MESSAGE_SIZE - 3); + buf[MAX_DISPLAY_MESSAGE_SIZE-3] = '.'; + buf[MAX_DISPLAY_MESSAGE_SIZE-2] = '.'; + buf[MAX_DISPLAY_MESSAGE_SIZE-1] = '.'; + buf[MAX_DISPLAY_MESSAGE_SIZE] = '\0'; + } + logDebug("topic %s payload received len %d data %s", data.topicName.lenstring.data, data.message.payloadlen, buf); + + // sync client can send binary data using payload format: + // { + // "payload": "ZXhpdA==", # base64 encoded "exit" + // "_iot_meta": { + // "payload_encoding": "base64", + // "payload_type": "application/octet-stream", + // } + // } + if (0 == strncmp((char*)data.message.payload, "exit", data.message.payloadlen)) { + exitCmd = true; + } +}