all the GPRS code

Dependents:   DCS_FINAL_CODE

Committer:
DeWayneDennis
Date:
Sat Dec 19 21:57:28 2015 +0000
Revision:
0:b27750bf16d6
Final Code 12/19/2015

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DeWayneDennis 0:b27750bf16d6 1 /*
DeWayneDennis 0:b27750bf16d6 2 GPRS.cpp
DeWayneDennis 0:b27750bf16d6 3 2014 Copyright (c) Seeed Technology Inc. All right reserved.
DeWayneDennis 0:b27750bf16d6 4
DeWayneDennis 0:b27750bf16d6 5 Author:lawliet zou(lawliet.zou@gmail.com)
DeWayneDennis 0:b27750bf16d6 6 2014-2-24
DeWayneDennis 0:b27750bf16d6 7
DeWayneDennis 0:b27750bf16d6 8 This library is free software; you can redistribute it and/or
DeWayneDennis 0:b27750bf16d6 9 modify it under the terms of the GNU Lesser General Public
DeWayneDennis 0:b27750bf16d6 10 License as published by the Free Software Foundation; either
DeWayneDennis 0:b27750bf16d6 11 version 2.1 of the License, or (at your option) any later version.
DeWayneDennis 0:b27750bf16d6 12
DeWayneDennis 0:b27750bf16d6 13 This library is distributed in the hope that it will be useful,
DeWayneDennis 0:b27750bf16d6 14 but WITHOUT ANY WARRANTY; without even the implied warranty of
DeWayneDennis 0:b27750bf16d6 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
DeWayneDennis 0:b27750bf16d6 16 Lesser General Public License for more details.
DeWayneDennis 0:b27750bf16d6 17
DeWayneDennis 0:b27750bf16d6 18 You should have received a copy of the GNU Lesser General Public
DeWayneDennis 0:b27750bf16d6 19 License along with this library; if not, write to the Free Software
DeWayneDennis 0:b27750bf16d6 20 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
DeWayneDennis 0:b27750bf16d6 21 */
DeWayneDennis 0:b27750bf16d6 22
DeWayneDennis 0:b27750bf16d6 23 #include "mbed.h"
DeWayneDennis 0:b27750bf16d6 24 #include "GPRS.h"
DeWayneDennis 0:b27750bf16d6 25 #include "GSMLibrary.h"
DeWayneDennis 0:b27750bf16d6 26
DeWayneDennis 0:b27750bf16d6 27 GPRS* GPRS::inst;
DeWayneDennis 0:b27750bf16d6 28 char* numbers[100];
DeWayneDennis 0:b27750bf16d6 29 FILE *fpNum;
DeWayneDennis 0:b27750bf16d6 30 int number_index = 0;
DeWayneDennis 0:b27750bf16d6 31 char phone_number[12];
DeWayneDennis 0:b27750bf16d6 32
DeWayneDennis 0:b27750bf16d6 33 GPRS::GPRS(PinName tx, PinName rx, int baudRate, const char* apn, const char* userName, const char* passWord) : Modem(tx,rx,baudRate)
DeWayneDennis 0:b27750bf16d6 34 {
DeWayneDennis 0:b27750bf16d6 35 inst = this;
DeWayneDennis 0:b27750bf16d6 36 _apn = apn;
DeWayneDennis 0:b27750bf16d6 37 _userName = userName;
DeWayneDennis 0:b27750bf16d6 38 _passWord = passWord;
DeWayneDennis 0:b27750bf16d6 39 socketID = -1;
DeWayneDennis 0:b27750bf16d6 40 }
DeWayneDennis 0:b27750bf16d6 41
DeWayneDennis 0:b27750bf16d6 42 bool GPRS::preInit()
DeWayneDennis 0:b27750bf16d6 43 {
DeWayneDennis 0:b27750bf16d6 44 //send AT command a couple of times
DeWayneDennis 0:b27750bf16d6 45 for(int i = 0; i < 2; i++) {
DeWayneDennis 0:b27750bf16d6 46 sendCmd("AT\r\n");
DeWayneDennis 0:b27750bf16d6 47 //set time to update from tower
DeWayneDennis 0:b27750bf16d6 48 //sendCmd("AT+CLTS=1\r\n");
DeWayneDennis 0:b27750bf16d6 49 }
DeWayneDennis 0:b27750bf16d6 50 return checkSIMStatus();
DeWayneDennis 0:b27750bf16d6 51 }
DeWayneDennis 0:b27750bf16d6 52 // added by Noah Milam
DeWayneDennis 0:b27750bf16d6 53 void GPRS::start_server()
DeWayneDennis 0:b27750bf16d6 54 {
DeWayneDennis 0:b27750bf16d6 55 sendCmdResp("AT+CGATT?\r\n");
DeWayneDennis 0:b27750bf16d6 56
DeWayneDennis 0:b27750bf16d6 57 sendCmdResp("AT+CIPSERVER=1,1234\r\n");
DeWayneDennis 0:b27750bf16d6 58 listen_server();
DeWayneDennis 0:b27750bf16d6 59 }
DeWayneDennis 0:b27750bf16d6 60 void GPRS::listen_server()
DeWayneDennis 0:b27750bf16d6 61 {
DeWayneDennis 0:b27750bf16d6 62 gprs_response();
DeWayneDennis 0:b27750bf16d6 63 }
DeWayneDennis 0:b27750bf16d6 64
DeWayneDennis 0:b27750bf16d6 65 void GPRS::send_SMS(char* number, char* data)
DeWayneDennis 0:b27750bf16d6 66 {
DeWayneDennis 0:b27750bf16d6 67 printf("sending text message to: %s\r\n", number);
DeWayneDennis 0:b27750bf16d6 68 sendCmdAndWaitForResp("AT+CMGF=1\r\n","OK",DEFAULT_TIMEOUT,CMD);
DeWayneDennis 0:b27750bf16d6 69 wait(2);
DeWayneDennis 0:b27750bf16d6 70 //printf("\032\n");
DeWayneDennis 0:b27750bf16d6 71 char cmd[64];
DeWayneDennis 0:b27750bf16d6 72 snprintf(cmd,sizeof(cmd),"AT+CMGS=\"+%s\"\r\n",number);
DeWayneDennis 0:b27750bf16d6 73 printf(">>>>%s",cmd);
DeWayneDennis 0:b27750bf16d6 74 sendCmdAndWaitForResp(cmd,">",DEFAULT_TIMEOUT,CMD);
DeWayneDennis 0:b27750bf16d6 75 printf("sent at cmgf\n");
DeWayneDennis 0:b27750bf16d6 76 wait(2);
DeWayneDennis 0:b27750bf16d6 77 //printf("032");
DeWayneDennis 0:b27750bf16d6 78 sendCmd(data); // sends the address
DeWayneDennis 0:b27750bf16d6 79 sendCmd("\x1a"); // this is like pressing control - z to end the send command
DeWayneDennis 0:b27750bf16d6 80 wait(10); // giving the send enough time to do its thing
DeWayneDennis 0:b27750bf16d6 81 printf("should have been received");
DeWayneDennis 0:b27750bf16d6 82 }
DeWayneDennis 0:b27750bf16d6 83
DeWayneDennis 0:b27750bf16d6 84 char* GPRS::read_SMS()
DeWayneDennis 0:b27750bf16d6 85 {
DeWayneDennis 0:b27750bf16d6 86 wait(1);
DeWayneDennis 0:b27750bf16d6 87 sendCmd("AT+CMGF=1\r\n"); // sms mode
DeWayneDennis 0:b27750bf16d6 88 wait(2);
DeWayneDennis 0:b27750bf16d6 89 sendCmd("AT+CMGD=1\r\n"); // delete the frist message so incoming message is spot 1
DeWayneDennis 0:b27750bf16d6 90 wait(1);
DeWayneDennis 0:b27750bf16d6 91 wait_for_sms();
DeWayneDennis 0:b27750bf16d6 92 wait(10);
DeWayneDennis 0:b27750bf16d6 93 sendCmd("AT+CMGR=1\r\n");
DeWayneDennis 0:b27750bf16d6 94 storeResp();
DeWayneDennis 0:b27750bf16d6 95 return get_server_IP();
DeWayneDennis 0:b27750bf16d6 96 }
DeWayneDennis 0:b27750bf16d6 97
DeWayneDennis 0:b27750bf16d6 98 // end of what Noah Milam added
DeWayneDennis 0:b27750bf16d6 99 bool GPRS::checkSIMStatus(void)
DeWayneDennis 0:b27750bf16d6 100 {
DeWayneDennis 0:b27750bf16d6 101 printf("Checking SIM Status...\r\n");
DeWayneDennis 0:b27750bf16d6 102 char gprsBuffer[32];
DeWayneDennis 0:b27750bf16d6 103 int count = 0;
DeWayneDennis 0:b27750bf16d6 104
DeWayneDennis 0:b27750bf16d6 105 while(count < 3) {
DeWayneDennis 0:b27750bf16d6 106 cleanBuffer(gprsBuffer,32);
DeWayneDennis 0:b27750bf16d6 107 sendCmd("AT+CPIN?\r\n");
DeWayneDennis 0:b27750bf16d6 108 readBuffer(gprsBuffer,32,DEFAULT_TIMEOUT);
DeWayneDennis 0:b27750bf16d6 109 if((NULL != strstr(gprsBuffer,"+CPIN: READY"))) {
DeWayneDennis 0:b27750bf16d6 110 break;
DeWayneDennis 0:b27750bf16d6 111 }
DeWayneDennis 0:b27750bf16d6 112 printf("SIM Not Ready..Try Again--%s--\r\n", gprsBuffer);
DeWayneDennis 0:b27750bf16d6 113 count++;
DeWayneDennis 0:b27750bf16d6 114 wait(1);
DeWayneDennis 0:b27750bf16d6 115 }
DeWayneDennis 0:b27750bf16d6 116 if(count == 3) {
DeWayneDennis 0:b27750bf16d6 117 return false;
DeWayneDennis 0:b27750bf16d6 118 }
DeWayneDennis 0:b27750bf16d6 119 printf("SIM Status GOOD!\r\n");
DeWayneDennis 0:b27750bf16d6 120
DeWayneDennis 0:b27750bf16d6 121 //get the phone number
DeWayneDennis 0:b27750bf16d6 122 char resp[96];
DeWayneDennis 0:b27750bf16d6 123 printf(">>>>AT+CNUM\r\n");
DeWayneDennis 0:b27750bf16d6 124 sendCmd("AT+CNUM\r\n");
DeWayneDennis 0:b27750bf16d6 125 cleanBuffer(resp,96);
DeWayneDennis 0:b27750bf16d6 126 readBuffer(resp,96,DEFAULT_TIMEOUT);
DeWayneDennis 0:b27750bf16d6 127 if(NULL != strstr(resp,"+CNUM:")) {
DeWayneDennis 0:b27750bf16d6 128 printf("Response: -%s-", resp);
DeWayneDennis 0:b27750bf16d6 129 const char *p1 = strstr(resp, ",\"")+2;
DeWayneDennis 0:b27750bf16d6 130 const char *p2 = strstr(p1, "\"");
DeWayneDennis 0:b27750bf16d6 131 size_t len = p2-p1;
DeWayneDennis 0:b27750bf16d6 132 phoneNumber = (char*)malloc(sizeof(char)*(len+1));
DeWayneDennis 0:b27750bf16d6 133 strncpy(phoneNumber, p1, len);
DeWayneDennis 0:b27750bf16d6 134 phoneNumber[len] = '\0';
DeWayneDennis 0:b27750bf16d6 135 }
DeWayneDennis 0:b27750bf16d6 136 else{
DeWayneDennis 0:b27750bf16d6 137 printf("Response: -%s-", resp);
DeWayneDennis 0:b27750bf16d6 138 return false;
DeWayneDennis 0:b27750bf16d6 139 }
DeWayneDennis 0:b27750bf16d6 140 return true;
DeWayneDennis 0:b27750bf16d6 141
DeWayneDennis 0:b27750bf16d6 142 }
DeWayneDennis 0:b27750bf16d6 143 char* GPRS::getCellTime(){
DeWayneDennis 0:b27750bf16d6 144 return cellTime;
DeWayneDennis 0:b27750bf16d6 145 }
DeWayneDennis 0:b27750bf16d6 146 void GPRS::setCellTime(){
DeWayneDennis 0:b27750bf16d6 147 //what time is it
DeWayneDennis 0:b27750bf16d6 148 char resp[96];
DeWayneDennis 0:b27750bf16d6 149 printf(">>>AT+CCLK?\r\n");
DeWayneDennis 0:b27750bf16d6 150 sendCmd("AT+CCLK?\r\n");
DeWayneDennis 0:b27750bf16d6 151 readBuffer(resp,96,(DEFAULT_TIMEOUT/2));
DeWayneDennis 0:b27750bf16d6 152 if(NULL != strstr(resp,"+CCLK")) { //ALREADY CONNECT or CONNECT OK
DeWayneDennis 0:b27750bf16d6 153 const char *p1 = strstr(resp, ",")+1;
DeWayneDennis 0:b27750bf16d6 154 const char *p2 = strstr(p1, "-");
DeWayneDennis 0:b27750bf16d6 155 size_t len = p2-p1;
DeWayneDennis 0:b27750bf16d6 156 cellTime = (char*)malloc(sizeof(char)*(len+1));
DeWayneDennis 0:b27750bf16d6 157 strncpy(cellTime, p1, len);
DeWayneDennis 0:b27750bf16d6 158 cellTime[len] = '\0';
DeWayneDennis 0:b27750bf16d6 159 }
DeWayneDennis 0:b27750bf16d6 160 else{
DeWayneDennis 0:b27750bf16d6 161 printf("Time is (error): %s\r\n", resp);
DeWayneDennis 0:b27750bf16d6 162 }
DeWayneDennis 0:b27750bf16d6 163 }
DeWayneDennis 0:b27750bf16d6 164 bool GPRS::join()
DeWayneDennis 0:b27750bf16d6 165 {
DeWayneDennis 0:b27750bf16d6 166 char cmd[64];
DeWayneDennis 0:b27750bf16d6 167 char ipAddr[32];
DeWayneDennis 0:b27750bf16d6 168 char resp[96];
DeWayneDennis 0:b27750bf16d6 169
DeWayneDennis 0:b27750bf16d6 170 printf(">>>>AT+CREG?\r\n");
DeWayneDennis 0:b27750bf16d6 171 sendCmd("AT+CREG?\r\n");
DeWayneDennis 0:b27750bf16d6 172 cleanBuffer(resp,96);
DeWayneDennis 0:b27750bf16d6 173 readBuffer(resp,96,DEFAULT_TIMEOUT);
DeWayneDennis 0:b27750bf16d6 174 if(NULL != strstr(resp,"+CREG: 0,1")) {
DeWayneDennis 0:b27750bf16d6 175 printf("Response: -%s-", resp);
DeWayneDennis 0:b27750bf16d6 176 }
DeWayneDennis 0:b27750bf16d6 177 else{
DeWayneDennis 0:b27750bf16d6 178 printf("Response: -%s-", resp);
DeWayneDennis 0:b27750bf16d6 179 return false;
DeWayneDennis 0:b27750bf16d6 180 }
DeWayneDennis 0:b27750bf16d6 181
DeWayneDennis 0:b27750bf16d6 182 //check if need to attach the device
DeWayneDennis 0:b27750bf16d6 183 printf(">>>>AT+CGATT?\r\n");
DeWayneDennis 0:b27750bf16d6 184 sendCmd("AT+CGATT?\r\n");
DeWayneDennis 0:b27750bf16d6 185 cleanBuffer(resp,96);
DeWayneDennis 0:b27750bf16d6 186 readBuffer(resp,96,DEFAULT_TIMEOUT);
DeWayneDennis 0:b27750bf16d6 187 if(NULL != strstr(resp,"+CGATT: 1")) {
DeWayneDennis 0:b27750bf16d6 188 printf("Response: -%s-", resp);
DeWayneDennis 0:b27750bf16d6 189 }
DeWayneDennis 0:b27750bf16d6 190 else{
DeWayneDennis 0:b27750bf16d6 191 printf("Response: -%s-", resp);
DeWayneDennis 0:b27750bf16d6 192 return false;
DeWayneDennis 0:b27750bf16d6 193 }
DeWayneDennis 0:b27750bf16d6 194 //check the signal quality
DeWayneDennis 0:b27750bf16d6 195 printf(">>>>AT+CSQ?\r\n");
DeWayneDennis 0:b27750bf16d6 196 sendCmd("AT+CSQ?\r\n");
DeWayneDennis 0:b27750bf16d6 197 cleanBuffer(resp,96);
DeWayneDennis 0:b27750bf16d6 198 readBuffer(resp,96,DEFAULT_TIMEOUT);
DeWayneDennis 0:b27750bf16d6 199 printf("Response: -%s-", resp);
DeWayneDennis 0:b27750bf16d6 200
DeWayneDennis 0:b27750bf16d6 201 //close any existing connections
DeWayneDennis 0:b27750bf16d6 202 printf(">>>>AT+CIPSHUT\r\n");
DeWayneDennis 0:b27750bf16d6 203 sendCmd("AT+CIPSHUT\r\n");
DeWayneDennis 0:b27750bf16d6 204 cleanBuffer(resp,96);
DeWayneDennis 0:b27750bf16d6 205 readBuffer(resp,96,DEFAULT_TIMEOUT);
DeWayneDennis 0:b27750bf16d6 206 if(NULL != strstr(resp,"OK")) {
DeWayneDennis 0:b27750bf16d6 207 }
DeWayneDennis 0:b27750bf16d6 208 else{
DeWayneDennis 0:b27750bf16d6 209 return false;
DeWayneDennis 0:b27750bf16d6 210 }
DeWayneDennis 0:b27750bf16d6 211 //check the ip Status
DeWayneDennis 0:b27750bf16d6 212 printf(">>>>AT+CIPSTATUS\r\n");
DeWayneDennis 0:b27750bf16d6 213 sendCmd("AT+CIPSTATUS\r\n");
DeWayneDennis 0:b27750bf16d6 214 cleanBuffer(resp,96);
DeWayneDennis 0:b27750bf16d6 215 readBuffer(resp,96,DEFAULT_TIMEOUT);
DeWayneDennis 0:b27750bf16d6 216 if(NULL != strstr(resp,"GPRSACT")) {
DeWayneDennis 0:b27750bf16d6 217 //Get local IP address
DeWayneDennis 0:b27750bf16d6 218 printf(">>>>AT+CIFSR\r\n");
DeWayneDennis 0:b27750bf16d6 219 sendCmd("AT+CIFSR\r\n");
DeWayneDennis 0:b27750bf16d6 220 readBuffer(ipAddr,32,2);
DeWayneDennis 0:b27750bf16d6 221 printf(">>>>AT+CIFSR returns: %s\r\n", ipAddr);
DeWayneDennis 0:b27750bf16d6 222 if(NULL != strstr(ipAddr,".")) {
DeWayneDennis 0:b27750bf16d6 223 _ip = str_to_ip(ipAddr+12);
DeWayneDennis 0:b27750bf16d6 224 if(_ip != 0) {
DeWayneDennis 0:b27750bf16d6 225 return true;
DeWayneDennis 0:b27750bf16d6 226 }
DeWayneDennis 0:b27750bf16d6 227 }
DeWayneDennis 0:b27750bf16d6 228 }
DeWayneDennis 0:b27750bf16d6 229 else if(NULL != strstr(resp,"INITIAL")){
DeWayneDennis 0:b27750bf16d6 230 printf("Response: -%s-", resp);
DeWayneDennis 0:b27750bf16d6 231
DeWayneDennis 0:b27750bf16d6 232 }
DeWayneDennis 0:b27750bf16d6 233 else if(NULL != strstr(resp,"CONNECT OK")){
DeWayneDennis 0:b27750bf16d6 234 printf("Response: -%s-", resp);
DeWayneDennis 0:b27750bf16d6 235
DeWayneDennis 0:b27750bf16d6 236 }
DeWayneDennis 0:b27750bf16d6 237 else if(NULL != strstr(resp,"START")){
DeWayneDennis 0:b27750bf16d6 238
DeWayneDennis 0:b27750bf16d6 239 //Get local IP address
DeWayneDennis 0:b27750bf16d6 240 printf(">>>>AT+CIFSR\r\n");
DeWayneDennis 0:b27750bf16d6 241 sendCmd("AT+CIFSR\r\n");
DeWayneDennis 0:b27750bf16d6 242 readBuffer(ipAddr,32,2);
DeWayneDennis 0:b27750bf16d6 243 printf(">>>>AT+CIFSR returns: %s\r\n", ipAddr);
DeWayneDennis 0:b27750bf16d6 244 if(NULL != strstr(ipAddr,".")) {
DeWayneDennis 0:b27750bf16d6 245 _ip = str_to_ip(ipAddr+12);
DeWayneDennis 0:b27750bf16d6 246 if(_ip != 0) {
DeWayneDennis 0:b27750bf16d6 247 return true;
DeWayneDennis 0:b27750bf16d6 248 }
DeWayneDennis 0:b27750bf16d6 249 }
DeWayneDennis 0:b27750bf16d6 250 }
DeWayneDennis 0:b27750bf16d6 251 else{
DeWayneDennis 0:b27750bf16d6 252 printf("Response: -%s-", resp);
DeWayneDennis 0:b27750bf16d6 253 return false;
DeWayneDennis 0:b27750bf16d6 254 }
DeWayneDennis 0:b27750bf16d6 255
DeWayneDennis 0:b27750bf16d6 256 //single connection
DeWayneDennis 0:b27750bf16d6 257 printf(">>>>AT+CIPMUX=0\r\n");
DeWayneDennis 0:b27750bf16d6 258 sendCmd("AT+CIPMUX=0\r\n");
DeWayneDennis 0:b27750bf16d6 259 cleanBuffer(resp,96);
DeWayneDennis 0:b27750bf16d6 260 readBuffer(resp,96,DEFAULT_TIMEOUT);
DeWayneDennis 0:b27750bf16d6 261 if(NULL != strstr(resp,"OK")) {
DeWayneDennis 0:b27750bf16d6 262 printf("Response: -%s-", resp);
DeWayneDennis 0:b27750bf16d6 263 }
DeWayneDennis 0:b27750bf16d6 264 else{
DeWayneDennis 0:b27750bf16d6 265 printf("Response: -%s-", resp);
DeWayneDennis 0:b27750bf16d6 266 return false;
DeWayneDennis 0:b27750bf16d6 267 }
DeWayneDennis 0:b27750bf16d6 268
DeWayneDennis 0:b27750bf16d6 269 //set APN
DeWayneDennis 0:b27750bf16d6 270 snprintf(cmd,sizeof(cmd),"AT+CSTT=\"%s\",\"%s\",\"%s\"\r\n",_apn,_userName,_passWord);
DeWayneDennis 0:b27750bf16d6 271 printf(">>>>%s",cmd);
DeWayneDennis 0:b27750bf16d6 272 //sendCmdAndWaitForResp(cmd, "OK", DEFAULT_TIMEOUT,CMD);
DeWayneDennis 0:b27750bf16d6 273 sendCmd(cmd);
DeWayneDennis 0:b27750bf16d6 274 cleanBuffer(resp,96);
DeWayneDennis 0:b27750bf16d6 275 readBuffer(resp,96,DEFAULT_TIMEOUT);
DeWayneDennis 0:b27750bf16d6 276 if(NULL != strstr(resp,"OK")) {
DeWayneDennis 0:b27750bf16d6 277 printf("Response: -%s-", resp);
DeWayneDennis 0:b27750bf16d6 278 }
DeWayneDennis 0:b27750bf16d6 279 else{
DeWayneDennis 0:b27750bf16d6 280 printf("Response: -%s-", resp);
DeWayneDennis 0:b27750bf16d6 281 return false;
DeWayneDennis 0:b27750bf16d6 282 }
DeWayneDennis 0:b27750bf16d6 283 //Brings up wireless connection
DeWayneDennis 0:b27750bf16d6 284 printf(">>>>AT+CIICR\r\n");
DeWayneDennis 0:b27750bf16d6 285 sendCmd("AT+CIICR\r\n");
DeWayneDennis 0:b27750bf16d6 286 cleanBuffer(resp,96);
DeWayneDennis 0:b27750bf16d6 287 readBuffer(resp,96,DEFAULT_TIMEOUT*3);
DeWayneDennis 0:b27750bf16d6 288 if(NULL != strstr(resp,"OK")) {
DeWayneDennis 0:b27750bf16d6 289 printf("Response: -%s-", resp);
DeWayneDennis 0:b27750bf16d6 290 }
DeWayneDennis 0:b27750bf16d6 291 else{
DeWayneDennis 0:b27750bf16d6 292 printf("Response: -%s-", resp);
DeWayneDennis 0:b27750bf16d6 293 return false;
DeWayneDennis 0:b27750bf16d6 294 }
DeWayneDennis 0:b27750bf16d6 295
DeWayneDennis 0:b27750bf16d6 296 //Get local IP address
DeWayneDennis 0:b27750bf16d6 297 printf(">>>>AT+CIFSR\r\n");
DeWayneDennis 0:b27750bf16d6 298 sendCmd("AT+CIFSR\r\n");
DeWayneDennis 0:b27750bf16d6 299 readBuffer(ipAddr,32,2);
DeWayneDennis 0:b27750bf16d6 300 printf(">>>>AT+CIFSR returns: %s\r\n", ipAddr);
DeWayneDennis 0:b27750bf16d6 301 if(NULL != strstr(ipAddr,".")) {
DeWayneDennis 0:b27750bf16d6 302 _ip = str_to_ip(ipAddr+12);
DeWayneDennis 0:b27750bf16d6 303 if(_ip != 0) {
DeWayneDennis 0:b27750bf16d6 304 return true;
DeWayneDennis 0:b27750bf16d6 305 }
DeWayneDennis 0:b27750bf16d6 306 }
DeWayneDennis 0:b27750bf16d6 307 printf(">>>>AT+CIPQSEND=1\r\n");
DeWayneDennis 0:b27750bf16d6 308 sendCmd("AT+CIPQSEND=1\r\n");
DeWayneDennis 0:b27750bf16d6 309 cleanBuffer(resp,96);
DeWayneDennis 0:b27750bf16d6 310 readBuffer(resp,96,DEFAULT_TIMEOUT);
DeWayneDennis 0:b27750bf16d6 311 if(NULL != strstr(resp,"OK")) {
DeWayneDennis 0:b27750bf16d6 312 printf("Response: -%s-", resp);
DeWayneDennis 0:b27750bf16d6 313 }
DeWayneDennis 0:b27750bf16d6 314 else{
DeWayneDennis 0:b27750bf16d6 315 printf("Response: -%s-", resp);
DeWayneDennis 0:b27750bf16d6 316 return false;
DeWayneDennis 0:b27750bf16d6 317 }
DeWayneDennis 0:b27750bf16d6 318 return false;
DeWayneDennis 0:b27750bf16d6 319 }
DeWayneDennis 0:b27750bf16d6 320
DeWayneDennis 0:b27750bf16d6 321 bool GPRS::setProtocol(int socket, Protocol p)
DeWayneDennis 0:b27750bf16d6 322 {
DeWayneDennis 0:b27750bf16d6 323 if (socket < 0 || socket > MAX_SOCK_NUM-1) {
DeWayneDennis 0:b27750bf16d6 324 return false;
DeWayneDennis 0:b27750bf16d6 325 }
DeWayneDennis 0:b27750bf16d6 326 //ToDo: setProtocol
DeWayneDennis 0:b27750bf16d6 327 return true;
DeWayneDennis 0:b27750bf16d6 328 }
DeWayneDennis 0:b27750bf16d6 329
DeWayneDennis 0:b27750bf16d6 330 bool GPRS::connect(int socket, Protocol ptl,const char * host, int port, int timeout)
DeWayneDennis 0:b27750bf16d6 331 {
DeWayneDennis 0:b27750bf16d6 332 char cmd[64];
DeWayneDennis 0:b27750bf16d6 333 char resp[96];
DeWayneDennis 0:b27750bf16d6 334 if (socket < 0 || socket > MAX_SOCK_NUM-1) {
DeWayneDennis 0:b27750bf16d6 335 return false;
DeWayneDennis 0:b27750bf16d6 336 }
DeWayneDennis 0:b27750bf16d6 337 if(ptl == TCP) {
DeWayneDennis 0:b27750bf16d6 338 sprintf(cmd, "AT+CIPSTART=\"TCP\",\"%s\",\"%d\"\r\n", host, port);
DeWayneDennis 0:b27750bf16d6 339 } else if(ptl == UDP) {
DeWayneDennis 0:b27750bf16d6 340 sprintf(cmd, "AT+CIPSTART=%d,\"UDP\",\"%s\",%d\r\n",socket, host, port);
DeWayneDennis 0:b27750bf16d6 341 } else {
DeWayneDennis 0:b27750bf16d6 342 return false;
DeWayneDennis 0:b27750bf16d6 343 }
DeWayneDennis 0:b27750bf16d6 344
DeWayneDennis 0:b27750bf16d6 345 printf("CONNECT: %s", cmd);
DeWayneDennis 0:b27750bf16d6 346 sendCmd(cmd);
DeWayneDennis 0:b27750bf16d6 347 cleanBuffer(resp,96);
DeWayneDennis 0:b27750bf16d6 348 readBuffer(resp,96,DEFAULT_TIMEOUT);
DeWayneDennis 0:b27750bf16d6 349 if(NULL != strstr(resp,"CONNECT")) { //ALREADY CONNECT or CONNECT OK
DeWayneDennis 0:b27750bf16d6 350 printf("SUCCESS: %s\r\n", resp);
DeWayneDennis 0:b27750bf16d6 351
DeWayneDennis 0:b27750bf16d6 352 return true;
DeWayneDennis 0:b27750bf16d6 353 }
DeWayneDennis 0:b27750bf16d6 354 printf("FAILURE: %s\r\n", resp);
DeWayneDennis 0:b27750bf16d6 355 return false;//ERROR
DeWayneDennis 0:b27750bf16d6 356 }
DeWayneDennis 0:b27750bf16d6 357
DeWayneDennis 0:b27750bf16d6 358 bool GPRS::gethostbyname(const char* host, uint32_t* ip)
DeWayneDennis 0:b27750bf16d6 359 {
DeWayneDennis 0:b27750bf16d6 360 uint32_t addr = str_to_ip(host);
DeWayneDennis 0:b27750bf16d6 361 char buf[17];
DeWayneDennis 0:b27750bf16d6 362 snprintf(buf, sizeof(buf), "%d.%d.%d.%d", (addr>>24)&0xff, (addr>>16)&0xff, (addr>>8)&0xff, addr&0xff);
DeWayneDennis 0:b27750bf16d6 363 if (strcmp(buf, host) == 0) {
DeWayneDennis 0:b27750bf16d6 364 *ip = addr;
DeWayneDennis 0:b27750bf16d6 365 return true;
DeWayneDennis 0:b27750bf16d6 366 }
DeWayneDennis 0:b27750bf16d6 367 return false;
DeWayneDennis 0:b27750bf16d6 368 }
DeWayneDennis 0:b27750bf16d6 369
DeWayneDennis 0:b27750bf16d6 370 bool GPRS::disconnect()
DeWayneDennis 0:b27750bf16d6 371 {
DeWayneDennis 0:b27750bf16d6 372 char resp[96];
DeWayneDennis 0:b27750bf16d6 373 printf(">>>AT+CIPSHUT\r\n");
DeWayneDennis 0:b27750bf16d6 374 sendCmd("AT+CIPSHUT\r\n");
DeWayneDennis 0:b27750bf16d6 375 readBuffer(resp,96,DEFAULT_TIMEOUT);
DeWayneDennis 0:b27750bf16d6 376 if(NULL != strstr(resp,"SHUT OK")) { //ALREADY CONNECT or CONNECT OK
DeWayneDennis 0:b27750bf16d6 377 printf("Response: %s\r\n", resp);
DeWayneDennis 0:b27750bf16d6 378 }
DeWayneDennis 0:b27750bf16d6 379 else{
DeWayneDennis 0:b27750bf16d6 380 printf("Response: %s\r\n", resp);
DeWayneDennis 0:b27750bf16d6 381 return false;
DeWayneDennis 0:b27750bf16d6 382 }
DeWayneDennis 0:b27750bf16d6 383 return true;
DeWayneDennis 0:b27750bf16d6 384 }
DeWayneDennis 0:b27750bf16d6 385
DeWayneDennis 0:b27750bf16d6 386 bool GPRS::is_connected(int socket)
DeWayneDennis 0:b27750bf16d6 387 {
DeWayneDennis 0:b27750bf16d6 388 char cmd[16];
DeWayneDennis 0:b27750bf16d6 389 char resp[96];
DeWayneDennis 0:b27750bf16d6 390 snprintf(cmd,16,"AT+CIPSTATUS\r\n");
DeWayneDennis 0:b27750bf16d6 391 sendCmd(cmd);
DeWayneDennis 0:b27750bf16d6 392 readBuffer(resp,sizeof(resp),DEFAULT_TIMEOUT);
DeWayneDennis 0:b27750bf16d6 393 if(NULL != strstr(resp,"CONNECT OK")) {
DeWayneDennis 0:b27750bf16d6 394 printf("Response -%s-\r\n", resp);
DeWayneDennis 0:b27750bf16d6 395 return true;
DeWayneDennis 0:b27750bf16d6 396 } else {
DeWayneDennis 0:b27750bf16d6 397 printf("Fail Response -%s-\r\n", resp);
DeWayneDennis 0:b27750bf16d6 398 return false;
DeWayneDennis 0:b27750bf16d6 399 }
DeWayneDennis 0:b27750bf16d6 400 }
DeWayneDennis 0:b27750bf16d6 401
DeWayneDennis 0:b27750bf16d6 402 void GPRS::reset()
DeWayneDennis 0:b27750bf16d6 403 {
DeWayneDennis 0:b27750bf16d6 404 }
DeWayneDennis 0:b27750bf16d6 405
DeWayneDennis 0:b27750bf16d6 406 bool GPRS::close(int socket)
DeWayneDennis 0:b27750bf16d6 407 {
DeWayneDennis 0:b27750bf16d6 408 char cmd[16];
DeWayneDennis 0:b27750bf16d6 409 char resp[16];
DeWayneDennis 0:b27750bf16d6 410
DeWayneDennis 0:b27750bf16d6 411 if (socket < 0 || socket > MAX_SOCK_NUM-1) {
DeWayneDennis 0:b27750bf16d6 412 return false;
DeWayneDennis 0:b27750bf16d6 413 }
DeWayneDennis 0:b27750bf16d6 414 // if not connected, return
DeWayneDennis 0:b27750bf16d6 415 if (is_connected(socket) == false) {
DeWayneDennis 0:b27750bf16d6 416 return true;
DeWayneDennis 0:b27750bf16d6 417 }
DeWayneDennis 0:b27750bf16d6 418 snprintf(cmd, sizeof(cmd),"AT+CIPCLOSE=%d\r\n",socket);
DeWayneDennis 0:b27750bf16d6 419 snprintf(resp,sizeof(resp),"%d, CLOSE OK",socket);
DeWayneDennis 0:b27750bf16d6 420 if(0 != sendCmdAndWaitForResp(cmd, resp, DEFAULT_TIMEOUT,CMD)) {
DeWayneDennis 0:b27750bf16d6 421 return false;
DeWayneDennis 0:b27750bf16d6 422 }
DeWayneDennis 0:b27750bf16d6 423 return true;
DeWayneDennis 0:b27750bf16d6 424 }
DeWayneDennis 0:b27750bf16d6 425
DeWayneDennis 0:b27750bf16d6 426 bool GPRS::readable(void)
DeWayneDennis 0:b27750bf16d6 427 {
DeWayneDennis 0:b27750bf16d6 428 return readable();
DeWayneDennis 0:b27750bf16d6 429 }
DeWayneDennis 0:b27750bf16d6 430
DeWayneDennis 0:b27750bf16d6 431 int GPRS::wait_readable(int socket, int wait_time)
DeWayneDennis 0:b27750bf16d6 432 {
DeWayneDennis 0:b27750bf16d6 433 if (socket < 0 || socket > MAX_SOCK_NUM-1) {
DeWayneDennis 0:b27750bf16d6 434 return -1;
DeWayneDennis 0:b27750bf16d6 435 }
DeWayneDennis 0:b27750bf16d6 436 char resp[16];
DeWayneDennis 0:b27750bf16d6 437 snprintf(resp,sizeof(resp),"\r\n\r\n+RECEIVE,%d",socket);//"+RECEIVE:<socketID>,<length>"
DeWayneDennis 0:b27750bf16d6 438 int len = strlen(resp);
DeWayneDennis 0:b27750bf16d6 439
DeWayneDennis 0:b27750bf16d6 440 if(false == respCmp(resp,len,wait_time)) {
DeWayneDennis 0:b27750bf16d6 441 return -1;
DeWayneDennis 0:b27750bf16d6 442 }
DeWayneDennis 0:b27750bf16d6 443 char c = readByte();//','
DeWayneDennis 0:b27750bf16d6 444 char dataLen[4];
DeWayneDennis 0:b27750bf16d6 445 int i = 0;
DeWayneDennis 0:b27750bf16d6 446 c = readByte();
DeWayneDennis 0:b27750bf16d6 447 while((c >= '0') && (c <= '9')) {
DeWayneDennis 0:b27750bf16d6 448 dataLen[i++] = c;
DeWayneDennis 0:b27750bf16d6 449 c = readByte();
DeWayneDennis 0:b27750bf16d6 450 }
DeWayneDennis 0:b27750bf16d6 451 c = readByte();//'\n'
DeWayneDennis 0:b27750bf16d6 452 len = atoi(dataLen);
DeWayneDennis 0:b27750bf16d6 453 return len;
DeWayneDennis 0:b27750bf16d6 454 }
DeWayneDennis 0:b27750bf16d6 455
DeWayneDennis 0:b27750bf16d6 456 int GPRS::wait_writeable(int socket, int req_size)
DeWayneDennis 0:b27750bf16d6 457 {
DeWayneDennis 0:b27750bf16d6 458 if (socket < 0 || socket > MAX_SOCK_NUM-1) {
DeWayneDennis 0:b27750bf16d6 459 return -1;
DeWayneDennis 0:b27750bf16d6 460 }
DeWayneDennis 0:b27750bf16d6 461 return req_size>256?256:req_size+1;
DeWayneDennis 0:b27750bf16d6 462 }
DeWayneDennis 0:b27750bf16d6 463
DeWayneDennis 0:b27750bf16d6 464 int GPRS::send(int socket, const char * str, int len)
DeWayneDennis 0:b27750bf16d6 465 {
DeWayneDennis 0:b27750bf16d6 466 if (socket < 0 || socket > MAX_SOCK_NUM-1) {
DeWayneDennis 0:b27750bf16d6 467 return -1;
DeWayneDennis 0:b27750bf16d6 468 }
DeWayneDennis 0:b27750bf16d6 469 char cmd[32];
DeWayneDennis 0:b27750bf16d6 470 if(len > 0){
DeWayneDennis 0:b27750bf16d6 471 //printf("Sending data: %s\r\n", str);
DeWayneDennis 0:b27750bf16d6 472 snprintf(cmd,sizeof(cmd),"AT+CIPSEND\r\n");
DeWayneDennis 0:b27750bf16d6 473 if(0 != sendCmdAndWaitForResp(cmd,">",1,CMD)) {
DeWayneDennis 0:b27750bf16d6 474 printf("Couldn't send data!!");
DeWayneDennis 0:b27750bf16d6 475 return false;
DeWayneDennis 0:b27750bf16d6 476 }
DeWayneDennis 0:b27750bf16d6 477 sendCmd(str);
DeWayneDennis 0:b27750bf16d6 478 serialModem.putc((char)0x1a);
DeWayneDennis 0:b27750bf16d6 479
DeWayneDennis 0:b27750bf16d6 480 }
DeWayneDennis 0:b27750bf16d6 481 return len;
DeWayneDennis 0:b27750bf16d6 482 }
DeWayneDennis 0:b27750bf16d6 483
DeWayneDennis 0:b27750bf16d6 484 int GPRS::recv(int socket, char* buf, int len)
DeWayneDennis 0:b27750bf16d6 485 {
DeWayneDennis 0:b27750bf16d6 486 if (socket < 0 || socket > MAX_SOCK_NUM-1) {
DeWayneDennis 0:b27750bf16d6 487 return -1;
DeWayneDennis 0:b27750bf16d6 488 }
DeWayneDennis 0:b27750bf16d6 489 cleanBuffer(buf,len);
DeWayneDennis 0:b27750bf16d6 490 readBuffer(buf,len,DEFAULT_TIMEOUT/2);
DeWayneDennis 0:b27750bf16d6 491 return len;
DeWayneDennis 0:b27750bf16d6 492 //return strlen(buf);
DeWayneDennis 0:b27750bf16d6 493 }
DeWayneDennis 0:b27750bf16d6 494
DeWayneDennis 0:b27750bf16d6 495 int GPRS::new_socket()
DeWayneDennis 0:b27750bf16d6 496 {
DeWayneDennis 0:b27750bf16d6 497 socketID = 0; //we only support one socket.
DeWayneDennis 0:b27750bf16d6 498 return socketID;
DeWayneDennis 0:b27750bf16d6 499 }
DeWayneDennis 0:b27750bf16d6 500
DeWayneDennis 0:b27750bf16d6 501 uint16_t GPRS::new_port()
DeWayneDennis 0:b27750bf16d6 502 {
DeWayneDennis 0:b27750bf16d6 503 uint16_t port = rand();
DeWayneDennis 0:b27750bf16d6 504 port |= 49152;
DeWayneDennis 0:b27750bf16d6 505 return port;
DeWayneDennis 0:b27750bf16d6 506 }
DeWayneDennis 0:b27750bf16d6 507
DeWayneDennis 0:b27750bf16d6 508 uint32_t GPRS::str_to_ip(const char* str)
DeWayneDennis 0:b27750bf16d6 509 {
DeWayneDennis 0:b27750bf16d6 510 uint32_t ip = 0;
DeWayneDennis 0:b27750bf16d6 511 char* p = (char*)str;
DeWayneDennis 0:b27750bf16d6 512 for(int i = 0; i < 4; i++) {
DeWayneDennis 0:b27750bf16d6 513 ip |= atoi(p);
DeWayneDennis 0:b27750bf16d6 514 p = strchr(p, '.');
DeWayneDennis 0:b27750bf16d6 515 if (p == NULL) {
DeWayneDennis 0:b27750bf16d6 516 break;
DeWayneDennis 0:b27750bf16d6 517 }
DeWayneDennis 0:b27750bf16d6 518 ip <<= 8;
DeWayneDennis 0:b27750bf16d6 519 p++;
DeWayneDennis 0:b27750bf16d6 520 }
DeWayneDennis 0:b27750bf16d6 521 return ip;
DeWayneDennis 0:b27750bf16d6 522 }