tes sim 5360
SIM5360.cpp
- Committer:
- irsanjul
- Date:
- 2020-03-17
- Revision:
- 0:bf27ed7867b7
File content as of revision 0:bf27ed7867b7:
#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; }