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
Diff: cellular/Cellular.cpp
- Revision:
- 0:563b70517320
- Child:
- 4:6561c9128c6f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cellular/Cellular.cpp Mon Dec 09 15:29:35 2013 +0000 @@ -0,0 +1,164 @@ +#ifndef CELLULAR_CPP +#define CELLULAR_CPP + +#include "Cellular.h" + +Cellular::Cellular(MTSBufferedIO* io) : io(io) +{ +} + +Cellular::~Cellular() +{ +} + +Cellular::Code Cellular::ATTest() +{ + return sendBasicCommand("AT", 1000); +} + +Cellular::Code Cellular::echoOff(bool state) +{ + if (state) { + return sendBasicCommand("ATE0", 1000); + } else { + return sendBasicCommand("ATE1", 1000); + } +} + +int Cellular::getSignalStrength() +{ + string response = sendCommand("AT+CSQ", 1000); + if (response.find("OK") == string::npos) { + return -1; + } + int start = response.find(':'); + int stop = response.find(',', start); + string signal = response.substr(start + 2, stop - start - 2); + int value; + sscanf(signal.c_str(), "%d", &value); + return value; +} + +Cellular::Registration Cellular::getRegistration() +{ + string response = sendCommand("AT+CREG?", 1000); + if (response.find("OK") == string::npos) { + return UNKNOWN; + } + int start = response.find(','); + int stop = response.find(' ', start); + string regStat = response.substr(start + 1, stop - start - 1); + int value; + sscanf(regStat.c_str(), "%d", &value); + switch (value) { + case 0: + return NOT_REGISTERED; + case 1: + return REGISTERED; + case 2: + return SEARCHING; + case 3: + return DENIED; + case 4: + return UNKNOWN; + case 5: + return ROAMING; + } +} + +int Cellular::connect(string host, int port) +{ + // Set the Server Address + string hostCmd = "AT#TCPSERV=1,\""; + hostCmd.append(host); + hostCmd.append("\""); + if (sendBasicCommand(hostCmd, 1000) != OK) { + return -1; + } + + // Set the Server Port + string portCmd = "AT#TCPPORT=1,\""; + char tmp[7]; + if (sprintf(tmp, "%d", port) < 0) { + return -1; + } + portCmd.append(string(tmp)); + portCmd.append("\""); + if (sendBasicCommand(portCmd, 1000) != OK) { + return -1; + } + + // Try and Connect + string response = sendCommand("AT#OTCP=1", 2000); + if (response.find("Ok_Info_WaitingForData") != string::npos) { + return 0; + } else { + return -1; + } +} + +Cellular::Code Cellular::sendBasicCommand(string command, int timeoutMillis, ESC_CHAR esc) +{ + string response = sendCommand(command, timeoutMillis, esc); + if (response.size() == 0) { + return NO_RESPONSE; + } else if (response.find("OK") != string::npos) { + return OK; + } else if (response.find("ERROR") != string::npos) { + return ERROR; + } else { + return FAILURE; + } +} + +Cellular::Code Cellular::sendSMS(string phoneNumber, string message) +{ + Code code = sendBasicCommand("AT+CMGF=1", 1000); + if (code != OK) { + return code; + } + string cmd = "AT+CMGS=\"+"; + cmd.append(phoneNumber); + cmd.append("\""); + string response1 = sendCommand(cmd, 1000); + if (response1.find('>') == string::npos) { + return NO_RESPONSE; + } + wait(.2); + string response2 = sendCommand(message, 4000, CTRL_Z); + printf("SMS Response: %s\n", response2); + if (response2.find("+CMGS:") == string::npos) { + return FAILURE; + } + return OK; +} + +string Cellular::sendCommand(string command, int timeoutMillis, ESC_CHAR esc) +{ + int size = command.size() + 1; + char cmd[size]; + strcpy(cmd, command.c_str()); + if (esc == CR) { + cmd[size -1] = '\r'; + } else if (esc == CTRL_Z) { + cmd[size -1] = 0x1A; + } + + io->rxClear(); + io->txClear(); + int status = io->write(cmd, size); + int available = io->rxAvailable(); + int previous = -1; + int timer = 0; + while (available != previous && timer < timeoutMillis) { + wait(.1); + timer = timer + 100; + previous = available; + available = io->rxAvailable(); + } + char tmp[available]; + io->read(tmp, available); + return string(tmp); +} + +#endif /* CELLULAR_CPP */ \ No newline at end of file