Using MQTT on Dragonfly

Dependencies:   MQTT mbed mtsas

Committer:
miaotwilio
Date:
Thu Sep 14 08:14:18 2017 +0000
Revision:
8:f8a346582627
Parent:
6:4a25f3b9caef
more LEDs

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