Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of MTS-Cellular by
Cellular/Cellular.cpp@10:c188cc05aed5, 2014-05-21 (annotated)
- Committer:
- Mike Fiore
- Date:
- Wed May 21 15:45:05 2014 -0500
- Revision:
- 10:c188cc05aed5
- Parent:
- 9:1a03e3f3e7fe
- Child:
- 11:4e428f689069
more restructuring
move sendCommand and sendBasicCommand to Cellular Class
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Mike Fiore |
4:1f63354b8d1b | 1 | #include "mbed.h" |
| Mike Fiore |
1:f155d94d6f3a | 2 | #include "Cellular.h" |
| Mike Fiore |
1:f155d94d6f3a | 3 | #include "MTSText.h" |
| Mike Fiore |
4:1f63354b8d1b | 4 | #include "MTSLog.h" |
| Mike Fiore |
1:f155d94d6f3a | 5 | |
| Mike Fiore |
1:f155d94d6f3a | 6 | using namespace mts; |
| Mike Fiore |
1:f155d94d6f3a | 7 | |
| Mike Fiore |
8:2d7259d244d1 | 8 | bool Cellular::init(MTSBufferedIO* io) |
| Mike Fiore |
8:2d7259d244d1 | 9 | { |
| Mike Fiore |
8:2d7259d244d1 | 10 | if (io == NULL) { |
| Mike Fiore |
8:2d7259d244d1 | 11 | return false; |
| Mike Fiore |
8:2d7259d244d1 | 12 | } |
| Mike Fiore |
8:2d7259d244d1 | 13 | this->io = io; |
| Mike Fiore |
8:2d7259d244d1 | 14 | |
| Mike Fiore |
8:2d7259d244d1 | 15 | return true; |
| Mike Fiore |
8:2d7259d244d1 | 16 | } |
| Mike Fiore |
8:2d7259d244d1 | 17 | |
| Mike Fiore |
9:1a03e3f3e7fe | 18 | bool Cellular::configureSignals(unsigned int DCD, unsigned int DTR, unsigned int RESET) |
| Mike Fiore |
9:1a03e3f3e7fe | 19 | { |
| Mike Fiore |
9:1a03e3f3e7fe | 20 | //Set DCD - The radio will raise and lower this line |
| Mike Fiore |
9:1a03e3f3e7fe | 21 | if (DCD != NC) { |
| Mike Fiore |
9:1a03e3f3e7fe | 22 | dcd = new DigitalIn(PinName(DCD)); |
| Mike Fiore |
9:1a03e3f3e7fe | 23 | } |
| Mike Fiore |
9:1a03e3f3e7fe | 24 | /* Set DTR - This line should be lowered when we want to talk to the radio and raised when we're done |
| Mike Fiore |
9:1a03e3f3e7fe | 25 | * for now we will lower it in the constructor and raise it in the destructor. |
| Mike Fiore |
9:1a03e3f3e7fe | 26 | */ |
| Mike Fiore |
9:1a03e3f3e7fe | 27 | if (DTR != NC) { |
| Mike Fiore |
9:1a03e3f3e7fe | 28 | dtr = new DigitalOut(PinName(DTR)); |
| Mike Fiore |
9:1a03e3f3e7fe | 29 | dtr->write(0); |
| Mike Fiore |
9:1a03e3f3e7fe | 30 | } |
| Mike Fiore |
9:1a03e3f3e7fe | 31 | //Set RESET - Set the hardware reset line to the radio |
| Mike Fiore |
9:1a03e3f3e7fe | 32 | if (RESET != NC) { |
| Mike Fiore |
9:1a03e3f3e7fe | 33 | resetLine = new DigitalOut(PinName(RESET)); |
| Mike Fiore |
9:1a03e3f3e7fe | 34 | } |
| Mike Fiore |
9:1a03e3f3e7fe | 35 | return true; |
| Mike Fiore |
9:1a03e3f3e7fe | 36 | } |
| Mike Fiore |
9:1a03e3f3e7fe | 37 | |
| Mike Fiore |
1:f155d94d6f3a | 38 | std::string Cellular::getRegistrationNames(Registration registration) |
| Mike Fiore |
1:f155d94d6f3a | 39 | { |
| Mike Fiore |
1:f155d94d6f3a | 40 | switch(registration) { |
| Mike Fiore |
1:f155d94d6f3a | 41 | case NOT_REGISTERED: |
| Mike Fiore |
1:f155d94d6f3a | 42 | return "NOT_REGISTERED"; |
| Mike Fiore |
1:f155d94d6f3a | 43 | case REGISTERED: |
| Mike Fiore |
1:f155d94d6f3a | 44 | return "REGISTERED"; |
| Mike Fiore |
1:f155d94d6f3a | 45 | case SEARCHING: |
| Mike Fiore |
1:f155d94d6f3a | 46 | return "SEARCHING"; |
| Mike Fiore |
1:f155d94d6f3a | 47 | case DENIED: |
| Mike Fiore |
1:f155d94d6f3a | 48 | return "DENIED"; |
| Mike Fiore |
1:f155d94d6f3a | 49 | case UNKNOWN: |
| Mike Fiore |
1:f155d94d6f3a | 50 | return "UNKNOWN"; |
| Mike Fiore |
1:f155d94d6f3a | 51 | case ROAMING: |
| Mike Fiore |
1:f155d94d6f3a | 52 | return "ROAMING"; |
| Mike Fiore |
1:f155d94d6f3a | 53 | default: |
| Mike Fiore |
1:f155d94d6f3a | 54 | return "UNKNOWN ENUM"; |
| Mike Fiore |
1:f155d94d6f3a | 55 | } |
| Mike Fiore |
1:f155d94d6f3a | 56 | } |
| Mike Fiore |
1:f155d94d6f3a | 57 | |
| Mike Fiore |
1:f155d94d6f3a | 58 | Code Cellular::test() |
| Mike Fiore |
1:f155d94d6f3a | 59 | { |
| Mike Fiore |
1:f155d94d6f3a | 60 | int i = 0; |
| Mike Fiore |
1:f155d94d6f3a | 61 | while (sendBasicCommand("AT", 1000) != SUCCESS) { |
| Mike Fiore |
1:f155d94d6f3a | 62 | i++; |
| Mike Fiore |
1:f155d94d6f3a | 63 | if (i >= 30) { |
| Mike Fiore |
4:1f63354b8d1b | 64 | logError("Could not talk to radio after 30 tries"); |
| Mike Fiore |
1:f155d94d6f3a | 65 | i = 0; |
| Mike Fiore |
1:f155d94d6f3a | 66 | } |
| Mike Fiore |
1:f155d94d6f3a | 67 | wait(1); |
| Mike Fiore |
1:f155d94d6f3a | 68 | } |
| Mike Fiore |
1:f155d94d6f3a | 69 | return SUCCESS; |
| Mike Fiore |
1:f155d94d6f3a | 70 | } |
| Mike Fiore |
1:f155d94d6f3a | 71 | |
| Mike Fiore |
1:f155d94d6f3a | 72 | int Cellular::getSignalStrength() |
| Mike Fiore |
1:f155d94d6f3a | 73 | { |
| Mike Fiore |
1:f155d94d6f3a | 74 | string response = sendCommand("AT+CSQ", 1000); |
| Mike Fiore |
1:f155d94d6f3a | 75 | if (response.find("OK") == string::npos) { |
| Mike Fiore |
1:f155d94d6f3a | 76 | return -1; |
| Mike Fiore |
1:f155d94d6f3a | 77 | } |
| Mike Fiore |
1:f155d94d6f3a | 78 | int start = response.find(':'); |
| Mike Fiore |
1:f155d94d6f3a | 79 | int stop = response.find(',', start); |
| Mike Fiore |
1:f155d94d6f3a | 80 | string signal = response.substr(start + 2, stop - start - 2); |
| Mike Fiore |
1:f155d94d6f3a | 81 | int value; |
| Mike Fiore |
1:f155d94d6f3a | 82 | sscanf(signal.c_str(), "%d", &value); |
| Mike Fiore |
1:f155d94d6f3a | 83 | return value; |
| Mike Fiore |
1:f155d94d6f3a | 84 | } |
| Mike Fiore |
1:f155d94d6f3a | 85 | |
| Mike Fiore |
1:f155d94d6f3a | 86 | Cellular::Registration Cellular::getRegistration() |
| Mike Fiore |
1:f155d94d6f3a | 87 | { |
| Mike Fiore |
1:f155d94d6f3a | 88 | string response = sendCommand("AT+CREG?", 5000); |
| Mike Fiore |
1:f155d94d6f3a | 89 | if (response.find("OK") == string::npos) { |
| Mike Fiore |
1:f155d94d6f3a | 90 | return UNKNOWN; |
| Mike Fiore |
1:f155d94d6f3a | 91 | } |
| Mike Fiore |
1:f155d94d6f3a | 92 | int start = response.find(','); |
| Mike Fiore |
1:f155d94d6f3a | 93 | int stop = response.find(' ', start); |
| Mike Fiore |
1:f155d94d6f3a | 94 | string regStat = response.substr(start + 1, stop - start - 1); |
| Mike Fiore |
1:f155d94d6f3a | 95 | int value; |
| Mike Fiore |
1:f155d94d6f3a | 96 | sscanf(regStat.c_str(), "%d", &value); |
| Mike Fiore |
1:f155d94d6f3a | 97 | switch (value) { |
| Mike Fiore |
1:f155d94d6f3a | 98 | case 0: |
| Mike Fiore |
1:f155d94d6f3a | 99 | return NOT_REGISTERED; |
| Mike Fiore |
1:f155d94d6f3a | 100 | case 1: |
| Mike Fiore |
1:f155d94d6f3a | 101 | return REGISTERED; |
| Mike Fiore |
1:f155d94d6f3a | 102 | case 2: |
| Mike Fiore |
1:f155d94d6f3a | 103 | return SEARCHING; |
| Mike Fiore |
1:f155d94d6f3a | 104 | case 3: |
| Mike Fiore |
1:f155d94d6f3a | 105 | return DENIED; |
| Mike Fiore |
1:f155d94d6f3a | 106 | case 4: |
| Mike Fiore |
1:f155d94d6f3a | 107 | return UNKNOWN; |
| Mike Fiore |
1:f155d94d6f3a | 108 | case 5: |
| Mike Fiore |
1:f155d94d6f3a | 109 | return ROAMING; |
| Mike Fiore |
1:f155d94d6f3a | 110 | } |
| Mike Fiore |
1:f155d94d6f3a | 111 | return UNKNOWN; |
| Mike Fiore |
1:f155d94d6f3a | 112 | } |
| Mike Fiore |
7:0ee8e69a3e9c | 113 | |
| Mike Fiore |
8:2d7259d244d1 | 114 | Code Cellular::setApn(const std::string& apn) |
| Mike Fiore |
8:2d7259d244d1 | 115 | { |
| Mike Fiore |
8:2d7259d244d1 | 116 | Code code = sendBasicCommand("AT#APNSERV=\"" + apn + "\"", 1000); |
| Mike Fiore |
8:2d7259d244d1 | 117 | if (code != SUCCESS) { |
| Mike Fiore |
8:2d7259d244d1 | 118 | return code; |
| Mike Fiore |
8:2d7259d244d1 | 119 | } |
| Mike Fiore |
8:2d7259d244d1 | 120 | this->apn = apn; |
| Mike Fiore |
8:2d7259d244d1 | 121 | return code; |
| Mike Fiore |
8:2d7259d244d1 | 122 | } |
| Mike Fiore |
8:2d7259d244d1 | 123 | |
| Mike Fiore |
8:2d7259d244d1 | 124 | |
| Mike Fiore |
8:2d7259d244d1 | 125 | Code Cellular::setDns(const std::string& primary, const std::string& secondary) |
| Mike Fiore |
8:2d7259d244d1 | 126 | { |
| Mike Fiore |
8:2d7259d244d1 | 127 | return sendBasicCommand("AT#DNS=1," + primary + "," + secondary, 1000); |
| Mike Fiore |
8:2d7259d244d1 | 128 | } |
| Mike Fiore |
8:2d7259d244d1 | 129 | |
| Mike Fiore |
7:0ee8e69a3e9c | 130 | Code Cellular::sendSMS(const Sms& sms) |
| Mike Fiore |
7:0ee8e69a3e9c | 131 | { |
| Mike Fiore |
7:0ee8e69a3e9c | 132 | return sendSMS(sms.phoneNumber, sms.message); |
| Mike Fiore |
7:0ee8e69a3e9c | 133 | } |
| Mike Fiore |
7:0ee8e69a3e9c | 134 | |
| Mike Fiore |
10:c188cc05aed5 | 135 | Code Cellular::sendBasicCommand(const std::string& command, unsigned int timeoutMillis, char esc) |
| Mike Fiore |
10:c188cc05aed5 | 136 | { |
| Mike Fiore |
10:c188cc05aed5 | 137 | if(socketOpened) { |
| Mike Fiore |
10:c188cc05aed5 | 138 | logError("socket is open. Can not send AT commands"); |
| Mike Fiore |
10:c188cc05aed5 | 139 | return ERROR; |
| Mike Fiore |
10:c188cc05aed5 | 140 | } |
| Mike Fiore |
10:c188cc05aed5 | 141 | |
| Mike Fiore |
10:c188cc05aed5 | 142 | string response = sendCommand(command, timeoutMillis, esc); |
| Mike Fiore |
10:c188cc05aed5 | 143 | if (response.size() == 0) { |
| Mike Fiore |
10:c188cc05aed5 | 144 | return NO_RESPONSE; |
| Mike Fiore |
10:c188cc05aed5 | 145 | } else if (response.find("OK") != string::npos) { |
| Mike Fiore |
10:c188cc05aed5 | 146 | return SUCCESS; |
| Mike Fiore |
10:c188cc05aed5 | 147 | } else if (response.find("ERROR") != string::npos) { |
| Mike Fiore |
10:c188cc05aed5 | 148 | return ERROR; |
| Mike Fiore |
10:c188cc05aed5 | 149 | } else { |
| Mike Fiore |
10:c188cc05aed5 | 150 | return FAILURE; |
| Mike Fiore |
10:c188cc05aed5 | 151 | } |
| Mike Fiore |
10:c188cc05aed5 | 152 | } |
| Mike Fiore |
10:c188cc05aed5 | 153 | |
| Mike Fiore |
10:c188cc05aed5 | 154 | string Cellular::sendCommand(const std::string& command, unsigned int timeoutMillis, char esc) |
| Mike Fiore |
10:c188cc05aed5 | 155 | { |
| Mike Fiore |
10:c188cc05aed5 | 156 | if(io == NULL) { |
| Mike Fiore |
10:c188cc05aed5 | 157 | logError("MTSBufferedIO not set"); |
| Mike Fiore |
10:c188cc05aed5 | 158 | return ""; |
| Mike Fiore |
10:c188cc05aed5 | 159 | } |
| Mike Fiore |
10:c188cc05aed5 | 160 | if(socketOpened) { |
| Mike Fiore |
10:c188cc05aed5 | 161 | logError("socket is open. Can not send AT commands"); |
| Mike Fiore |
10:c188cc05aed5 | 162 | return ""; |
| Mike Fiore |
10:c188cc05aed5 | 163 | } |
| Mike Fiore |
10:c188cc05aed5 | 164 | |
| Mike Fiore |
10:c188cc05aed5 | 165 | io->rxClear(); |
| Mike Fiore |
10:c188cc05aed5 | 166 | io->txClear(); |
| Mike Fiore |
10:c188cc05aed5 | 167 | std::string result; |
| Mike Fiore |
10:c188cc05aed5 | 168 | |
| Mike Fiore |
10:c188cc05aed5 | 169 | //Attempt to write command |
| Mike Fiore |
10:c188cc05aed5 | 170 | if(io->write(command.data(), command.size(), timeoutMillis) != command.size()) { |
| Mike Fiore |
10:c188cc05aed5 | 171 | //Failed to write command |
| Mike Fiore |
10:c188cc05aed5 | 172 | if (command != "AT" && command != "at") { |
| Mike Fiore |
10:c188cc05aed5 | 173 | logError("failed to send command to radio within %d milliseconds", timeoutMillis); |
| Mike Fiore |
10:c188cc05aed5 | 174 | } |
| Mike Fiore |
10:c188cc05aed5 | 175 | return ""; |
| Mike Fiore |
10:c188cc05aed5 | 176 | } |
| Mike Fiore |
10:c188cc05aed5 | 177 | |
| Mike Fiore |
10:c188cc05aed5 | 178 | //Send Escape Character |
| Mike Fiore |
10:c188cc05aed5 | 179 | if (esc != 0x00) { |
| Mike Fiore |
10:c188cc05aed5 | 180 | if(io->write(esc, timeoutMillis) != 1) { |
| Mike Fiore |
10:c188cc05aed5 | 181 | if (command != "AT" && command != "at") { |
| Mike Fiore |
10:c188cc05aed5 | 182 | logError("failed to send character '%c' (0x%02X) to radio within %d milliseconds", esc, esc, timeoutMillis); |
| Mike Fiore |
10:c188cc05aed5 | 183 | } |
| Mike Fiore |
10:c188cc05aed5 | 184 | return ""; |
| Mike Fiore |
10:c188cc05aed5 | 185 | } |
| Mike Fiore |
10:c188cc05aed5 | 186 | } |
| Mike Fiore |
10:c188cc05aed5 | 187 | |
| Mike Fiore |
10:c188cc05aed5 | 188 | int timer = 0; |
| Mike Fiore |
10:c188cc05aed5 | 189 | size_t previous = 0; |
| Mike Fiore |
10:c188cc05aed5 | 190 | char tmp[256]; |
| Mike Fiore |
10:c188cc05aed5 | 191 | tmp[255] = 0; |
| Mike Fiore |
10:c188cc05aed5 | 192 | bool started = !echoMode; |
| Mike Fiore |
10:c188cc05aed5 | 193 | bool done = false; |
| Mike Fiore |
10:c188cc05aed5 | 194 | do { |
| Mike Fiore |
10:c188cc05aed5 | 195 | wait(0.1); |
| Mike Fiore |
10:c188cc05aed5 | 196 | timer += 100; |
| Mike Fiore |
10:c188cc05aed5 | 197 | |
| Mike Fiore |
10:c188cc05aed5 | 198 | previous = result.size(); |
| Mike Fiore |
10:c188cc05aed5 | 199 | //Make a non-blocking read call by passing timeout of zero |
| Mike Fiore |
10:c188cc05aed5 | 200 | int size = io->read(tmp,255,0); //1 less than allocated (timeout is instant) |
| Mike Fiore |
10:c188cc05aed5 | 201 | if(size > 0) { |
| Mike Fiore |
10:c188cc05aed5 | 202 | result.append(tmp, size); |
| Mike Fiore |
10:c188cc05aed5 | 203 | } |
| Mike Fiore |
10:c188cc05aed5 | 204 | if(!started) { |
| Mike Fiore |
10:c188cc05aed5 | 205 | //In Echo Mode (Command will have echo'd + 2 characters for \r\n) |
| Mike Fiore |
10:c188cc05aed5 | 206 | if(result.size() > command.size() + 2) { |
| Mike Fiore |
10:c188cc05aed5 | 207 | started = true; |
| Mike Fiore |
10:c188cc05aed5 | 208 | } |
| Mike Fiore |
10:c188cc05aed5 | 209 | } else { |
| Mike Fiore |
10:c188cc05aed5 | 210 | done = (result.size() == previous); |
| Mike Fiore |
10:c188cc05aed5 | 211 | } |
| Mike Fiore |
10:c188cc05aed5 | 212 | if(timer >= timeoutMillis) { |
| Mike Fiore |
10:c188cc05aed5 | 213 | if (command != "AT" && command != "at") { |
| Mike Fiore |
10:c188cc05aed5 | 214 | logWarning("sendCommand [%s] timed out after %d milliseconds", command.c_str(), timeoutMillis); |
| Mike Fiore |
10:c188cc05aed5 | 215 | } |
| Mike Fiore |
10:c188cc05aed5 | 216 | done = true; |
| Mike Fiore |
10:c188cc05aed5 | 217 | } |
| Mike Fiore |
10:c188cc05aed5 | 218 | } while (!done); |
| Mike Fiore |
10:c188cc05aed5 | 219 | |
| Mike Fiore |
10:c188cc05aed5 | 220 | return result; |
| Mike Fiore |
10:c188cc05aed5 | 221 | } |
| Mike Fiore |
10:c188cc05aed5 | 222 | |
| Mike Fiore |
7:0ee8e69a3e9c | 223 | Code Cellular::sendSMS(const std::string& phoneNumber, const std::string& message) |
| Mike Fiore |
7:0ee8e69a3e9c | 224 | { |
| Mike Fiore |
7:0ee8e69a3e9c | 225 | Code code = sendBasicCommand("AT+CMGF=1", 1000); |
| Mike Fiore |
7:0ee8e69a3e9c | 226 | if (code != SUCCESS) { |
| Mike Fiore |
7:0ee8e69a3e9c | 227 | return code; |
| Mike Fiore |
7:0ee8e69a3e9c | 228 | } |
| Mike Fiore |
7:0ee8e69a3e9c | 229 | string cmd = "AT+CMGS=\"+"; |
| Mike Fiore |
7:0ee8e69a3e9c | 230 | cmd.append(phoneNumber); |
| Mike Fiore |
7:0ee8e69a3e9c | 231 | cmd.append("\""); |
| Mike Fiore |
7:0ee8e69a3e9c | 232 | string response1 = sendCommand(cmd, 1000); |
| Mike Fiore |
7:0ee8e69a3e9c | 233 | if (response1.find('>') == string::npos) { |
| Mike Fiore |
7:0ee8e69a3e9c | 234 | return NO_RESPONSE; |
| Mike Fiore |
7:0ee8e69a3e9c | 235 | } |
| Mike Fiore |
7:0ee8e69a3e9c | 236 | wait(.2); |
| Mike Fiore |
7:0ee8e69a3e9c | 237 | string response2 = sendCommand(message, 4000, CTRL_Z); |
| Mike Fiore |
7:0ee8e69a3e9c | 238 | logInfo("SMS Response: %s", response2.c_str()); |
| Mike Fiore |
7:0ee8e69a3e9c | 239 | if (response2.find("+CMGS:") == string::npos) { |
| Mike Fiore |
7:0ee8e69a3e9c | 240 | return FAILURE; |
| Mike Fiore |
7:0ee8e69a3e9c | 241 | } |
| Mike Fiore |
7:0ee8e69a3e9c | 242 | return SUCCESS; |
| Mike Fiore |
7:0ee8e69a3e9c | 243 | } |
| Mike Fiore |
7:0ee8e69a3e9c | 244 | |
| Mike Fiore |
7:0ee8e69a3e9c | 245 | std::vector<Cellular::Sms> Cellular::getReceivedSms() |
| Mike Fiore |
7:0ee8e69a3e9c | 246 | { |
| Mike Fiore |
7:0ee8e69a3e9c | 247 | int smsNumber = 0; |
| Mike Fiore |
7:0ee8e69a3e9c | 248 | std::vector<Sms> vSms; |
| Mike Fiore |
7:0ee8e69a3e9c | 249 | std::string received = sendCommand("AT+CMGL=\"ALL\"", 4000); |
| Mike Fiore |
7:0ee8e69a3e9c | 250 | size_t pos = received.find("+CMGL: "); |
| Mike Fiore |
7:0ee8e69a3e9c | 251 | |
| Mike Fiore |
7:0ee8e69a3e9c | 252 | while (pos != std::string::npos) { |
| Mike Fiore |
7:0ee8e69a3e9c | 253 | Cellular::Sms sms; |
| Mike Fiore |
7:0ee8e69a3e9c | 254 | std::string line(Text::getLine(received, pos, pos)); |
| Mike Fiore |
7:0ee8e69a3e9c | 255 | if(line.find("+CMGL: ") == std::string::npos) { |
| Mike Fiore |
7:0ee8e69a3e9c | 256 | continue; |
| Mike Fiore |
7:0ee8e69a3e9c | 257 | } |
| Mike Fiore |
7:0ee8e69a3e9c | 258 | |
| Mike Fiore |
7:0ee8e69a3e9c | 259 | //Start of SMS message |
| Mike Fiore |
7:0ee8e69a3e9c | 260 | std::vector<std::string> vSmsParts = Text::split(line, ','); |
| Mike Fiore |
7:0ee8e69a3e9c | 261 | if(vSmsParts.size() != 6) { |
| Mike Fiore |
7:0ee8e69a3e9c | 262 | logWarning("Expected 6 commas. SMS[%d] DATA[%s]. Continuing ...", smsNumber, line.c_str()); |
| Mike Fiore |
7:0ee8e69a3e9c | 263 | continue; |
| Mike Fiore |
7:0ee8e69a3e9c | 264 | } |
| Mike Fiore |
7:0ee8e69a3e9c | 265 | |
| Mike Fiore |
7:0ee8e69a3e9c | 266 | sms.phoneNumber = vSmsParts[2]; |
| Mike Fiore |
7:0ee8e69a3e9c | 267 | sms.timestamp = vSmsParts[4] + ", " + vSmsParts[5]; |
| Mike Fiore |
7:0ee8e69a3e9c | 268 | |
| Mike Fiore |
7:0ee8e69a3e9c | 269 | if(pos == std::string::npos) { |
| Mike Fiore |
7:0ee8e69a3e9c | 270 | logWarning("Expected SMS body. SMS[%d]. Leaving ...", smsNumber); |
| Mike Fiore |
7:0ee8e69a3e9c | 271 | break; |
| Mike Fiore |
7:0ee8e69a3e9c | 272 | } |
| Mike Fiore |
7:0ee8e69a3e9c | 273 | //Check for the start of the next SMS message |
| Mike Fiore |
7:0ee8e69a3e9c | 274 | size_t bodyEnd = received.find("\r\n+CMGL: ", pos); |
| Mike Fiore |
7:0ee8e69a3e9c | 275 | if(bodyEnd == std::string::npos) { |
| Mike Fiore |
7:0ee8e69a3e9c | 276 | //This must be the last SMS message |
| Mike Fiore |
7:0ee8e69a3e9c | 277 | bodyEnd = received.find("\r\n\r\nOK", pos); |
| Mike Fiore |
7:0ee8e69a3e9c | 278 | } |
| Mike Fiore |
7:0ee8e69a3e9c | 279 | |
| Mike Fiore |
7:0ee8e69a3e9c | 280 | //Safety check that we found the boundary of this current SMS message |
| Mike Fiore |
7:0ee8e69a3e9c | 281 | if(bodyEnd != std::string::npos) { |
| Mike Fiore |
7:0ee8e69a3e9c | 282 | sms.message = received.substr(pos, bodyEnd - pos); |
| Mike Fiore |
7:0ee8e69a3e9c | 283 | } else { |
| Mike Fiore |
7:0ee8e69a3e9c | 284 | sms.message = received.substr(pos); |
| Mike Fiore |
7:0ee8e69a3e9c | 285 | logWarning("Expected to find end of SMS list. SMS[%d] DATA[%s].", smsNumber, sms.message.c_str()); |
| Mike Fiore |
7:0ee8e69a3e9c | 286 | } |
| Mike Fiore |
7:0ee8e69a3e9c | 287 | vSms.push_back(sms); |
| Mike Fiore |
7:0ee8e69a3e9c | 288 | pos = bodyEnd; |
| Mike Fiore |
7:0ee8e69a3e9c | 289 | smsNumber++; |
| Mike Fiore |
7:0ee8e69a3e9c | 290 | } |
| Mike Fiore |
7:0ee8e69a3e9c | 291 | logInfo("Received %d SMS", smsNumber); |
| Mike Fiore |
7:0ee8e69a3e9c | 292 | return vSms; |
| Mike Fiore |
7:0ee8e69a3e9c | 293 | } |
| Mike Fiore |
7:0ee8e69a3e9c | 294 | |
| Mike Fiore |
7:0ee8e69a3e9c | 295 | Code Cellular::deleteOnlyReceivedReadSms() |
| Mike Fiore |
7:0ee8e69a3e9c | 296 | { |
| Mike Fiore |
7:0ee8e69a3e9c | 297 | return sendBasicCommand("AT+CMGD=1,1", 1000); |
| Mike Fiore |
7:0ee8e69a3e9c | 298 | } |
| Mike Fiore |
7:0ee8e69a3e9c | 299 | |
| Mike Fiore |
7:0ee8e69a3e9c | 300 | Code Cellular::deleteAllReceivedSms() |
| Mike Fiore |
7:0ee8e69a3e9c | 301 | { |
| Mike Fiore |
7:0ee8e69a3e9c | 302 | return sendBasicCommand("AT+CMGD=1,4", 1000); |
| Mike Fiore |
7:0ee8e69a3e9c | 303 | } |
