miao zhicheng
/
DragonflyMQTT
Using MQTT on Dragonfly
MTSCellularManager.cpp@4:f4e8f0fca631, 2017-08-18 (annotated)
- Committer:
- miaotwilio
- Date:
- Fri Aug 18 08:40:35 2017 +0000
- Revision:
- 4:f4e8f0fca631
- Parent:
- 3:0a48c984e15b
- Child:
- 6:4a25f3b9caef
invalidate credentials, and create config.example.hpp instead.
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 | 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 | 3:0a48c984e15b | 90 | */ |
miaotwilio | 3:0a48c984e15b | 91 | |
miaotwilio | 1:5a896191c3c4 | 92 | if (gpsValues.success && gpsValues.fix > 2) { |
miaotwilio | 1:5a896191c3c4 | 93 | logInfo("GPS polled: success %d, sats: %d, fix: %d, ts %s, lat %s, lng %s", |
miaotwilio | 1:5a896191c3c4 | 94 | gpsValues.success, gpsValues.satellites, gpsValues.fix, gpsValues.timestamp.c_str(), gpsValues.latitude.c_str(), gpsValues.longitude.c_str()); |
miaotwilio | 1:5a896191c3c4 | 95 | status.success = gpsValues.success; |
miaotwilio | 1:5a896191c3c4 | 96 | status.fix = gpsValues.fix; |
miaotwilio | 1:5a896191c3c4 | 97 | status.speedVal = gpsValues.kmhr / 0.621371f; |
miaotwilio | 1:5a896191c3c4 | 98 | status.latitudeVal = .0; |
miaotwilio | 1:5a896191c3c4 | 99 | status.longitudeVal = .0; |
miaotwilio | 1:5a896191c3c4 | 100 | sscanf(gpsValues.latitude.substr(0, gpsValues.latitude.size()-1).c_str(), "%02d%lf", &i, &status.latitudeVal); |
miaotwilio | 1:5a896191c3c4 | 101 | c = gpsValues.latitude.c_str()[gpsValues.latitude.size()-1]; |
miaotwilio | 1:5a896191c3c4 | 102 | //logInfo("i=%d,lat=%f,c=%c", i, latitudeVal ,c); |
miaotwilio | 1:5a896191c3c4 | 103 | status.latitudeVal /= 60.0; |
miaotwilio | 1:5a896191c3c4 | 104 | status.latitudeVal += i; |
miaotwilio | 1:5a896191c3c4 | 105 | if(c == 'S') |
miaotwilio | 1:5a896191c3c4 | 106 | status.latitudeVal = 0.0 - status.latitudeVal; |
miaotwilio | 1:5a896191c3c4 | 107 | sscanf(gpsValues.longitude.substr(0, gpsValues.longitude.size()-1).c_str(), "%03d%lf", &i, &status.longitudeVal); |
miaotwilio | 1:5a896191c3c4 | 108 | c = gpsValues.longitude.c_str()[gpsValues.longitude.size()-1]; |
miaotwilio | 1:5a896191c3c4 | 109 | //logInfo("i=%d,lon=%f,c=%c", i, status.longitudeVal, c); |
miaotwilio | 1:5a896191c3c4 | 110 | status.longitudeVal /= 60.0; |
miaotwilio | 1:5a896191c3c4 | 111 | status.longitudeVal += i; |
miaotwilio | 1:5a896191c3c4 | 112 | if(c == 'W') |
miaotwilio | 1:5a896191c3c4 | 113 | status.longitudeVal = 0.0 - status.longitudeVal; |
miaotwilio | 1:5a896191c3c4 | 114 | } else { |
miaotwilio | 1:5a896191c3c4 | 115 | status.success = false; |
miaotwilio | 1:5a896191c3c4 | 116 | logInfo("GPS polled failed: success %d, sats: %d, fix: %d", |
miaotwilio | 1:5a896191c3c4 | 117 | gpsValues.success, gpsValues.satellites, gpsValues.fix); |
miaotwilio | 1:5a896191c3c4 | 118 | } |
miaotwilio | 1:5a896191c3c4 | 119 | |
miaotwilio | 1:5a896191c3c4 | 120 | return status; |
miaotwilio | 1:5a896191c3c4 | 121 | } |