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 4:63a2619b423b, committed 2014-01-21
- Comitter:
- lawliet
- Date:
- Tue Jan 21 06:44:58 2014 +0000
- Parent:
- 3:48ee24a4b0f3
- Child:
- 5:ac2342f162fa
- Commit message:
- verison 2.0 (fix several errors)
Changed in this revision
| gprs.cpp | Show annotated file Show diff for this revision Revisions of this file |
| gprs.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/gprs.cpp Fri Jan 10 05:59:36 2014 +0000
+++ b/gprs.cpp Tue Jan 21 06:44:58 2014 +0000
@@ -19,24 +19,8 @@
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::init(void)
-{
- wait(0.5);
- sendCmd("AT+CFUN=1\r\n");
- wait(1);
- if(0 != checkSIMStatus()) { //check SIM card status
- return -1;
- }
- if(checkSignalStrength()<1) { //check Signal Strength
- return -1;
- }
- return 0;
-}
-
int GPRS::readBuffer(char *buffer,int count)
{
int i = 0;
@@ -101,14 +85,26 @@
return 0;
}
-
-
int GPRS::sendCmdAndWaitForResp(char *cmd, char *resp, int timeout)
{
sendCmd(cmd);
return waitForResp(resp,timeout);
}
+int GPRS::init(void)
+{
+ if(0 != checkSIMStatus()) {
+ return -1;
+ }
+ if(checkSignalStrength()<1) {
+ return -1;
+ }
+ if(0 != settingSMS()) {
+ return -1;
+ }
+ return 0;
+}
+
int GPRS::checkSIMStatus(void)
{
char gprsBuffer[30];
@@ -150,67 +146,70 @@
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];
- if(0 != sendCmdAndWaitForResp("AT+CMGF=1\r\n", "OK", DEFAULT_TIMEOUT)) { // Set message mode to ASCII
- return -1;
+ while(gprsSerial.readable()) {
+ char c = gprsSerial.getc();
}
- wait(0.5);
- // Set the phone number
- snprintf(cmd, sizeof(cmd),"AT+CMGS=\"%s\"\r\n", number);
+ snprintf(cmd, sizeof(cmd),"AT+CMGS=\"%s\"\r\n",number);
if(0 != sendCmdAndWaitForResp(cmd,">",DEFAULT_TIMEOUT)) {
return -1;
}
wait(1);
- gprsSerial.puts(data);// Send Message
- wait(0.5);
- gprsSerial.putc(0x1A);//end mark
+ gprsSerial.puts(data);
+ gprsSerial.putc((char)0x1a);
return 0;
}
-int GPRS::readSMS(char *buffer, char *message, bool check)
+int GPRS::readSMS(char *message, int index)
{
- int index,i = 0;
+ int i = 0;
char gprsBuffer[100];
char *p,*s;
-
- if(sscanf(buffer, "$$+CMTI: \"SM\",%d", &index)>0) {
- gprsSerial.printf("AT+CMGR=%d\r\n", index);
- } else {
- return -1;
- }
+ gprsSerial.printf("AT+CMGR=%d\r\n",index);
cleanBuffer(gprsBuffer,100);
readBuffer(gprsBuffer,100);
- if(NULL == ( s = strstr(gprsBuffer,"+CMGR: \"REC UNREAD\""))) {
+ if(NULL == ( s = strstr(gprsBuffer,"+CMGR"))) {
return -1;
}
-
- //check phone number
- if(check) {
- char number[20];
- snprintf(number,sizeof(number),"\"+86%s\"",phoneNumber); //for China
- p = s + 20;
- if(0 != (strncmp(number,p,14))) {
- return -1;
+ if(NULL != ( s = strstr(gprsBuffer,"+32"))) {
+ p = s + 6;
+ while((*p != '$')&&(i < SMS_MAX_LENGTH-1)) {
+ message[i++] = *(p++);
}
+ message[i] = '\0';
}
- p = s + 64;
- while(*p != '$') {
- message[i++] = *(p++);
- }
- message[i] = '\0';
return 0;
}
int GPRS::deleteSMS(int index)
{
- char cmd[64];
+ 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)) {
@@ -227,18 +226,23 @@
return 0;
}
-int GPRS::loop(bool check)
+int GPRS::loopHandle(void)
{
char gprsBuffer[100];
int i = 0;
+ char *s = NULL;
cleanBuffer(gprsBuffer,100);
+ while(gprsSerial.readable()) {
+ char c = gprsSerial.getc();
+ }
+ wait(1);
+START:
while(1) {
if(gprsSerial.readable()) {
break;
}
wait(1);
}
-
timeCnt.start(); // start timer
while(1) {
while (gprsSerial.readable()) {
@@ -257,21 +261,27 @@
break;
}
}
-
if(NULL != strstr(gprsBuffer,"RING")) {
- if(0 != answer()) {
+ 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 if(NULL != strstr(gprsBuffer,"$$+CMTI: \"SM\"")) { //SMS: $$+CMTI: "SM",24$$
- char message[64];
- if(0 != readSMS(gprsBuffer, message, check)) {
- }
+ } else {
+ goto START;
}
- return 0;
}
-/****************************************GPRS TCP CONNECT************************************/
-
int GPRS::connectTCP(char *ip, char *port)
{
char cipstart[50];
@@ -309,29 +319,3 @@
sendCmd("AT+CIPSHUT\r\n");
return 0;
}
-
-/****************************************GPRS DEBUG******************************************/
-void GPRS::serialDebug(PinName tx, PinName rx)
-{
- char buffer[64];
- int count = 0;
- Serial pc(tx,rx);
- while(1) {
- if(gprsSerial.readable()) {
- while(gprsSerial.readable()) {
- char c = gprsSerial.getc();
- buffer[count++] = c;
- if(count == 64) break;
- }
- pc.puts(buffer);
- for(int i = 0; i < count; i++) {
- buffer[i] = NULL;
- }
- count = 0;
- }
-
- if(pc.readable()) {
- gprsSerial.putc(pc.getc());
- }
- }
-}
--- a/gprs.h Fri Jan 10 05:59:36 2014 +0000
+++ b/gprs.h Tue Jan 21 06:44:58 2014 +0000
@@ -27,6 +27,14 @@
#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
@@ -52,6 +60,115 @@
*/
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);
+
+ /** 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);
+
+
+ //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
@@ -85,116 +202,11 @@
*/
int sendCmdAndWaitForResp(char *cmd, char *resp, int timeout);
- /** 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);
-
- /** check network is ok or not
- * @returns
- * 0 on success
- * -1 on error
- */
- int networkInit(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 if get a SMS
- * @param *buffer buffer that get from GPRS module(when getting a SMS, GPRS module will return a buffer array)
- * @param *message buffer used to get SMS message
- * @param check whether to check phone number(we may only want to read SMS from specified phone number)
- * @returns
- * 0 on success
- * -1 on error
- */
- int readSMS(char *buffer, char *message, bool check);
-
- /** 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);
-
- /** 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 loop(bool check);
-
- /** 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);
-
- /** used for serial debug, you can specify tx and rx pin and then communicate with GPRS module with common AT commands
- */
- void serialDebug(PinName tx, PinName rx);
-
-private:
Serial gprsSerial;
Timer timeCnt;
char *phoneNumber;
+ char messageBuffer[SMS_MAX_LENGTH];
};
#endif
+
