final groupe 1

Committer:
GrandDiego
Date:
Sun Feb 03 19:36:14 2019 +0000
Revision:
11:79ff36296092
Parent:
10:24671d8aa0c9
final groupe 1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lawliet 0:a5ae94727346 1 /*
screamer 10:24671d8aa0c9 2 GSM.cpp
lawliet 0:a5ae94727346 3 2013 Copyright (c) Seeed Technology Inc. All right reserved.
lawliet 0:a5ae94727346 4
lawliet 0:a5ae94727346 5 Author:lawliet.zou@gmail.com
lawliet 0:a5ae94727346 6 2013-11-14
GrandDiego 11:79ff36296092 7 */
lawliet 0:a5ae94727346 8
screamer 10:24671d8aa0c9 9 #include "GSM.h"
lawliet 0:a5ae94727346 10
screamer 10:24671d8aa0c9 11 int GSM::readBuffer(char *buffer,int count)
lawliet 0:a5ae94727346 12 {
lawliet 1:642a8dbe076c 13 int i = 0;
lawliet 1:642a8dbe076c 14 timeCnt.start(); // start timer
lawliet 1:642a8dbe076c 15 while(1) {
lawliet 1:642a8dbe076c 16 while (gprsSerial.readable()) {
lawliet 1:642a8dbe076c 17 char c = gprsSerial.getc();
lawliet 1:642a8dbe076c 18 if (c == '\r' || c == '\n') c = '$';
lawliet 1:642a8dbe076c 19 buffer[i++] = c;
lawliet 1:642a8dbe076c 20 if(i > count)break;
lawliet 1:642a8dbe076c 21 }
lawliet 1:642a8dbe076c 22 if(i > count)break;
lawliet 3:48ee24a4b0f3 23 if(timeCnt.read() > DEFAULT_TIMEOUT) {
lawliet 1:642a8dbe076c 24 timeCnt.stop();
lawliet 1:642a8dbe076c 25 timeCnt.reset();
lawliet 1:642a8dbe076c 26 break;
lawliet 1:642a8dbe076c 27 }
lawliet 1:642a8dbe076c 28 }
lawliet 1:642a8dbe076c 29 wait(0.5);
lawliet 1:642a8dbe076c 30 while(gprsSerial.readable()) { // display the other thing..
lawliet 1:642a8dbe076c 31 char c = gprsSerial.getc();
lawliet 1:642a8dbe076c 32 }
lawliet 1:642a8dbe076c 33 return 0;
lawliet 0:a5ae94727346 34 }
lawliet 0:a5ae94727346 35
GrandDiego 11:79ff36296092 36 void GSM::gprs_message(char * url , char * message) {
GrandDiego 11:79ff36296092 37
GrandDiego 11:79ff36296092 38 //gprsSerial.printf("at+sapbr=1,1\r\n"); //enable gprs
GrandDiego 11:79ff36296092 39 //wait(0.05);
GrandDiego 11:79ff36296092 40 sendCmdAndWaitForResp("AT+SAPBR=1,1\r\n", "OK", 2);
GrandDiego 11:79ff36296092 41
GrandDiego 11:79ff36296092 42 //gprsSerial.printf("at+httpinit\r\n");
GrandDiego 11:79ff36296092 43 //wait(0.05);
GrandDiego 11:79ff36296092 44 sendCmdAndWaitForResp("at+httpinit\r\n", "OK", 2);
GrandDiego 11:79ff36296092 45
GrandDiego 11:79ff36296092 46 gprsSerial.printf("at+httppara=\"url\",\"%s%s\"\r\n", url, message);
GrandDiego 11:79ff36296092 47 wait(0.15);
GrandDiego 11:79ff36296092 48 //char str[50];
GrandDiego 11:79ff36296092 49 //snprintf(str, 50, "at+httppara=\"url\",\"%s%s\"\r\n", url, message);
GrandDiego 11:79ff36296092 50 //sendCmdAndWaitForResp(str, "OK", 2);
GrandDiego 11:79ff36296092 51
GrandDiego 11:79ff36296092 52 //gprsSerial.printf("at+httpaction=0\r\n");
GrandDiego 11:79ff36296092 53 sendCmdAndWaitForResp("at+httpaction=0\r\n", "OK", 2);
GrandDiego 11:79ff36296092 54
GrandDiego 11:79ff36296092 55 }
lawliet 0:a5ae94727346 56 void cleanBuffer(char *buffer, int count)
lawliet 0:a5ae94727346 57 {
lawliet 1:642a8dbe076c 58 for(int i=0; i < count; i++) {
lawliet 1:642a8dbe076c 59 buffer[i] = '\0';
lawliet 1:642a8dbe076c 60 }
lawliet 0:a5ae94727346 61 }
lawliet 0:a5ae94727346 62
screamer 10:24671d8aa0c9 63 void GSM::sendCmd(char *cmd)
lawliet 0:a5ae94727346 64 {
lawliet 1:642a8dbe076c 65 gprsSerial.puts(cmd);
lawliet 0:a5ae94727346 66 }
lawliet 0:a5ae94727346 67
screamer 10:24671d8aa0c9 68 int GSM::waitForResp(char *resp, int timeout)
lawliet 0:a5ae94727346 69 {
lawliet 1:642a8dbe076c 70 int len = strlen(resp);
lawliet 1:642a8dbe076c 71 int sum=0;
lawliet 1:642a8dbe076c 72 timeCnt.start();
lawliet 1:642a8dbe076c 73
lawliet 1:642a8dbe076c 74 while(1) {
lawliet 1:642a8dbe076c 75 if(gprsSerial.readable()) {
lawliet 1:642a8dbe076c 76 char c = gprsSerial.getc();
lawliet 1:642a8dbe076c 77 sum = (c==resp[sum]) ? sum+1 : 0;
lawliet 1:642a8dbe076c 78 if(sum == len)break;
lawliet 1:642a8dbe076c 79 }
lawliet 1:642a8dbe076c 80 if(timeCnt.read() > timeout) { // time out
lawliet 1:642a8dbe076c 81 timeCnt.stop();
lawliet 1:642a8dbe076c 82 timeCnt.reset();
lawliet 1:642a8dbe076c 83 return -1;
lawliet 1:642a8dbe076c 84 }
lawliet 1:642a8dbe076c 85 }
lawliet 1:642a8dbe076c 86 timeCnt.stop(); // stop timer
lawliet 1:642a8dbe076c 87 timeCnt.reset(); // clear timer
lawliet 1:642a8dbe076c 88 while(gprsSerial.readable()) { // display the other thing..
lawliet 1:642a8dbe076c 89 char c = gprsSerial.getc();
lawliet 1:642a8dbe076c 90 }
lawliet 1:642a8dbe076c 91
lawliet 1:642a8dbe076c 92 return 0;
lawliet 1:642a8dbe076c 93 }
lawliet 0:a5ae94727346 94
screamer 10:24671d8aa0c9 95 int GSM::sendCmdAndWaitForResp(char *cmd, char *resp, int timeout)
lawliet 0:a5ae94727346 96 {
lawliet 0:a5ae94727346 97 sendCmd(cmd);
lawliet 1:642a8dbe076c 98 return waitForResp(resp,timeout);
lawliet 0:a5ae94727346 99 }
lawliet 0:a5ae94727346 100
screamer 10:24671d8aa0c9 101 int GSM::powerCheck(void)
lawliet 7:1278e9dde24e 102 {
lawliet 7:1278e9dde24e 103 return sendCmdAndWaitForResp("AT\r\n", "OK", 2);
lawliet 7:1278e9dde24e 104 }
lawliet 7:1278e9dde24e 105
screamer 10:24671d8aa0c9 106 int GSM::init(void)
lawliet 4:63a2619b423b 107 {
lawliet 7:1278e9dde24e 108 for(int i = 0; i < 3; i++){
lawliet 7:1278e9dde24e 109 sendCmdAndWaitForResp("AT\r\n", "OK", DEFAULT_TIMEOUT);
lawliet 7:1278e9dde24e 110 wait(0.5);
lawliet 7:1278e9dde24e 111 }
lawliet 4:63a2619b423b 112 if(0 != checkSIMStatus()) {
lawliet 4:63a2619b423b 113 return -1;
lawliet 4:63a2619b423b 114 }
lawliet 4:63a2619b423b 115 if(checkSignalStrength()<1) {
lawliet 4:63a2619b423b 116 return -1;
lawliet 4:63a2619b423b 117 }
lawliet 4:63a2619b423b 118 if(0 != settingSMS()) {
lawliet 4:63a2619b423b 119 return -1;
lawliet 4:63a2619b423b 120 }
lawliet 4:63a2619b423b 121 return 0;
lawliet 4:63a2619b423b 122 }
lawliet 4:63a2619b423b 123
screamer 10:24671d8aa0c9 124 int GSM::checkSIMStatus(void)
lawliet 0:a5ae94727346 125 {
lawliet 1:642a8dbe076c 126 char gprsBuffer[30];
lawliet 1:642a8dbe076c 127 int count = 0;
lawliet 1:642a8dbe076c 128 cleanBuffer(gprsBuffer,30);
lawliet 1:642a8dbe076c 129 while(count < 3) {
lawliet 1:642a8dbe076c 130 sendCmd("AT+CPIN?\r\n");
lawliet 1:642a8dbe076c 131 readBuffer(gprsBuffer,30);
lawliet 1:642a8dbe076c 132 if((NULL != strstr(gprsBuffer,"+CPIN: READY"))) {
lawliet 1:642a8dbe076c 133 break;
lawliet 1:642a8dbe076c 134 }
lawliet 1:642a8dbe076c 135 count++;
lawliet 1:642a8dbe076c 136 wait(1);
lawliet 1:642a8dbe076c 137 }
lawliet 0:a5ae94727346 138
lawliet 1:642a8dbe076c 139 if(count == 3) {
lawliet 1:642a8dbe076c 140 return -1;
lawliet 1:642a8dbe076c 141 }
lawliet 1:642a8dbe076c 142 return 0;
lawliet 0:a5ae94727346 143 }
lawliet 0:a5ae94727346 144
screamer 10:24671d8aa0c9 145 int GSM::checkSignalStrength(void)
lawliet 0:a5ae94727346 146 {
lawliet 1:642a8dbe076c 147 char gprsBuffer[100];
lawliet 1:642a8dbe076c 148 int index,count = 0;
lawliet 1:642a8dbe076c 149 cleanBuffer(gprsBuffer,100);
lawliet 1:642a8dbe076c 150 while(count < 3) {
lawliet 1:642a8dbe076c 151 sendCmd("AT+CSQ\r\n");
lawliet 1:642a8dbe076c 152 readBuffer(gprsBuffer,25);
lawliet 1:642a8dbe076c 153 if(sscanf(gprsBuffer, "AT+CSQ$$$$+CSQ: %d", &index)>0) {
lawliet 1:642a8dbe076c 154 break;
lawliet 1:642a8dbe076c 155 }
lawliet 1:642a8dbe076c 156 count++;
lawliet 1:642a8dbe076c 157 wait(1);
lawliet 1:642a8dbe076c 158 }
lawliet 1:642a8dbe076c 159 if(count == 3) {
lawliet 1:642a8dbe076c 160 return -1;
lawliet 1:642a8dbe076c 161 }
lawliet 1:642a8dbe076c 162 return index;
lawliet 0:a5ae94727346 163 }
lawliet 0:a5ae94727346 164
screamer 10:24671d8aa0c9 165 int GSM::settingSMS(void)
lawliet 4:63a2619b423b 166 {
lawliet 4:63a2619b423b 167 if(0 != sendCmdAndWaitForResp("AT+CNMI=2,2\r\n", "OK", DEFAULT_TIMEOUT)) {
lawliet 4:63a2619b423b 168 return -1;
lawliet 4:63a2619b423b 169 }
lawliet 4:63a2619b423b 170 if(0 != sendCmdAndWaitForResp("AT+CMGF=1\r\n", "OK", DEFAULT_TIMEOUT)) {
lawliet 4:63a2619b423b 171 return -1;
lawliet 4:63a2619b423b 172 }
lawliet 4:63a2619b423b 173 return 0;
lawliet 4:63a2619b423b 174 }
lawliet 4:63a2619b423b 175
screamer 10:24671d8aa0c9 176 int GSM::sendSMS(char *number, char *data)
lawliet 0:a5ae94727346 177 {
lawliet 1:642a8dbe076c 178 char cmd[64];
lawliet 4:63a2619b423b 179 while(gprsSerial.readable()) {
lawliet 4:63a2619b423b 180 char c = gprsSerial.getc();
lawliet 1:642a8dbe076c 181 }
lawliet 4:63a2619b423b 182 snprintf(cmd, sizeof(cmd),"AT+CMGS=\"%s\"\r\n",number);
lawliet 3:48ee24a4b0f3 183 if(0 != sendCmdAndWaitForResp(cmd,">",DEFAULT_TIMEOUT)) {
lawliet 1:642a8dbe076c 184 return -1;
lawliet 1:642a8dbe076c 185 }
lawliet 1:642a8dbe076c 186 wait(1);
lawliet 4:63a2619b423b 187 gprsSerial.puts(data);
lawliet 4:63a2619b423b 188 gprsSerial.putc((char)0x1a);
lawliet 1:642a8dbe076c 189 return 0;
lawliet 0:a5ae94727346 190 }
lawliet 0:a5ae94727346 191
screamer 10:24671d8aa0c9 192 int GSM::readSMS(char *message, int index)
lawliet 0:a5ae94727346 193 {
lawliet 4:63a2619b423b 194 int i = 0;
lawliet 1:642a8dbe076c 195 char gprsBuffer[100];
lawliet 1:642a8dbe076c 196 char *p,*s;
lawliet 4:63a2619b423b 197 gprsSerial.printf("AT+CMGR=%d\r\n",index);
lawliet 1:642a8dbe076c 198 cleanBuffer(gprsBuffer,100);
lawliet 1:642a8dbe076c 199 readBuffer(gprsBuffer,100);
lawliet 4:63a2619b423b 200 if(NULL == ( s = strstr(gprsBuffer,"+CMGR"))) {
lawliet 1:642a8dbe076c 201 return -1;
lawliet 1:642a8dbe076c 202 }
lawliet 4:63a2619b423b 203 if(NULL != ( s = strstr(gprsBuffer,"+32"))) {
lawliet 4:63a2619b423b 204 p = s + 6;
lawliet 4:63a2619b423b 205 while((*p != '$')&&(i < SMS_MAX_LENGTH-1)) {
lawliet 4:63a2619b423b 206 message[i++] = *(p++);
lawliet 1:642a8dbe076c 207 }
lawliet 4:63a2619b423b 208 message[i] = '\0';
lawliet 1:642a8dbe076c 209 }
lawliet 1:642a8dbe076c 210 return 0;
lawliet 0:a5ae94727346 211 }
lawliet 0:a5ae94727346 212
screamer 10:24671d8aa0c9 213 int GSM::deleteSMS(int index)
lawliet 0:a5ae94727346 214 {
lawliet 4:63a2619b423b 215 char cmd[32];
lawliet 1:642a8dbe076c 216 snprintf(cmd,sizeof(cmd),"AT+CMGD=%d\r\n",index);
lawliet 1:642a8dbe076c 217 sendCmd(cmd);
lawliet 1:642a8dbe076c 218 return 0;
lawliet 0:a5ae94727346 219 }
lawliet 0:a5ae94727346 220
screamer 10:24671d8aa0c9 221 int GSM::getSMS(char* message)
lawliet 4:63a2619b423b 222 {
lawliet 4:63a2619b423b 223 if(NULL != messageBuffer) {
lawliet 4:63a2619b423b 224 strncpy(message,messageBuffer,SMS_MAX_LENGTH);
lawliet 4:63a2619b423b 225 }
lawliet 4:63a2619b423b 226 return 0;
lawliet 4:63a2619b423b 227 }
lawliet 4:63a2619b423b 228
screamer 10:24671d8aa0c9 229 int GSM::callUp(char *number)
lawliet 0:a5ae94727346 230 {
lawliet 1:642a8dbe076c 231 if(0 != sendCmdAndWaitForResp("AT+COLP=1\r\n","OK",5)) {
lawliet 1:642a8dbe076c 232 return -1;
lawliet 1:642a8dbe076c 233 }
lawliet 1:642a8dbe076c 234 wait(1);
lawliet 1:642a8dbe076c 235 gprsSerial.printf("\r\nATD%s;\r\n",NULL==number?phoneNumber:number);
lawliet 1:642a8dbe076c 236 return 0;
lawliet 0:a5ae94727346 237 }
lawliet 0:a5ae94727346 238
screamer 10:24671d8aa0c9 239 int GSM::answer(void)
lawliet 0:a5ae94727346 240 {
lawliet 1:642a8dbe076c 241 gprsSerial.printf("ATA\r\n");
lawliet 1:642a8dbe076c 242 return 0;
lawliet 0:a5ae94727346 243 }
lawliet 0:a5ae94727346 244
screamer 10:24671d8aa0c9 245 int GSM::loopHandle(void)
lawliet 0:a5ae94727346 246 {
lawliet 1:642a8dbe076c 247 char gprsBuffer[100];
lawliet 7:1278e9dde24e 248 int i;
lawliet 4:63a2619b423b 249 char *s = NULL;
lawliet 4:63a2619b423b 250 while(gprsSerial.readable()) {
lawliet 4:63a2619b423b 251 char c = gprsSerial.getc();
lawliet 4:63a2619b423b 252 }
lawliet 7:1278e9dde24e 253 wait(0.5);
lawliet 4:63a2619b423b 254 START:
lawliet 7:1278e9dde24e 255 cleanBuffer(gprsBuffer,100);
lawliet 7:1278e9dde24e 256 i = 0;
lawliet 1:642a8dbe076c 257 while(1) {
lawliet 1:642a8dbe076c 258 if(gprsSerial.readable()) {
lawliet 7:1278e9dde24e 259 timeCnt.start(); // start timer
lawliet 7:1278e9dde24e 260 while(1) {
lawliet 7:1278e9dde24e 261 while (gprsSerial.readable()) {
lawliet 7:1278e9dde24e 262 char c = gprsSerial.getc();
lawliet 7:1278e9dde24e 263 if (c == '\r' || c == '\n') c = '$';
lawliet 7:1278e9dde24e 264 gprsBuffer[i] = c;
lawliet 7:1278e9dde24e 265 i++;
lawliet 7:1278e9dde24e 266 if(i > 100) {
lawliet 7:1278e9dde24e 267 i = 0;
lawliet 7:1278e9dde24e 268 break;
lawliet 7:1278e9dde24e 269 }
lawliet 7:1278e9dde24e 270 }
lawliet 7:1278e9dde24e 271 if(timeCnt.read() > 2) { // time out
lawliet 7:1278e9dde24e 272 timeCnt.stop();
lawliet 7:1278e9dde24e 273 timeCnt.reset();
lawliet 7:1278e9dde24e 274 break;
lawliet 7:1278e9dde24e 275 }
lawliet 7:1278e9dde24e 276 }
lawliet 1:642a8dbe076c 277 break;
lawliet 1:642a8dbe076c 278 }
lawliet 1:642a8dbe076c 279 }
lawliet 1:642a8dbe076c 280 if(NULL != strstr(gprsBuffer,"RING")) {
lawliet 4:63a2619b423b 281 return MESSAGE_RING;
lawliet 4:63a2619b423b 282 } else if(NULL != (s = strstr(gprsBuffer,"+CMT"))) { //SMS: $$+CMTI: "SM",24$$
lawliet 4:63a2619b423b 283 if(NULL != (s = strstr(gprsBuffer,"+32"))) {
lawliet 4:63a2619b423b 284 s += 6;
lawliet 4:63a2619b423b 285 int i = 0;
lawliet 4:63a2619b423b 286 cleanBuffer(messageBuffer,SMS_MAX_LENGTH);
lawliet 4:63a2619b423b 287 while((*s != '$')&&(i < SMS_MAX_LENGTH-1)) {
lawliet 4:63a2619b423b 288 messageBuffer[i++] = *(s++);
lawliet 4:63a2619b423b 289 }
lawliet 4:63a2619b423b 290 messageBuffer[i] = '\0';
lawliet 4:63a2619b423b 291 return MESSAGE_SMS;
lawliet 4:63a2619b423b 292 } else {
lawliet 4:63a2619b423b 293 goto START;
lawliet 1:642a8dbe076c 294 }
lawliet 4:63a2619b423b 295 } else {
lawliet 4:63a2619b423b 296 goto START;
lawliet 1:642a8dbe076c 297 }
lawliet 0:a5ae94727346 298 }
lawliet 0:a5ae94727346 299
screamer 10:24671d8aa0c9 300 int GSM::networkInit(char* apn, char* userName, char* passWord)
lawliet 5:ac2342f162fa 301 {
lawliet 5:ac2342f162fa 302 char cstt[64];
lawliet 5:ac2342f162fa 303 snprintf(cstt,sizeof(cstt),"AT+CSTT=\"%s\",\"%s\",\"%s\"\r\n",apn,userName,passWord);
lawliet 5:ac2342f162fa 304 if(0 != sendCmdAndWaitForResp(cstt, "OK", DEFAULT_TIMEOUT)) {
lawliet 5:ac2342f162fa 305 return -1;
lawliet 5:ac2342f162fa 306 }
lawliet 5:ac2342f162fa 307 return 0;
lawliet 5:ac2342f162fa 308 }
lawliet 0:a5ae94727346 309
screamer 10:24671d8aa0c9 310 int GSM::connectTCP(char *ip, char *port)
lawliet 0:a5ae94727346 311 {
lawliet 5:ac2342f162fa 312 char cipstart[64];
lawliet 5:ac2342f162fa 313 #if 0
lawliet 3:48ee24a4b0f3 314 if(0 != sendCmdAndWaitForResp("AT+CSTT=\"CMNET\",\"\",\"\"\r\n", "OK", 5)) {
lawliet 1:642a8dbe076c 315 return -1;
lawliet 1:642a8dbe076c 316 }
lawliet 5:ac2342f162fa 317 #endif
lawliet 1:642a8dbe076c 318 sprintf(cipstart, "AT+CIPSTART=\"TCP\",\"%s\",\"%s\"\r\n", ip, port);
lawliet 5:ac2342f162fa 319 if(0 != sendCmdAndWaitForResp(cipstart, "OK", DEFAULT_TIMEOUT)) {
lawliet 1:642a8dbe076c 320 return -1;
lawliet 1:642a8dbe076c 321 }
lawliet 1:642a8dbe076c 322 return 0;
lawliet 0:a5ae94727346 323 }
screamer 10:24671d8aa0c9 324 int GSM::sendTCPData(char *data)
lawliet 0:a5ae94727346 325 {
lawliet 1:642a8dbe076c 326 char cmd[64];
lawliet 1:642a8dbe076c 327 int len = strlen(data);
lawliet 1:642a8dbe076c 328 snprintf(cmd,sizeof(cmd),"AT+CIPSEND=%d\r\n",len);
lawliet 3:48ee24a4b0f3 329 if(0 != sendCmdAndWaitForResp(cmd,">",DEFAULT_TIMEOUT)) {
lawliet 1:642a8dbe076c 330 return -1;
lawliet 1:642a8dbe076c 331 }
lawliet 3:48ee24a4b0f3 332 if(0 != sendCmdAndWaitForResp(data,"OK",DEFAULT_TIMEOUT)) {
lawliet 1:642a8dbe076c 333 return -1;
lawliet 1:642a8dbe076c 334 }
lawliet 1:642a8dbe076c 335 return 0;
lawliet 0:a5ae94727346 336 }
lawliet 0:a5ae94727346 337
screamer 10:24671d8aa0c9 338 int GSM::closeTCP(void)
lawliet 0:a5ae94727346 339 {
lawliet 1:642a8dbe076c 340 sendCmd("AT+CIPCLOSE\r\n");
lawliet 1:642a8dbe076c 341 return 0;
lawliet 0:a5ae94727346 342 }
lawliet 0:a5ae94727346 343
screamer 10:24671d8aa0c9 344 int GSM::shutTCP(void)
lawliet 0:a5ae94727346 345 {
lawliet 1:642a8dbe076c 346 sendCmd("AT+CIPSHUT\r\n");
lawliet 1:642a8dbe076c 347 return 0;
lawliet 0:a5ae94727346 348 }