A library for the SIM900 module to enable calling, answering, sending and receiving SMS messages
Dependents: Seeed_GPRS_Shield_GSM BluetoothNONIN HealthCare_Graduation
Fork of GSM by
Revision 10:24671d8aa0c9, committed 2014-05-13
- Comitter:
- screamer
- Date:
- Tue May 13 14:43:57 2014 +0000
- Parent:
- 9:2f5445178940
- Commit message:
- Change the class name to GSM because this is what it does.
Changed in this revision
diff -r 2f5445178940 -r 24671d8aa0c9 GPRS.cpp --- a/GPRS.cpp Tue May 13 14:32:33 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,341 +0,0 @@ -/* - gprs.cpp - 2013 Copyright (c) Seeed Technology Inc. All right reserved. - - Author:lawliet.zou@gmail.com - 2013-11-14 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ -#include "GPRS.h" - -int GPRS::readBuffer(char *buffer,int count) -{ - int i = 0; - timeCnt.start(); // start timer - while(1) { - while (gprsSerial.readable()) { - char c = gprsSerial.getc(); - if (c == '\r' || c == '\n') c = '$'; - buffer[i++] = c; - if(i > count)break; - } - if(i > count)break; - if(timeCnt.read() > DEFAULT_TIMEOUT) { - timeCnt.stop(); - timeCnt.reset(); - break; - } - } - wait(0.5); - while(gprsSerial.readable()) { // display the other thing.. - char c = gprsSerial.getc(); - } - return 0; -} - -void cleanBuffer(char *buffer, int count) -{ - for(int i=0; i < count; i++) { - buffer[i] = '\0'; - } -} - -void GPRS::sendCmd(char *cmd) -{ - gprsSerial.puts(cmd); -} - -int GPRS::waitForResp(char *resp, int timeout) -{ - int len = strlen(resp); - int sum=0; - timeCnt.start(); - - while(1) { - if(gprsSerial.readable()) { - char c = gprsSerial.getc(); - sum = (c==resp[sum]) ? sum+1 : 0; - if(sum == len)break; - } - if(timeCnt.read() > timeout) { // time out - timeCnt.stop(); - timeCnt.reset(); - return -1; - } - } - timeCnt.stop(); // stop timer - timeCnt.reset(); // clear timer - while(gprsSerial.readable()) { // display the other thing.. - char c = gprsSerial.getc(); - } - - return 0; -} - -int GPRS::sendCmdAndWaitForResp(char *cmd, char *resp, int timeout) -{ - sendCmd(cmd); - return waitForResp(resp,timeout); -} - -int GPRS::powerCheck(void) -{ - return sendCmdAndWaitForResp("AT\r\n", "OK", 2); -} - -int GPRS::init(void) -{ - for(int i = 0; i < 3; i++){ - sendCmdAndWaitForResp("AT\r\n", "OK", DEFAULT_TIMEOUT); - wait(0.5); - } - if(0 != checkSIMStatus()) { - return -1; - } - if(checkSignalStrength()<1) { - return -1; - } - if(0 != settingSMS()) { - return -1; - } - return 0; -} - -int GPRS::checkSIMStatus(void) -{ - char gprsBuffer[30]; - int count = 0; - cleanBuffer(gprsBuffer,30); - while(count < 3) { - sendCmd("AT+CPIN?\r\n"); - readBuffer(gprsBuffer,30); - if((NULL != strstr(gprsBuffer,"+CPIN: READY"))) { - break; - } - count++; - wait(1); - } - - if(count == 3) { - return -1; - } - return 0; -} - -int GPRS::checkSignalStrength(void) -{ - char gprsBuffer[100]; - int index,count = 0; - cleanBuffer(gprsBuffer,100); - while(count < 3) { - sendCmd("AT+CSQ\r\n"); - readBuffer(gprsBuffer,25); - if(sscanf(gprsBuffer, "AT+CSQ$$$$+CSQ: %d", &index)>0) { - break; - } - count++; - wait(1); - } - if(count == 3) { - return -1; - } - return index; -} - -int GPRS::settingSMS(void) -{ - if(0 != sendCmdAndWaitForResp("AT+CNMI=2,2\r\n", "OK", DEFAULT_TIMEOUT)) { - return -1; - } - if(0 != sendCmdAndWaitForResp("AT+CMGF=1\r\n", "OK", DEFAULT_TIMEOUT)) { - return -1; - } - return 0; -} - -int GPRS::sendSMS(char *number, char *data) -{ - char cmd[64]; - while(gprsSerial.readable()) { - char c = gprsSerial.getc(); - } - snprintf(cmd, sizeof(cmd),"AT+CMGS=\"%s\"\r\n",number); - if(0 != sendCmdAndWaitForResp(cmd,">",DEFAULT_TIMEOUT)) { - return -1; - } - wait(1); - gprsSerial.puts(data); - gprsSerial.putc((char)0x1a); - return 0; -} - -int GPRS::readSMS(char *message, int index) -{ - int i = 0; - char gprsBuffer[100]; - char *p,*s; - gprsSerial.printf("AT+CMGR=%d\r\n",index); - cleanBuffer(gprsBuffer,100); - readBuffer(gprsBuffer,100); - if(NULL == ( s = strstr(gprsBuffer,"+CMGR"))) { - return -1; - } - if(NULL != ( s = strstr(gprsBuffer,"+32"))) { - p = s + 6; - while((*p != '$')&&(i < SMS_MAX_LENGTH-1)) { - message[i++] = *(p++); - } - message[i] = '\0'; - } - return 0; -} - -int GPRS::deleteSMS(int index) -{ - char cmd[32]; - snprintf(cmd,sizeof(cmd),"AT+CMGD=%d\r\n",index); - sendCmd(cmd); - return 0; -} - -int GPRS::getSMS(char* message) -{ - if(NULL != messageBuffer) { - strncpy(message,messageBuffer,SMS_MAX_LENGTH); - } - return 0; -} - -int GPRS::callUp(char *number) -{ - if(0 != sendCmdAndWaitForResp("AT+COLP=1\r\n","OK",5)) { - return -1; - } - wait(1); - gprsSerial.printf("\r\nATD%s;\r\n",NULL==number?phoneNumber:number); - return 0; -} - -int GPRS::answer(void) -{ - gprsSerial.printf("ATA\r\n"); - return 0; -} - -int GPRS::loopHandle(void) -{ - char gprsBuffer[100]; - int i; - char *s = NULL; - while(gprsSerial.readable()) { - char c = gprsSerial.getc(); - } - wait(0.5); -START: - cleanBuffer(gprsBuffer,100); - i = 0; - while(1) { - if(gprsSerial.readable()) { - timeCnt.start(); // start timer - while(1) { - while (gprsSerial.readable()) { - char c = gprsSerial.getc(); - if (c == '\r' || c == '\n') c = '$'; - gprsBuffer[i] = c; - i++; - if(i > 100) { - i = 0; - break; - } - } - if(timeCnt.read() > 2) { // time out - timeCnt.stop(); - timeCnt.reset(); - break; - } - } - break; - } - } - if(NULL != strstr(gprsBuffer,"RING")) { - return MESSAGE_RING; - } else if(NULL != (s = strstr(gprsBuffer,"+CMT"))) { //SMS: $$+CMTI: "SM",24$$ - if(NULL != (s = strstr(gprsBuffer,"+32"))) { - s += 6; - int i = 0; - cleanBuffer(messageBuffer,SMS_MAX_LENGTH); - while((*s != '$')&&(i < SMS_MAX_LENGTH-1)) { - messageBuffer[i++] = *(s++); - } - messageBuffer[i] = '\0'; - return MESSAGE_SMS; - } else { - goto START; - } - } else { - goto START; - } -} - -int GPRS::networkInit(char* apn, char* userName, char* passWord) -{ - char cstt[64]; - snprintf(cstt,sizeof(cstt),"AT+CSTT=\"%s\",\"%s\",\"%s\"\r\n",apn,userName,passWord); - if(0 != sendCmdAndWaitForResp(cstt, "OK", DEFAULT_TIMEOUT)) { - return -1; - } - return 0; -} - -int GPRS::connectTCP(char *ip, char *port) -{ - char cipstart[64]; -#if 0 - if(0 != sendCmdAndWaitForResp("AT+CSTT=\"CMNET\",\"\",\"\"\r\n", "OK", 5)) { - return -1; - } -#endif - sprintf(cipstart, "AT+CIPSTART=\"TCP\",\"%s\",\"%s\"\r\n", ip, port); - if(0 != sendCmdAndWaitForResp(cipstart, "OK", DEFAULT_TIMEOUT)) { - return -1; - } - return 0; -} -int GPRS::sendTCPData(char *data) -{ - char cmd[64]; - int len = strlen(data); - snprintf(cmd,sizeof(cmd),"AT+CIPSEND=%d\r\n",len); - if(0 != sendCmdAndWaitForResp(cmd,">",DEFAULT_TIMEOUT)) { - return -1; - } - if(0 != sendCmdAndWaitForResp(data,"OK",DEFAULT_TIMEOUT)) { - return -1; - } - return 0; -} - -int GPRS::closeTCP(void) -{ - sendCmd("AT+CIPCLOSE\r\n"); - return 0; -} - -int GPRS::shutTCP(void) -{ - sendCmd("AT+CIPSHUT\r\n"); - return 0; -}
diff -r 2f5445178940 -r 24671d8aa0c9 GPRS.h --- a/GPRS.h Tue May 13 14:32:33 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,221 +0,0 @@ -/* - gprs.h - 2013 Copyright (c) Seeed Technology Inc. All right reserved. - - Author:lawliet.zou@gmail.com - 2013-11-14 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef __GPRS_H__ -#define __GPRS_H__ - -#include <stdio.h> -#include "mbed.h" - -#define DEFAULT_TIMEOUT 5 -#define SMS_MAX_LENGTH 16 - - -enum GPRS_MESSAGE { - MESSAGE_RING = 0, - MESSAGE_SMS = 1, - MESSAGE_ERROR -}; - - -/** GPRS class. - * Used for mobile communication. attention that GPRS module communicate with MCU in serial protocol - */ -class GPRS -{ -public: - /** Create GPRS instance - * @param tx uart transmit pin to communicate with GPRS module - * @param rx uart receive pin to communicate with GPRS module - * @param baudRate baud rate of uart communication - * @param number default phone number during mobile communication - */ - GPRS(PinName tx, PinName rx, int baudRate,char *number) : gprsSerial(tx, rx) { - //gprsSerial.baud(baudRate); - phoneNumber = number; - }; - - int powerCheck(void); - /** init GPRS module including SIM card check & signal strength & network check - * @returns - * 0 on success, - * -1 on error - */ - int init(void); - - /** Check SIM card' Status - * @returns - * 0 on success, - * -1 on error - */ - int checkSIMStatus(void); - - /** Check signal strength - * @returns - * signal strength in number(ex 3,4,5,6,7,8...) on success, - * -1 on error - */ - int checkSignalStrength(void); - - /** Set SMS format and processing mode - * @returns - * 0 on success, - * -1 on error - */ - int settingSMS(void); - - /** Send text SMS - * @param *number phone number which SMS will be send to - * @param *data message that will be send to - * @returns - * 0 on success, - * -1 on error - */ - int sendSMS(char *number, char *data); - - /** Read SMS by index - * @param *message buffer used to get SMS message - * @param index which SMS message to read - * @returns - * 0 on success, - * -1 on error - */ - int readSMS(char *message, int index); - - /** Delete SMS message on SIM card - * @param *index the index number which SMS message will be delete - * @returns - * 0 on success, - * -1 on error - */ - int deleteSMS(int index); - - /** Read SMS when coming a message,it will be store in messageBuffer. - * @param message buffer used to get SMS message - */ - int getSMS(char* message); - - /** Call someone - * @param *number the phone number which you want to call - * @returns - * 0 on success, - * -1 on error - */ - int callUp(char *number); - - /** Auto answer if coming a call - * @returns - * 0 on success, - * -1 on error - */ - int answer(void); - - /** A loop to wait for some event. if a call comes in, it will auto answer it and if a SMS message comes in, it will read the message - * @param *check whether to check phone number when get event - * @returns - * 0 on success, - * -1 on error - */ - int loopHandle(void); - - /** GPRS network init - * @param *apn Access Point Name to connect network - * @param *userName general is empty - * @param *passWord general is empty - */ - - int networkInit(char* apn, char* userName = NULL, char* passWord = NULL); - /** Build TCP connect - * @param *ip ip address which will connect to - * @param *port TCP server' port number - * @returns - * 0 on success, - * -1 on error - */ - int connectTCP(char *ip, char *port); - - /** Send data to TCP server - * @param *data data that will be send to TCP server - * @returns - * 0 on success, - * -1 on error - */ - int sendTCPData(char *data); - - /** Close TCP connection - * @returns - * 0 on success, - * -1 on error - */ - int closeTCP(void); - - /** Close TCP service - * @returns - * 0 on success, - * -1 on error - */ - int shutTCP(void); - - Serial gprsSerial; - //USBSerial pc; - -private: - /** Read from GPRS module and save to buffer array - * @param *buffer buffer array to save what read from GPRS module - * @param *count the maximal bytes number read from GPRS module - * @returns - * 0 on success, - * -1 on error - */ - int readBuffer(char *buffer,int count); - - /** Send AT command to GPRS module - * @param *cmd command array which will be send to GPRS module - */ - void sendCmd(char *cmd); - - /** Check GPRS module response before timeout - * @param *resp correct response which GPRS module will return - * @param *timeout waiting seconds till timeout - * @returns - * 0 on success, - * -1 on error - */ - int waitForResp(char *resp, int timeout); - - /** Send AT command to GPRS module and wait for correct response - * @param *cmd AT command which will be send to GPRS module - * @param *resp correct response which GPRS module will return - * @param *timeout waiting seconds till timeout - * @returns - * 0 on success, - * -1 on error - */ - int sendCmdAndWaitForResp(char *cmd, char *resp, int timeout); - - Timer timeCnt; - char *phoneNumber; - char messageBuffer[SMS_MAX_LENGTH]; -}; - -#endif -
diff -r 2f5445178940 -r 24671d8aa0c9 GSM.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GSM.cpp Tue May 13 14:43:57 2014 +0000 @@ -0,0 +1,341 @@ +/* + GSM.cpp + 2013 Copyright (c) Seeed Technology Inc. All right reserved. + + Author:lawliet.zou@gmail.com + 2013-11-14 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ +#include "GSM.h" + +int GSM::readBuffer(char *buffer,int count) +{ + int i = 0; + timeCnt.start(); // start timer + while(1) { + while (gprsSerial.readable()) { + char c = gprsSerial.getc(); + if (c == '\r' || c == '\n') c = '$'; + buffer[i++] = c; + if(i > count)break; + } + if(i > count)break; + if(timeCnt.read() > DEFAULT_TIMEOUT) { + timeCnt.stop(); + timeCnt.reset(); + break; + } + } + wait(0.5); + while(gprsSerial.readable()) { // display the other thing.. + char c = gprsSerial.getc(); + } + return 0; +} + +void cleanBuffer(char *buffer, int count) +{ + for(int i=0; i < count; i++) { + buffer[i] = '\0'; + } +} + +void GSM::sendCmd(char *cmd) +{ + gprsSerial.puts(cmd); +} + +int GSM::waitForResp(char *resp, int timeout) +{ + int len = strlen(resp); + int sum=0; + timeCnt.start(); + + while(1) { + if(gprsSerial.readable()) { + char c = gprsSerial.getc(); + sum = (c==resp[sum]) ? sum+1 : 0; + if(sum == len)break; + } + if(timeCnt.read() > timeout) { // time out + timeCnt.stop(); + timeCnt.reset(); + return -1; + } + } + timeCnt.stop(); // stop timer + timeCnt.reset(); // clear timer + while(gprsSerial.readable()) { // display the other thing.. + char c = gprsSerial.getc(); + } + + return 0; +} + +int GSM::sendCmdAndWaitForResp(char *cmd, char *resp, int timeout) +{ + sendCmd(cmd); + return waitForResp(resp,timeout); +} + +int GSM::powerCheck(void) +{ + return sendCmdAndWaitForResp("AT\r\n", "OK", 2); +} + +int GSM::init(void) +{ + for(int i = 0; i < 3; i++){ + sendCmdAndWaitForResp("AT\r\n", "OK", DEFAULT_TIMEOUT); + wait(0.5); + } + if(0 != checkSIMStatus()) { + return -1; + } + if(checkSignalStrength()<1) { + return -1; + } + if(0 != settingSMS()) { + return -1; + } + return 0; +} + +int GSM::checkSIMStatus(void) +{ + char gprsBuffer[30]; + int count = 0; + cleanBuffer(gprsBuffer,30); + while(count < 3) { + sendCmd("AT+CPIN?\r\n"); + readBuffer(gprsBuffer,30); + if((NULL != strstr(gprsBuffer,"+CPIN: READY"))) { + break; + } + count++; + wait(1); + } + + if(count == 3) { + return -1; + } + return 0; +} + +int GSM::checkSignalStrength(void) +{ + char gprsBuffer[100]; + int index,count = 0; + cleanBuffer(gprsBuffer,100); + while(count < 3) { + sendCmd("AT+CSQ\r\n"); + readBuffer(gprsBuffer,25); + if(sscanf(gprsBuffer, "AT+CSQ$$$$+CSQ: %d", &index)>0) { + break; + } + count++; + wait(1); + } + if(count == 3) { + return -1; + } + return index; +} + +int GSM::settingSMS(void) +{ + if(0 != sendCmdAndWaitForResp("AT+CNMI=2,2\r\n", "OK", DEFAULT_TIMEOUT)) { + return -1; + } + if(0 != sendCmdAndWaitForResp("AT+CMGF=1\r\n", "OK", DEFAULT_TIMEOUT)) { + return -1; + } + return 0; +} + +int GSM::sendSMS(char *number, char *data) +{ + char cmd[64]; + while(gprsSerial.readable()) { + char c = gprsSerial.getc(); + } + snprintf(cmd, sizeof(cmd),"AT+CMGS=\"%s\"\r\n",number); + if(0 != sendCmdAndWaitForResp(cmd,">",DEFAULT_TIMEOUT)) { + return -1; + } + wait(1); + gprsSerial.puts(data); + gprsSerial.putc((char)0x1a); + return 0; +} + +int GSM::readSMS(char *message, int index) +{ + int i = 0; + char gprsBuffer[100]; + char *p,*s; + gprsSerial.printf("AT+CMGR=%d\r\n",index); + cleanBuffer(gprsBuffer,100); + readBuffer(gprsBuffer,100); + if(NULL == ( s = strstr(gprsBuffer,"+CMGR"))) { + return -1; + } + if(NULL != ( s = strstr(gprsBuffer,"+32"))) { + p = s + 6; + while((*p != '$')&&(i < SMS_MAX_LENGTH-1)) { + message[i++] = *(p++); + } + message[i] = '\0'; + } + return 0; +} + +int GSM::deleteSMS(int index) +{ + char cmd[32]; + snprintf(cmd,sizeof(cmd),"AT+CMGD=%d\r\n",index); + sendCmd(cmd); + return 0; +} + +int GSM::getSMS(char* message) +{ + if(NULL != messageBuffer) { + strncpy(message,messageBuffer,SMS_MAX_LENGTH); + } + return 0; +} + +int GSM::callUp(char *number) +{ + if(0 != sendCmdAndWaitForResp("AT+COLP=1\r\n","OK",5)) { + return -1; + } + wait(1); + gprsSerial.printf("\r\nATD%s;\r\n",NULL==number?phoneNumber:number); + return 0; +} + +int GSM::answer(void) +{ + gprsSerial.printf("ATA\r\n"); + return 0; +} + +int GSM::loopHandle(void) +{ + char gprsBuffer[100]; + int i; + char *s = NULL; + while(gprsSerial.readable()) { + char c = gprsSerial.getc(); + } + wait(0.5); +START: + cleanBuffer(gprsBuffer,100); + i = 0; + while(1) { + if(gprsSerial.readable()) { + timeCnt.start(); // start timer + while(1) { + while (gprsSerial.readable()) { + char c = gprsSerial.getc(); + if (c == '\r' || c == '\n') c = '$'; + gprsBuffer[i] = c; + i++; + if(i > 100) { + i = 0; + break; + } + } + if(timeCnt.read() > 2) { // time out + timeCnt.stop(); + timeCnt.reset(); + break; + } + } + break; + } + } + if(NULL != strstr(gprsBuffer,"RING")) { + return MESSAGE_RING; + } else if(NULL != (s = strstr(gprsBuffer,"+CMT"))) { //SMS: $$+CMTI: "SM",24$$ + if(NULL != (s = strstr(gprsBuffer,"+32"))) { + s += 6; + int i = 0; + cleanBuffer(messageBuffer,SMS_MAX_LENGTH); + while((*s != '$')&&(i < SMS_MAX_LENGTH-1)) { + messageBuffer[i++] = *(s++); + } + messageBuffer[i] = '\0'; + return MESSAGE_SMS; + } else { + goto START; + } + } else { + goto START; + } +} + +int GSM::networkInit(char* apn, char* userName, char* passWord) +{ + char cstt[64]; + snprintf(cstt,sizeof(cstt),"AT+CSTT=\"%s\",\"%s\",\"%s\"\r\n",apn,userName,passWord); + if(0 != sendCmdAndWaitForResp(cstt, "OK", DEFAULT_TIMEOUT)) { + return -1; + } + return 0; +} + +int GSM::connectTCP(char *ip, char *port) +{ + char cipstart[64]; +#if 0 + if(0 != sendCmdAndWaitForResp("AT+CSTT=\"CMNET\",\"\",\"\"\r\n", "OK", 5)) { + return -1; + } +#endif + sprintf(cipstart, "AT+CIPSTART=\"TCP\",\"%s\",\"%s\"\r\n", ip, port); + if(0 != sendCmdAndWaitForResp(cipstart, "OK", DEFAULT_TIMEOUT)) { + return -1; + } + return 0; +} +int GSM::sendTCPData(char *data) +{ + char cmd[64]; + int len = strlen(data); + snprintf(cmd,sizeof(cmd),"AT+CIPSEND=%d\r\n",len); + if(0 != sendCmdAndWaitForResp(cmd,">",DEFAULT_TIMEOUT)) { + return -1; + } + if(0 != sendCmdAndWaitForResp(data,"OK",DEFAULT_TIMEOUT)) { + return -1; + } + return 0; +} + +int GSM::closeTCP(void) +{ + sendCmd("AT+CIPCLOSE\r\n"); + return 0; +} + +int GSM::shutTCP(void) +{ + sendCmd("AT+CIPSHUT\r\n"); + return 0; +}
diff -r 2f5445178940 -r 24671d8aa0c9 GSM.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GSM.h Tue May 13 14:43:57 2014 +0000 @@ -0,0 +1,221 @@ +/* + GSM.h + 2013 Copyright (c) Seeed Technology Inc. All right reserved. + + Author:lawliet.zou@gmail.com + 2013-11-14 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef __GSM_H__ +#define __GSM_H__ + +#include <stdio.h> +#include "mbed.h" + +#define DEFAULT_TIMEOUT 5 +#define SMS_MAX_LENGTH 16 + + +enum GSM_MESSAGE { + MESSAGE_RING = 0, + MESSAGE_SMS = 1, + MESSAGE_ERROR +}; + + +/** GSM class. + * Used for mobile communication. attention that GSM module communicate with MCU in serial protocol + */ +class GSM +{ +public: + /** Create GSM instance + * @param tx uart transmit pin to communicate with GSM module + * @param rx uart receive pin to communicate with GSM module + * @param baudRate baud rate of uart communication + * @param number default phone number during mobile communication + */ + GSM(PinName tx, PinName rx, int baudRate,char *number) : gprsSerial(tx, rx) { + //gprsSerial.baud(baudRate); + phoneNumber = number; + }; + + int powerCheck(void); + /** init GSM module including SIM card check & signal strength & network check + * @returns + * 0 on success, + * -1 on error + */ + int init(void); + + /** Check SIM card' Status + * @returns + * 0 on success, + * -1 on error + */ + int checkSIMStatus(void); + + /** Check signal strength + * @returns + * signal strength in number(ex 3,4,5,6,7,8...) on success, + * -1 on error + */ + int checkSignalStrength(void); + + /** Set SMS format and processing mode + * @returns + * 0 on success, + * -1 on error + */ + int settingSMS(void); + + /** Send text SMS + * @param *number phone number which SMS will be send to + * @param *data message that will be send to + * @returns + * 0 on success, + * -1 on error + */ + int sendSMS(char *number, char *data); + + /** Read SMS by index + * @param *message buffer used to get SMS message + * @param index which SMS message to read + * @returns + * 0 on success, + * -1 on error + */ + int readSMS(char *message, int index); + + /** Delete SMS message on SIM card + * @param *index the index number which SMS message will be delete + * @returns + * 0 on success, + * -1 on error + */ + int deleteSMS(int index); + + /** Read SMS when coming a message,it will be store in messageBuffer. + * @param message buffer used to get SMS message + */ + int getSMS(char* message); + + /** Call someone + * @param *number the phone number which you want to call + * @returns + * 0 on success, + * -1 on error + */ + int callUp(char *number); + + /** Auto answer if coming a call + * @returns + * 0 on success, + * -1 on error + */ + int answer(void); + + /** A loop to wait for some event. if a call comes in, it will auto answer it and if a SMS message comes in, it will read the message + * @param *check whether to check phone number when get event + * @returns + * 0 on success, + * -1 on error + */ + int loopHandle(void); + + /** GSM network init + * @param *apn Access Point Name to connect network + * @param *userName general is empty + * @param *passWord general is empty + */ + + int networkInit(char* apn, char* userName = NULL, char* passWord = NULL); + /** Build TCP connect + * @param *ip ip address which will connect to + * @param *port TCP server' port number + * @returns + * 0 on success, + * -1 on error + */ + int connectTCP(char *ip, char *port); + + /** Send data to TCP server + * @param *data data that will be send to TCP server + * @returns + * 0 on success, + * -1 on error + */ + int sendTCPData(char *data); + + /** Close TCP connection + * @returns + * 0 on success, + * -1 on error + */ + int closeTCP(void); + + /** Close TCP service + * @returns + * 0 on success, + * -1 on error + */ + int shutTCP(void); + + Serial gprsSerial; + //USBSerial pc; + +private: + /** Read from GSM module and save to buffer array + * @param *buffer buffer array to save what read from GSM module + * @param *count the maximal bytes number read from GSM module + * @returns + * 0 on success, + * -1 on error + */ + int readBuffer(char *buffer,int count); + + /** Send AT command to GSM module + * @param *cmd command array which will be send to GSM module + */ + void sendCmd(char *cmd); + + /** Check GSM module response before timeout + * @param *resp correct response which GSM module will return + * @param *timeout waiting seconds till timeout + * @returns + * 0 on success, + * -1 on error + */ + int waitForResp(char *resp, int timeout); + + /** Send AT command to GSM module and wait for correct response + * @param *cmd AT command which will be send to GSM module + * @param *resp correct response which GSM module will return + * @param *timeout waiting seconds till timeout + * @returns + * 0 on success, + * -1 on error + */ + int sendCmdAndWaitForResp(char *cmd, char *resp, int timeout); + + Timer timeCnt; + char *phoneNumber; + char messageBuffer[SMS_MAX_LENGTH]; +}; + +#endif +