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
MTSCellularManager.cpp@1:5a896191c3c4, 2017-05-12 (annotated)
- Committer:
- miaotwilio
- Date:
- Fri May 12 11:49:58 2017 +0000
- Revision:
- 1:5a896191c3c4
- Parent:
- 0:b32fa0c757d7
- Child:
- 3:0a48c984e15b
integrated with UI
Who changed what in which revision?
User | Revision | Line number | New 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 | 1:5a896191c3c4 | 80 | /*gpsValues.success = true; |
miaotwilio | 1:5a896191c3c4 | 81 | gpsValues.fix = 3; |
miaotwilio | 1:5a896191c3c4 | 82 | gpsValues.satellites = 4; |
miaotwilio | 1:5a896191c3c4 | 83 | gpsValues.timestamp = "17/05/12, 08:59:56.483"; |
miaotwilio | 1:5a896191c3c4 | 84 | gpsValues.latitude = "5925.4477N"; |
miaotwilio | 1:5a896191c3c4 | 85 | gpsValues.longitude = "02444.9046E";*/ |
miaotwilio | 1:5a896191c3c4 | 86 | if (gpsValues.success && gpsValues.fix > 2) { |
miaotwilio | 1:5a896191c3c4 | 87 | logInfo("GPS polled: success %d, sats: %d, fix: %d, ts %s, lat %s, lng %s", |
miaotwilio | 1:5a896191c3c4 | 88 | gpsValues.success, gpsValues.satellites, gpsValues.fix, gpsValues.timestamp.c_str(), gpsValues.latitude.c_str(), gpsValues.longitude.c_str()); |
miaotwilio | 1:5a896191c3c4 | 89 | status.success = gpsValues.success; |
miaotwilio | 1:5a896191c3c4 | 90 | status.fix = gpsValues.fix; |
miaotwilio | 1:5a896191c3c4 | 91 | status.speedVal = gpsValues.kmhr / 0.621371f; |
miaotwilio | 1:5a896191c3c4 | 92 | status.latitudeVal = .0; |
miaotwilio | 1:5a896191c3c4 | 93 | status.longitudeVal = .0; |
miaotwilio | 1:5a896191c3c4 | 94 | sscanf(gpsValues.latitude.substr(0, gpsValues.latitude.size()-1).c_str(), "%02d%lf", &i, &status.latitudeVal); |
miaotwilio | 1:5a896191c3c4 | 95 | c = gpsValues.latitude.c_str()[gpsValues.latitude.size()-1]; |
miaotwilio | 1:5a896191c3c4 | 96 | //logInfo("i=%d,lat=%f,c=%c", i, latitudeVal ,c); |
miaotwilio | 1:5a896191c3c4 | 97 | status.latitudeVal /= 60.0; |
miaotwilio | 1:5a896191c3c4 | 98 | status.latitudeVal += i; |
miaotwilio | 1:5a896191c3c4 | 99 | if(c == 'S') |
miaotwilio | 1:5a896191c3c4 | 100 | status.latitudeVal = 0.0 - status.latitudeVal; |
miaotwilio | 1:5a896191c3c4 | 101 | sscanf(gpsValues.longitude.substr(0, gpsValues.longitude.size()-1).c_str(), "%03d%lf", &i, &status.longitudeVal); |
miaotwilio | 1:5a896191c3c4 | 102 | c = gpsValues.longitude.c_str()[gpsValues.longitude.size()-1]; |
miaotwilio | 1:5a896191c3c4 | 103 | //logInfo("i=%d,lon=%f,c=%c", i, status.longitudeVal, c); |
miaotwilio | 1:5a896191c3c4 | 104 | status.longitudeVal /= 60.0; |
miaotwilio | 1:5a896191c3c4 | 105 | status.longitudeVal += i; |
miaotwilio | 1:5a896191c3c4 | 106 | if(c == 'W') |
miaotwilio | 1:5a896191c3c4 | 107 | status.longitudeVal = 0.0 - status.longitudeVal; |
miaotwilio | 1:5a896191c3c4 | 108 | } else { |
miaotwilio | 1:5a896191c3c4 | 109 | status.success = false; |
miaotwilio | 1:5a896191c3c4 | 110 | logInfo("GPS polled failed: success %d, sats: %d, fix: %d", |
miaotwilio | 1:5a896191c3c4 | 111 | gpsValues.success, gpsValues.satellites, gpsValues.fix); |
miaotwilio | 1:5a896191c3c4 | 112 | } |
miaotwilio | 1:5a896191c3c4 | 113 | |
miaotwilio | 1:5a896191c3c4 | 114 | return status; |
miaotwilio | 1:5a896191c3c4 | 115 | } |