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 miao zhicheng

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

Committer:
miaotwilio
Date:
Thu Aug 17 13:38:58 2017 +0000
Revision:
3:0a48c984e15b
Parent:
1:5a896191c3c4
Child:
4:f4e8f0fca631
fix a CA validation issue

Who changed what in which revision?

UserRevisionLine numberNew contents of line
miaotwilio 0:b32fa0c757d7 1 #include "MTSCellularManager.hpp"
miaotwilio 0:b32fa0c757d7 2
miaotwilio 0:b32fa0c757d7 3 MTSCellularManager::MTSCellularManager(const char* apn_) : apn(apn_), io(NULL), radio(NULL) {
miaotwilio 0:b32fa0c757d7 4 }
miaotwilio 0:b32fa0c757d7 5
miaotwilio 0:b32fa0c757d7 6 MTSCellularManager::~MTSCellularManager() {
miaotwilio 0:b32fa0c757d7 7 delete radio;
miaotwilio 0:b32fa0c757d7 8 delete io;
miaotwilio 0:b32fa0c757d7 9 }
miaotwilio 0:b32fa0c757d7 10
miaotwilio 0:b32fa0c757d7 11 bool MTSCellularManager::init() {
miaotwilio 0:b32fa0c757d7 12 logInfo("initializing cellular radio");
miaotwilio 0:b32fa0c757d7 13
miaotwilio 0:b32fa0c757d7 14 io = new mts::MTSSerialFlowControl(RADIO_TX, RADIO_RX, RADIO_RTS, RADIO_CTS);
miaotwilio 0:b32fa0c757d7 15 // radio default baud rate is 115200
miaotwilio 0:b32fa0c757d7 16 io->baud(115200);
miaotwilio 0:b32fa0c757d7 17 if (! io)
miaotwilio 0:b32fa0c757d7 18 return false;
miaotwilio 0:b32fa0c757d7 19
miaotwilio 0:b32fa0c757d7 20 radio = mts::CellularFactory::create(io);
miaotwilio 0:b32fa0c757d7 21 if (! radio)
miaotwilio 0:b32fa0c757d7 22 return false;
miaotwilio 0:b32fa0c757d7 23
miaotwilio 0:b32fa0c757d7 24 // Transport must be set properly before any TCPSocketConnection or UDPSocket objects are created
miaotwilio 0:b32fa0c757d7 25 Transport::setTransport(radio);
miaotwilio 0:b32fa0c757d7 26
miaotwilio 0:b32fa0c757d7 27 logInfo("setting APN");
miaotwilio 0:b32fa0c757d7 28 if (radio->setApn(apn) != MTS_SUCCESS) {
miaotwilio 0:b32fa0c757d7 29 logError("failed to set APN to \"%s\"", apn);
miaotwilio 0:b32fa0c757d7 30 return false;
miaotwilio 0:b32fa0c757d7 31 }
miaotwilio 0:b32fa0c757d7 32
miaotwilio 0:b32fa0c757d7 33 logInfo("bringing up the link");
miaotwilio 0:b32fa0c757d7 34 if (! radio->connect()) {
miaotwilio 0:b32fa0c757d7 35 logError("failed to bring up the link");
miaotwilio 0:b32fa0c757d7 36 return false;
miaotwilio 0:b32fa0c757d7 37 } else {
miaotwilio 0:b32fa0c757d7 38 return true;
miaotwilio 0:b32fa0c757d7 39 }
miaotwilio 0:b32fa0c757d7 40 }
miaotwilio 0:b32fa0c757d7 41
miaotwilio 0:b32fa0c757d7 42 void MTSCellularManager::uninit() {
miaotwilio 0:b32fa0c757d7 43 logInfo("finished - bringing down link");
miaotwilio 0:b32fa0c757d7 44 radio->disconnect();
miaotwilio 0:b32fa0c757d7 45 delete radio;
miaotwilio 0:b32fa0c757d7 46 delete io;
miaotwilio 1:5a896191c3c4 47 }
miaotwilio 1:5a896191c3c4 48
miaotwilio 1:5a896191c3c4 49 void MTSCellularManager::enableGps() {
miaotwilio 1:5a896191c3c4 50
miaotwilio 1:5a896191c3c4 51 if( !radio->GPSenabled() ) {
miaotwilio 1:5a896191c3c4 52 logInfo("GPS: enabling");
miaotwilio 1:5a896191c3c4 53 radio->GPSenable();
miaotwilio 1:5a896191c3c4 54 while( !radio->GPSenabled() ) {
miaotwilio 1:5a896191c3c4 55 logInfo("...");
miaotwilio 1:5a896191c3c4 56 wait(5);
miaotwilio 1:5a896191c3c4 57 }
miaotwilio 1:5a896191c3c4 58 logInfo("GPS enabled");
miaotwilio 1:5a896191c3c4 59 }
miaotwilio 1:5a896191c3c4 60 }
miaotwilio 1:5a896191c3c4 61
miaotwilio 1:5a896191c3c4 62 MTSCellularManager::GPSStatus MTSCellularManager::gpsPollStatus() {
miaotwilio 1:5a896191c3c4 63 GPSStatus status;
miaotwilio 1:5a896191c3c4 64
miaotwilio 1:5a896191c3c4 65 int i;
miaotwilio 1:5a896191c3c4 66 char c;
miaotwilio 1:5a896191c3c4 67
miaotwilio 1:5a896191c3c4 68 if( !radio->GPSenabled() ) {
miaotwilio 1:5a896191c3c4 69 logInfo("GPS: enabling");
miaotwilio 1:5a896191c3c4 70 radio->GPSenable();
miaotwilio 1:5a896191c3c4 71 while( !radio->GPSenabled() ) {
miaotwilio 1:5a896191c3c4 72 logInfo("...");
miaotwilio 1:5a896191c3c4 73 wait(5);
miaotwilio 1:5a896191c3c4 74 }
miaotwilio 1:5a896191c3c4 75 }
miaotwilio 1:5a896191c3c4 76
miaotwilio 1:5a896191c3c4 77
miaotwilio 1:5a896191c3c4 78 logInfo("GPS polling");
miaotwilio 1:5a896191c3c4 79 mts::Cellular::gpsData gpsValues = radio->GPSgetPosition();
miaotwilio 3:0a48c984e15b 80
miaotwilio 3:0a48c984e15b 81 // mocked data
miaotwilio 3:0a48c984e15b 82 /*
miaotwilio 3:0a48c984e15b 83 gpsValues.success = true;
miaotwilio 1:5a896191c3c4 84 gpsValues.fix = 3;
miaotwilio 1:5a896191c3c4 85 gpsValues.satellites = 4;
miaotwilio 1:5a896191c3c4 86 gpsValues.timestamp = "17/05/12, 08:59:56.483";
miaotwilio 1:5a896191c3c4 87 gpsValues.latitude = "5925.4477N";
miaotwilio 3:0a48c984e15b 88 gpsValues.longitude = "02444.9046E";
miaotwilio 3:0a48c984e15b 89 */
miaotwilio 3:0a48c984e15b 90
miaotwilio 1:5a896191c3c4 91 if (gpsValues.success && gpsValues.fix > 2) {
miaotwilio 1:5a896191c3c4 92 logInfo("GPS polled: success %d, sats: %d, fix: %d, ts %s, lat %s, lng %s",
miaotwilio 1:5a896191c3c4 93 gpsValues.success, gpsValues.satellites, gpsValues.fix, gpsValues.timestamp.c_str(), gpsValues.latitude.c_str(), gpsValues.longitude.c_str());
miaotwilio 1:5a896191c3c4 94 status.success = gpsValues.success;
miaotwilio 1:5a896191c3c4 95 status.fix = gpsValues.fix;
miaotwilio 1:5a896191c3c4 96 status.speedVal = gpsValues.kmhr / 0.621371f;
miaotwilio 1:5a896191c3c4 97 status.latitudeVal = .0;
miaotwilio 1:5a896191c3c4 98 status.longitudeVal = .0;
miaotwilio 1:5a896191c3c4 99 sscanf(gpsValues.latitude.substr(0, gpsValues.latitude.size()-1).c_str(), "%02d%lf", &i, &status.latitudeVal);
miaotwilio 1:5a896191c3c4 100 c = gpsValues.latitude.c_str()[gpsValues.latitude.size()-1];
miaotwilio 1:5a896191c3c4 101 //logInfo("i=%d,lat=%f,c=%c", i, latitudeVal ,c);
miaotwilio 1:5a896191c3c4 102 status.latitudeVal /= 60.0;
miaotwilio 1:5a896191c3c4 103 status.latitudeVal += i;
miaotwilio 1:5a896191c3c4 104 if(c == 'S')
miaotwilio 1:5a896191c3c4 105 status.latitudeVal = 0.0 - status.latitudeVal;
miaotwilio 1:5a896191c3c4 106 sscanf(gpsValues.longitude.substr(0, gpsValues.longitude.size()-1).c_str(), "%03d%lf", &i, &status.longitudeVal);
miaotwilio 1:5a896191c3c4 107 c = gpsValues.longitude.c_str()[gpsValues.longitude.size()-1];
miaotwilio 1:5a896191c3c4 108 //logInfo("i=%d,lon=%f,c=%c", i, status.longitudeVal, c);
miaotwilio 1:5a896191c3c4 109 status.longitudeVal /= 60.0;
miaotwilio 1:5a896191c3c4 110 status.longitudeVal += i;
miaotwilio 1:5a896191c3c4 111 if(c == 'W')
miaotwilio 1:5a896191c3c4 112 status.longitudeVal = 0.0 - status.longitudeVal;
miaotwilio 1:5a896191c3c4 113 } else {
miaotwilio 1:5a896191c3c4 114 status.success = false;
miaotwilio 1:5a896191c3c4 115 logInfo("GPS polled failed: success %d, sats: %d, fix: %d",
miaotwilio 1:5a896191c3c4 116 gpsValues.success, gpsValues.satellites, gpsValues.fix);
miaotwilio 1:5a896191c3c4 117 }
miaotwilio 1:5a896191c3c4 118
miaotwilio 1:5a896191c3c4 119 return status;
miaotwilio 1:5a896191c3c4 120 }