A library for talking to Multi-Tech's Cellular SocketModem Devices.
Dependents: M2X_dev axeda_wrapper_dev MTS_M2x_Example1 MTS_Cellular_Connect_Example ... more
cellular/Cellular.cpp@0:563b70517320, 2013-12-09 (annotated)
- Committer:
- jengbrecht
- Date:
- Mon Dec 09 15:29:35 2013 +0000
- Revision:
- 0:563b70517320
- Child:
- 4:6561c9128c6f
Initial Commit Library!
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jengbrecht | 0:563b70517320 | 1 | #ifndef CELLULAR_CPP |
jengbrecht | 0:563b70517320 | 2 | #define CELLULAR_CPP |
jengbrecht | 0:563b70517320 | 3 | |
jengbrecht | 0:563b70517320 | 4 | #include "Cellular.h" |
jengbrecht | 0:563b70517320 | 5 | |
jengbrecht | 0:563b70517320 | 6 | Cellular::Cellular(MTSBufferedIO* io) : io(io) |
jengbrecht | 0:563b70517320 | 7 | { |
jengbrecht | 0:563b70517320 | 8 | } |
jengbrecht | 0:563b70517320 | 9 | |
jengbrecht | 0:563b70517320 | 10 | Cellular::~Cellular() |
jengbrecht | 0:563b70517320 | 11 | { |
jengbrecht | 0:563b70517320 | 12 | } |
jengbrecht | 0:563b70517320 | 13 | |
jengbrecht | 0:563b70517320 | 14 | Cellular::Code Cellular::ATTest() |
jengbrecht | 0:563b70517320 | 15 | { |
jengbrecht | 0:563b70517320 | 16 | return sendBasicCommand("AT", 1000); |
jengbrecht | 0:563b70517320 | 17 | } |
jengbrecht | 0:563b70517320 | 18 | |
jengbrecht | 0:563b70517320 | 19 | Cellular::Code Cellular::echoOff(bool state) |
jengbrecht | 0:563b70517320 | 20 | { |
jengbrecht | 0:563b70517320 | 21 | if (state) { |
jengbrecht | 0:563b70517320 | 22 | return sendBasicCommand("ATE0", 1000); |
jengbrecht | 0:563b70517320 | 23 | } else { |
jengbrecht | 0:563b70517320 | 24 | return sendBasicCommand("ATE1", 1000); |
jengbrecht | 0:563b70517320 | 25 | } |
jengbrecht | 0:563b70517320 | 26 | } |
jengbrecht | 0:563b70517320 | 27 | |
jengbrecht | 0:563b70517320 | 28 | int Cellular::getSignalStrength() |
jengbrecht | 0:563b70517320 | 29 | { |
jengbrecht | 0:563b70517320 | 30 | string response = sendCommand("AT+CSQ", 1000); |
jengbrecht | 0:563b70517320 | 31 | if (response.find("OK") == string::npos) { |
jengbrecht | 0:563b70517320 | 32 | return -1; |
jengbrecht | 0:563b70517320 | 33 | } |
jengbrecht | 0:563b70517320 | 34 | int start = response.find(':'); |
jengbrecht | 0:563b70517320 | 35 | int stop = response.find(',', start); |
jengbrecht | 0:563b70517320 | 36 | string signal = response.substr(start + 2, stop - start - 2); |
jengbrecht | 0:563b70517320 | 37 | int value; |
jengbrecht | 0:563b70517320 | 38 | sscanf(signal.c_str(), "%d", &value); |
jengbrecht | 0:563b70517320 | 39 | return value; |
jengbrecht | 0:563b70517320 | 40 | } |
jengbrecht | 0:563b70517320 | 41 | |
jengbrecht | 0:563b70517320 | 42 | Cellular::Registration Cellular::getRegistration() |
jengbrecht | 0:563b70517320 | 43 | { |
jengbrecht | 0:563b70517320 | 44 | string response = sendCommand("AT+CREG?", 1000); |
jengbrecht | 0:563b70517320 | 45 | if (response.find("OK") == string::npos) { |
jengbrecht | 0:563b70517320 | 46 | return UNKNOWN; |
jengbrecht | 0:563b70517320 | 47 | } |
jengbrecht | 0:563b70517320 | 48 | int start = response.find(','); |
jengbrecht | 0:563b70517320 | 49 | int stop = response.find(' ', start); |
jengbrecht | 0:563b70517320 | 50 | string regStat = response.substr(start + 1, stop - start - 1); |
jengbrecht | 0:563b70517320 | 51 | int value; |
jengbrecht | 0:563b70517320 | 52 | sscanf(regStat.c_str(), "%d", &value); |
jengbrecht | 0:563b70517320 | 53 | switch (value) { |
jengbrecht | 0:563b70517320 | 54 | case 0: |
jengbrecht | 0:563b70517320 | 55 | return NOT_REGISTERED; |
jengbrecht | 0:563b70517320 | 56 | case 1: |
jengbrecht | 0:563b70517320 | 57 | return REGISTERED; |
jengbrecht | 0:563b70517320 | 58 | case 2: |
jengbrecht | 0:563b70517320 | 59 | return SEARCHING; |
jengbrecht | 0:563b70517320 | 60 | case 3: |
jengbrecht | 0:563b70517320 | 61 | return DENIED; |
jengbrecht | 0:563b70517320 | 62 | case 4: |
jengbrecht | 0:563b70517320 | 63 | return UNKNOWN; |
jengbrecht | 0:563b70517320 | 64 | case 5: |
jengbrecht | 0:563b70517320 | 65 | return ROAMING; |
jengbrecht | 0:563b70517320 | 66 | } |
jengbrecht | 0:563b70517320 | 67 | } |
jengbrecht | 0:563b70517320 | 68 | |
jengbrecht | 0:563b70517320 | 69 | int Cellular::connect(string host, int port) |
jengbrecht | 0:563b70517320 | 70 | { |
jengbrecht | 0:563b70517320 | 71 | // Set the Server Address |
jengbrecht | 0:563b70517320 | 72 | string hostCmd = "AT#TCPSERV=1,\""; |
jengbrecht | 0:563b70517320 | 73 | hostCmd.append(host); |
jengbrecht | 0:563b70517320 | 74 | hostCmd.append("\""); |
jengbrecht | 0:563b70517320 | 75 | if (sendBasicCommand(hostCmd, 1000) != OK) { |
jengbrecht | 0:563b70517320 | 76 | return -1; |
jengbrecht | 0:563b70517320 | 77 | } |
jengbrecht | 0:563b70517320 | 78 | |
jengbrecht | 0:563b70517320 | 79 | // Set the Server Port |
jengbrecht | 0:563b70517320 | 80 | string portCmd = "AT#TCPPORT=1,\""; |
jengbrecht | 0:563b70517320 | 81 | char tmp[7]; |
jengbrecht | 0:563b70517320 | 82 | if (sprintf(tmp, "%d", port) < 0) { |
jengbrecht | 0:563b70517320 | 83 | return -1; |
jengbrecht | 0:563b70517320 | 84 | } |
jengbrecht | 0:563b70517320 | 85 | portCmd.append(string(tmp)); |
jengbrecht | 0:563b70517320 | 86 | portCmd.append("\""); |
jengbrecht | 0:563b70517320 | 87 | if (sendBasicCommand(portCmd, 1000) != OK) { |
jengbrecht | 0:563b70517320 | 88 | return -1; |
jengbrecht | 0:563b70517320 | 89 | } |
jengbrecht | 0:563b70517320 | 90 | |
jengbrecht | 0:563b70517320 | 91 | // Try and Connect |
jengbrecht | 0:563b70517320 | 92 | string response = sendCommand("AT#OTCP=1", 2000); |
jengbrecht | 0:563b70517320 | 93 | if (response.find("Ok_Info_WaitingForData") != string::npos) { |
jengbrecht | 0:563b70517320 | 94 | return 0; |
jengbrecht | 0:563b70517320 | 95 | } else { |
jengbrecht | 0:563b70517320 | 96 | return -1; |
jengbrecht | 0:563b70517320 | 97 | } |
jengbrecht | 0:563b70517320 | 98 | } |
jengbrecht | 0:563b70517320 | 99 | |
jengbrecht | 0:563b70517320 | 100 | Cellular::Code Cellular::sendBasicCommand(string command, int timeoutMillis, ESC_CHAR esc) |
jengbrecht | 0:563b70517320 | 101 | { |
jengbrecht | 0:563b70517320 | 102 | string response = sendCommand(command, timeoutMillis, esc); |
jengbrecht | 0:563b70517320 | 103 | if (response.size() == 0) { |
jengbrecht | 0:563b70517320 | 104 | return NO_RESPONSE; |
jengbrecht | 0:563b70517320 | 105 | } else if (response.find("OK") != string::npos) { |
jengbrecht | 0:563b70517320 | 106 | return OK; |
jengbrecht | 0:563b70517320 | 107 | } else if (response.find("ERROR") != string::npos) { |
jengbrecht | 0:563b70517320 | 108 | return ERROR; |
jengbrecht | 0:563b70517320 | 109 | } else { |
jengbrecht | 0:563b70517320 | 110 | return FAILURE; |
jengbrecht | 0:563b70517320 | 111 | } |
jengbrecht | 0:563b70517320 | 112 | } |
jengbrecht | 0:563b70517320 | 113 | |
jengbrecht | 0:563b70517320 | 114 | Cellular::Code Cellular::sendSMS(string phoneNumber, string message) |
jengbrecht | 0:563b70517320 | 115 | { |
jengbrecht | 0:563b70517320 | 116 | Code code = sendBasicCommand("AT+CMGF=1", 1000); |
jengbrecht | 0:563b70517320 | 117 | if (code != OK) { |
jengbrecht | 0:563b70517320 | 118 | return code; |
jengbrecht | 0:563b70517320 | 119 | } |
jengbrecht | 0:563b70517320 | 120 | string cmd = "AT+CMGS=\"+"; |
jengbrecht | 0:563b70517320 | 121 | cmd.append(phoneNumber); |
jengbrecht | 0:563b70517320 | 122 | cmd.append("\""); |
jengbrecht | 0:563b70517320 | 123 | string response1 = sendCommand(cmd, 1000); |
jengbrecht | 0:563b70517320 | 124 | if (response1.find('>') == string::npos) { |
jengbrecht | 0:563b70517320 | 125 | return NO_RESPONSE; |
jengbrecht | 0:563b70517320 | 126 | } |
jengbrecht | 0:563b70517320 | 127 | wait(.2); |
jengbrecht | 0:563b70517320 | 128 | string response2 = sendCommand(message, 4000, CTRL_Z); |
jengbrecht | 0:563b70517320 | 129 | printf("SMS Response: %s\n", response2); |
jengbrecht | 0:563b70517320 | 130 | if (response2.find("+CMGS:") == string::npos) { |
jengbrecht | 0:563b70517320 | 131 | return FAILURE; |
jengbrecht | 0:563b70517320 | 132 | } |
jengbrecht | 0:563b70517320 | 133 | return OK; |
jengbrecht | 0:563b70517320 | 134 | } |
jengbrecht | 0:563b70517320 | 135 | |
jengbrecht | 0:563b70517320 | 136 | string Cellular::sendCommand(string command, int timeoutMillis, ESC_CHAR esc) |
jengbrecht | 0:563b70517320 | 137 | { |
jengbrecht | 0:563b70517320 | 138 | int size = command.size() + 1; |
jengbrecht | 0:563b70517320 | 139 | char cmd[size]; |
jengbrecht | 0:563b70517320 | 140 | strcpy(cmd, command.c_str()); |
jengbrecht | 0:563b70517320 | 141 | if (esc == CR) { |
jengbrecht | 0:563b70517320 | 142 | cmd[size -1] = '\r'; |
jengbrecht | 0:563b70517320 | 143 | } else if (esc == CTRL_Z) { |
jengbrecht | 0:563b70517320 | 144 | cmd[size -1] = 0x1A; |
jengbrecht | 0:563b70517320 | 145 | } |
jengbrecht | 0:563b70517320 | 146 | |
jengbrecht | 0:563b70517320 | 147 | io->rxClear(); |
jengbrecht | 0:563b70517320 | 148 | io->txClear(); |
jengbrecht | 0:563b70517320 | 149 | int status = io->write(cmd, size); |
jengbrecht | 0:563b70517320 | 150 | int available = io->rxAvailable(); |
jengbrecht | 0:563b70517320 | 151 | int previous = -1; |
jengbrecht | 0:563b70517320 | 152 | int timer = 0; |
jengbrecht | 0:563b70517320 | 153 | while (available != previous && timer < timeoutMillis) { |
jengbrecht | 0:563b70517320 | 154 | wait(.1); |
jengbrecht | 0:563b70517320 | 155 | timer = timer + 100; |
jengbrecht | 0:563b70517320 | 156 | previous = available; |
jengbrecht | 0:563b70517320 | 157 | available = io->rxAvailable(); |
jengbrecht | 0:563b70517320 | 158 | } |
jengbrecht | 0:563b70517320 | 159 | char tmp[available]; |
jengbrecht | 0:563b70517320 | 160 | io->read(tmp, available); |
jengbrecht | 0:563b70517320 | 161 | return string(tmp); |
jengbrecht | 0:563b70517320 | 162 | } |
jengbrecht | 0:563b70517320 | 163 | |
jengbrecht | 0:563b70517320 | 164 | #endif /* CELLULAR_CPP */ |