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

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?

UserRevisionLine numberNew 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 */