tes sim 5360
Revision 0:bf27ed7867b7, committed 2020-03-17
- Comitter:
- irsanjul
- Date:
- Tue Mar 17 09:22:08 2020 +0000
- Commit message:
- tes sim 5360
Changed in this revision
SIM5360.cpp | Show annotated file Show diff for this revision Revisions of this file |
SIM5360.h | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SIM5360.cpp Tue Mar 17 09:22:08 2020 +0000 @@ -0,0 +1,416 @@ +#include "SIM5360.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::purge(void) +{ + while(gprsSerial.readable()) + { + gprsSerial.getc(); + } +} + +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) +{ + int i=10; + + while (i--) { + // purge any messages + purge(); + + // check interface + int r = sendCmdAndWaitForResp("AT\r\n", "OK", DEFAULT_TIMEOUT); + wait_ms(100); + if(r == 0) break; + } + if (i < 0) { + goto failure; + } + + if(0 != sendCmdAndWaitForResp("ATE0\r\n", "OK", DEFAULT_TIMEOUT)) + goto failure; + + if(0 != sendCmdAndWaitForResp("AT+CMEE=2\r\n", "OK", DEFAULT_TIMEOUT)) + goto failure; + + if(0 != checkSIMStatus()) { + goto failure; + } + + if(0 != sendCmdAndWaitForResp("AT+CGREG=1\r\n", "OK", DEFAULT_TIMEOUT)){ + goto failure; + } + + if(0 != sendCmdAndWaitForResp("AT+CREG=1\r\n", "OK", DEFAULT_TIMEOUT)){ + goto failure; + } + + if(0 != settingSMS()){ + goto failure; + } + + return 0; + + failure: + return -1; +} + +int GSM::registerNet(void) +{ + int ret = -1; + int i = 10; + while(i--){ + int r = checkNetStatus(); + if(r == 0){ + ret = 0; + break; + } + wait_ms(1000); + } + + if(checkSignalStrength()<1) { + goto failure; + } + + failure: + return ret; +} + +int GSM::checkNetStatus(void) +{ + int netReg = -1; + int gprsReg = -1; + char gprsBuffer[30]; + cleanBuffer(gprsBuffer,30); + + sendCmd("AT+CREG?\r\n"); + readBuffer(gprsBuffer,30); + if((NULL != strstr(gprsBuffer,"+CREG: 0,1"))) { + netReg = 0; + } + + wait_ms(100); + sendCmd("AT+CREG?\r\n"); + readBuffer(gprsBuffer,30); + if((NULL != strstr(gprsBuffer,"+CGREG: 0,1"))) { + gprsReg = 0; + } + + return netReg | gprsReg; +} + +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::join(char* apn, char* userName, char* passWord) +{ + char gprsBuffer[64]; + int ret = 0; + + cleanBuffer(gprsBuffer,64); + snprintf(gprsBuffer,sizeof(gprsBuffer),"AT+CGSOCKCONT=1,\"IP\",\"%s\"\r\n", apn); + if(0 != sendCmdAndWaitForResp(gprsBuffer, "OK", DEFAULT_TIMEOUT)) { + ret = -1; + goto failure; + } + + cleanBuffer(gprsBuffer,64); + snprintf(gprsBuffer,sizeof(gprsBuffer),"AT+CSOCKAUTH=1,1,\"%s\",\"%s\"\r\n", passWord, userName); + if(0 != sendCmdAndWaitForResp(gprsBuffer, "OK", DEFAULT_TIMEOUT)) { + ret = -1; + goto failure; + } + + if(0 != sendCmdAndWaitForResp("AT+CSOCKSETPN=1\r\n", "OK", DEFAULT_TIMEOUT)) { + ret = -1; + goto failure; + } + + if(0 != sendCmdAndWaitForResp("AT+CIPMODE=0\r\n", "OK", DEFAULT_TIMEOUT)) { + ret = -1; + goto failure; + } + + if(0 != sendCmdAndWaitForResp("AT+NETOPEN\r\n", "OK", DEFAULT_TIMEOUT)) { + ret = -1; + goto failure; + } + + failure: + return ret; + +} + +int GSM::SetBlocking(int netopen_to, int cipopen_to, int cipsend_to) +{ + int ret = 0; + char gprsBuffer[64]; + + cleanBuffer(gprsBuffer,64); + snprintf(gprsBuffer,sizeof(gprsBuffer),"AT+CIPTIMEOUT=%d,%d,%d\r\n", netopen_to, cipopen_to, cipsend_to); + if(0 != sendCmdAndWaitForResp(gprsBuffer, "OK", DEFAULT_TIMEOUT)) { + ret = -1; + goto failure; + } + + failure: + return ret; +} + +int GSM::connectTCP(char *ip, int port) +{ + int ret = 0; + char cipstart[64]; +#if 0 + if(0 != sendCmdAndWaitForResp("AT+CIPOPEN=0,\"TCP\",\"\",\r\n", "OK", 5)) { + ret = -1; + goto failure; + } +#endif + sprintf(cipstart, "AT+CIPOPEN=0,\"TCP\",\"%s\",%d\r\n", ip, port); + if(0 != sendCmdAndWaitForResp(cipstart, "OK", DEFAULT_TIMEOUT)) { + ret = -1; + goto failure; + } + + purge(); + + failure: + return ret; +} + +int GSM::sendTCPData(char *data, int len) +{ + int ret = 0; + char cmd[64]; + + snprintf(cmd,sizeof(cmd),"AT+CIPSEND=0,%d\r\n",len); + if(0 != sendCmdAndWaitForResp(cmd,">",DEFAULT_TIMEOUT)) { + ret = -1; + goto failure; + } + + if(0 != sendCmdAndWaitForResp(data,"OK",DEFAULT_TIMEOUT)) { + ret = -1; + goto failure; + } + + failure: + return ret; +} + +int GSM::receivedTCPData(char *buff, int len) +{ + readBuffer(buff, len); + + if(strlen(buff) <= 0) return -1; + + return 0; +} + +int GSM::closeTCP(void) +{ + if(0 != sendCmdAndWaitForResp("AT+CIPCLOSE\r\n","OK",DEFAULT_TIMEOUT)) { + return -1; + } + return 0; +} + +int GSM::disconnect(void) +{ + if(0 != sendCmdAndWaitForResp("AT+NETCLOSE\r\n","OK",DEFAULT_TIMEOUT)) { + return -1; + } + return 0; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SIM5360.h Tue Mar 17 09:22:08 2020 +0000 @@ -0,0 +1,229 @@ +#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); + + /** Register Network of GSM module including signal strength & network check + * @returns + * 0 on success, + * -1 on error + */ + int registerNet(void); + + /** Check network status of GSM module + * @returns + * 0 on success, + * -1 on error + */ + int checkNetStatus(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); + + /** Join GSM network + * @param *apn Access Point Name to connect network + * @param *userName general is empty + * @param *passWord general is empty + */ + int join(char* apn, char* userName = NULL, char* passWord = NULL); + + /** Disconnect from network + * @returns + * 0 on success, + * -1 on error + */ + int disconnect(void); + + /** Set blocking of the connection + * @param netopen_to time out of open the socket network in second + * @param cipopen_to time out of open the connection to server in second + * @param cipsend_to time out of send data to server in second + * @returns + * 0 on success, + * -1 on error + */ + int SetBlocking(int netopen_to=5, int cipopen_to=5, int cipsend_to=5); + + /** 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, int 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, int len); + + /** Send data to TCP server + * @param *buff data that will be received from TCP server + * @param len size of buffer to read + * @returns + * 0 on success, + * -1 on error + */ + int receivedTCPData(char *buff, int len); + + /** Close TCP connection + * @returns + * 0 on success, + * -1 on error + */ + int closeTCP(void); + + /** Clear serial pipe + */ + void purge(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 // _GSM_H_ +