bool GPRS::join() { char cmd[64]; char ipAddr[32]; //Select multiple connection //sim900_check_with_cmd("AT+CIPMUX=1\r\n","OK",DEFAULT_TIMEOUT,CMD); //set APN snprintf(cmd,sizeof(cmd),"AT+CSTT=\"%s\",\"%s\",\"%s\"\r\n",_apn,_userName,_passWord); sim900_check_with_cmd(cmd, "OK", DEFAULT_TIMEOUT,CMD); //Brings up wireless connection sim900_check_with_cmd("AT+CIICR\r\n","OK",DEFAULT_TIMEOUT,CMD); //Get local IP address sim900_send_cmd("AT+CIFSR\r\n"); sim900_read_buffer(ipAddr,32,2); if(NULL != strstr(ipAddr,"AT+CIFSR")) { _ip = str_to_ip(ipAddr+12); if(_ip != 0) { return true; } } return false; }
//Here is where we ask for APN configuration, with F() so we can save MEMORY bool GPRS::join(const __FlashStringHelper *apn, const __FlashStringHelper *userName, const __FlashStringHelper *passWord) { byte i; char *p, *s; char ipAddr[32]; //Select multiple connection //sim900_check_with_cmd("AT+CIPMUX=1\r\n","OK",DEFAULT_TIMEOUT,CMD); //set APN. OLD VERSION //snprintf(cmd,sizeof(cmd),"AT+CSTT=\"%s\",\"%s\",\"%s\"\r\n",_apn,_userName,_passWord); //sim900_check_with_cmd(cmd, "OK\r\n", DEFAULT_TIMEOUT,CMD); sim900_send_cmd("AT+CSTT=\""); if (apn) { sim900_send_cmd(apn); } sim900_send_cmd("\",\""); if (userName) { sim900_send_cmd(userName); } sim900_send_cmd("\",\""); if (passWord) { sim900_send_cmd(passWord); } sim900_check_with_cmd("\"\r\n", "OK\r\n", CMD); //Brings up wireless connection sim900_check_with_cmd("AT+CIICR\r\n","OK\r\n", CMD); //Get local IP address sim900_send_cmd("AT+CIFSR\r\n"); sim900_clean_buffer(ipAddr,32); sim900_read_buffer(ipAddr,32); //Response: //AT+CIFSR\r\n --> 8 + 2 //\r\n --> 0 + 2 //10.160.57.120\r\n --> 15 + 2 (max) : TOTAL: 29 //Response error: //AT+CIFSR\r\n //\r\n //ERROR\r\n if (NULL != strstr(ipAddr,"ERROR")) { return false; } s = ipAddr + 12; p = strstr((char *)(s),"\r\n"); //p is last character \r\n if (NULL != s) { i = 0; while (s < p) { ip_string[i++] = *(s++); } ip_string[i] = '\0'; } _ip = str_to_ip(ip_string); if(_ip != 0) { return true; } return false; }
bool GPRS::init(void) { if(!sim900_check_with_cmd("AT\r\n","OK\r\n",CMD)){ return false; } if(!sim900_check_with_cmd("AT+CFUN=1\r\n","OK\r\n",CMD)){ return false; } if(!checkSIMStatus()) { return false; } return true; }
int GPRS::init(void) { if(0 != sim900_check_with_cmd("AT\r\n","OK",DEFAULT_TIMEOUT,CMD)){ return -1; } if(0 != sim900_check_with_cmd("AT+CFUN=1\r\n","OK",DEFAULT_TIMEOUT,CMD)){ return -1; } if(0 != checkSIMStatus()) { return -1; } return 0; }
int GPRS::readSMS(int messageIndex, char *message, int length, char *phone, char *datetime) { /* Response is like: AT+CMGR=2 +CMGR: "REC READ","XXXXXXXXXXX","","14/10/09,17:30:17+08" SMS text here So we need (more or lees), 80 chars plus expected message length in buffer. CAUTION FREE MEMORY */ int i = 0; char gprsBuffer[80 + length]; char cmd[16]; char *p,*p2,*s; sim900_check_with_cmd("AT+CMGF=1\r\n","OK\r\n",CMD); suli_delay_ms(1000); sprintf(cmd,"AT+CMGR=%d\r\n",messageIndex); sim900_send_cmd(cmd); sim900_clean_buffer(gprsBuffer,sizeof(gprsBuffer)); sim900_read_buffer(gprsBuffer,sizeof(gprsBuffer),DEFAULT_TIMEOUT); if(NULL != ( s = strstr(gprsBuffer,"+CMGR:"))){ // Extract phone number string p = strstr(s,","); p2 = p + 2; //We are in the first phone number character p = strstr((char *)(p2), "\""); if (NULL != p) { i = 0; while (p2 < p) { phone[i++] = *(p2++); } phone[i] = '\0'; } // Extract date time string p = strstr((char *)(p2),","); p2 = p + 1; p = strstr((char *)(p2), ","); p2 = p + 2; //We are in the first date time character p = strstr((char *)(p2), "\""); if (NULL != p) { i = 0; while (p2 < p) { datetime[i++] = *(p2++); } datetime[i] = '\0'; } if(NULL != ( s = strstr(s,"\r\n"))){ i = 0; p = s + 2; while((*p != '\r')&&(i < length-1)) { message[i++] = *(p++); } message[i] = '\0'; } return 0; } return -1; }
bool GPRS::readSMS(int messageIndex, char *message,int length) { int i = 0; char gprsBuffer[100]; //char cmd[16]; char num[4]; char *p,*s; sim900_check_with_cmd("AT+CMGF=1\r\n","OK\r\n",CMD); delay(1000); sim900_send_cmd("AT+CMGR="); itoa(messageIndex, num, 10); sim900_send_cmd(num); sim900_send_cmd("\r\n"); // sprintf(cmd,"AT+CMGR=%d\r\n",messageIndex); // sim900_send_cmd(cmd); sim900_clean_buffer(gprsBuffer,sizeof(gprsBuffer)); sim900_read_buffer(gprsBuffer,sizeof(gprsBuffer),DEFAULT_TIMEOUT); if(NULL != ( s = strstr(gprsBuffer,"+CMGR:"))){ if(NULL != ( s = strstr(s,"\r\n"))){ p = s + 2; while((*p != '\r')&&(i < length-1)) { message[i++] = *(p++); } message[i] = '\0'; return true; } } return false; }
int GPRS::send(const char * str, int len) { //char cmd[32]; char num[4]; if(len > 0){ //snprintf(cmd,sizeof(cmd),"AT+CIPSEND=%d\r\n",len); //sprintf(cmd,"AT+CIPSEND=%d\r\n",len); sim900_send_cmd("AT+CIPSEND="); itoa(len, num, 10); sim900_send_cmd(num); if(!sim900_check_with_cmd("\r\n",">",CMD)) { //if(!sim900_check_with_cmd(cmd,">",CMD)) { return 0; } /*if(0 != sim900_check_with_cmd(str,"SEND OK\r\n", DEFAULT_TIMEOUT * 10 ,DATA)) { return 0; }*/ delay(500); sim900_send_cmd(str); delay(500); sim900_send_End_Mark(); if(!sim900_wait_for_resp("SEND OK\r\n", DATA, DEFAULT_TIMEOUT * 10, DEFAULT_INTERCHAR_TIMEOUT * 10)) { return 0; } } return len; }
int GPRS::send(const char * str, int len) { char cmd[32]; char resp[16]; //suli_delay_ms(1000); if(len > 0){ snprintf(cmd,sizeof(cmd),"AT+CIPSEND=%d\r\n",len); if(0 != sim900_check_with_cmd(cmd,">",DEFAULT_TIMEOUT,CMD)) { return false; } if(0 != sim900_check_with_cmd(str,"SEND OK",DEFAULT_TIMEOUT+2,DATA)) { return false; } } return len; }
int GPRS::sendSMS(char *number, char *data) { char cmd[32]; if(0 != sim900_check_with_cmd("AT+CMGF=1\r\n", "OK", DEFAULT_TIMEOUT,CMD)) { // Set message mode to ASCII return -1; } suli_delay_ms(500); snprintf(cmd, sizeof(cmd),"AT+CMGS=\"%s\"\r\n", number); if(0 != sim900_check_with_cmd(cmd,">",DEFAULT_TIMEOUT,CMD)) { return -1; } suli_delay_ms(1000); sim900_send_cmd(data); suli_delay_ms(500); sim900_send_End_Mark(); return 0; }
bool GPRS::close() { // if not connected, return if (!is_connected()) { return true; } return sim900_check_with_cmd("AT+CIPCLOSE\r\n", "CLOSE OK\r\n", CMD); }
bool GPRS::init(void) { if (!sim900_check_with_cmd("AT\r\n","OK\r\n",CMD)) return false; if (!sim900_check_with_cmd("AT+CFUN=1\r\n","OK\r\n",CMD)) return false; if (!checkSIMStatus()) return false; if (!sim900_check_with_cmd("AT+CNMI?\r\n", "+CNMI: 2,2,0,0,0\r\nOK\r\n", CMD)) { if (!sim900_check_with_cmd("AT+CNMI=2,2,0,0,0\r\n","OK\r\n", CMD)) { return false; } } if (!sim900_check_with_cmd("AT+CMGF?\r\n", "+CMGF: 1\r\nOK\r\n", CMD)) { if (!sim900_check_with_cmd("AT+CMGF=1\r\n","OK\r\n", CMD)) { return false; } } if (!sim900_check_with_cmd("AT+CLIP=1\r\n","OK\r\n", CMD)) { return false; } return true; }
bool GPRS::getLocation(const __FlashStringHelper *apn, float *longitude, float *latitude) { int i = 0; char gprsBuffer[80]; char buffer[20]; char *s; //send AT+SAPBR=3,1,"Contype","GPRS" sim900_check_with_cmd("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r","OK\r\n",CMD); //sen AT+SAPBR=3,1,"APN","GPRS_APN" sim900_send_cmd("AT+SAPBR=3,1,\"APN\",\""); if (apn) { sim900_send_cmd(apn); } sim900_check_with_cmd("\"\r","OK\r\n",CMD); //send AT+SAPBR =1,1 sim900_check_with_cmd("AT+SAPBR=1,1\r","OK\r\n",CMD); //AT+CIPGSMLOC=1,1 sim900_flush_serial(); sim900_send_cmd("AT+CIPGSMLOC=1,1\r"); sim900_clean_buffer(gprsBuffer,sizeof(gprsBuffer)); sim900_read_buffer(gprsBuffer,sizeof(gprsBuffer),2*DEFAULT_TIMEOUT,6*DEFAULT_INTERCHAR_TIMEOUT); //Serial.println(gprsBuffer); if(NULL != ( s = strstr(gprsBuffer,"+CIPGSMLOC:"))) { s = strstr((char *)s, ","); s = s+1; //Serial.println(*s); i=0; while(*(++s) != ',') buffer[i++]=*s; buffer[i] = 0; *longitude = atof(buffer); i=0; while(*(++s) != ',') buffer[i++]=*s; buffer[i] = 0; *latitude = atof(buffer); return true; } return false; }
bool GPRS::delBookEntry(int index) { char indexStr[4]; itoa(index, indexStr, 10); sim900_flush_serial(); sim900_send_cmd(F("AT+CPBW=")); sim900_send_cmd(indexStr); return sim900_check_with_cmd(F("\r"),"OK\r\n",CMD); }
bool GPRS::queryBearer(uint8_t * bearerStatus) { char receiveBuffer[32]; char * commaPtr; // send AT+SAPBR=2,1 and read "+SAPBR" if (sim900_check_with_cmd(F("AT+SAPBR=2,1\r\n"),"+SAPBR:", DATA) == false) return false; sim900_clean_buffer(receiveBuffer, sizeof(receiveBuffer)); // check response which looks like: // +SAPBR: <cid>,<Status>,<IP_Addr>\r\nOK // read cid (always 1) if (sim900_read_string_until(receiveBuffer, sizeof(receiveBuffer), "1,") == NULL) return false; // read until next comma -> status commaPtr = sim900_read_string_until(receiveBuffer, sizeof(receiveBuffer), ","); if (commaPtr == NULL) return false; // replace comma with string termination *commaPtr = '\0'; // now extract status *bearerStatus = (uint8_t)atol(receiveBuffer); // only check for ip address if we are connected (=1) if (*bearerStatus == 1) { char * endOfIpAddress = NULL; // read ip address, which is enclosed in '"', so read first '"' if (sim900_read_string_until(receiveBuffer, sizeof(receiveBuffer), "\"") == NULL) return false; // read second '"' endOfIpAddress = sim900_read_string_until(receiveBuffer, sizeof(receiveBuffer), "\""); if (endOfIpAddress == NULL) return false; *endOfIpAddress = '\0'; strncpy(ip_string, receiveBuffer, sizeof(ip_string)); _ip = str_to_ip(ip_string); } // flush rest of data which should be "\r\nOK" sim900_flush_serial(); return true;; }
int GPRS::callUp(char *number) { char cmd[24]; if(0 != sim900_check_with_cmd("AT+COLP=1\r\n","OK",DEFAULT_TIMEOUT,CMD)) { return -1; } suli_delay_ms(1000); sprintf(cmd,"ATD%s;\r\n", number); sim900_send_cmd(cmd); return 0; }
bool GPRS::ntpSyncDateTime(int8_t timezone) { // e.g. "-105\0", this is not a valid value to pass to the SIM module, but we need to make sure not // to cross boundaries of the char array char timezoneString[5] = {'\0'}; if (sim900_check_with_cmd(F("AT+CNTPCID=1\r\n"), "OK\r\n", CMD) == false) return false; sim900_send_cmd(F("AT+CNTP=\"pool.ntp.org\",")); itoa(timezone, timezoneString, 10); sim900_send_cmd(timezoneString); if (sim900_check_with_cmd(F("\r\n"), "OK\r\n", CMD) == false) return false; return sim900_check_with_cmd(F("AT+CNTP\r\n"), "+CNTP: 1", CMD); }
bool GPRS::close() { // if not connected, return if (is_connected() == false) { return true; } if(0 != sim900_check_with_cmd("AT+CIPCLOSE\r\n", "CLOSE OK", DEFAULT_TIMEOUT,CMD)) { return false; } return true; }
bool GPRS::callUp(char *number) { if(!sim900_check_with_cmd("AT+COLP=1\r\n","OK\r\n",CMD)) { return false; } delay(1000); sim900_send_cmd("ATD"); sim900_send_cmd(number); sim900_send_cmd(";\r\n"); return true; }
bool GPRS::init(void) { if(!sim900_check_with_cmd(F("AT\r\n"),"OK\r\n",CMD)){ return false; } if(!sim900_check_with_cmd(F("AT+CFUN=1\r\n"),"OK\r\n",CMD)){ return false; } //180822 Set SMS to text mode if(!sim900_check_with_cmd(F("AT+CMGF=1\r\n"), "OK\r\n", CMD)) { // Set message mode to ASCII return false; } //delay(500); It is not necessary, as we have time before next command if(!checkSIMStatus()) { return false; } return true; }
bool GPRS::sendSMS(char *number, char *data) { //char cmd[32]; if(!sim900_check_with_cmd("AT+CMGF=1\r\n", "OK\r\n", CMD)) { // Set message mode to ASCII return false; } delay(500); sim900_send_cmd("AT+CMGS=\""); sim900_send_cmd(number); //sprintf(cmd,"AT+CMGS=\"%s\"\r\n", number); //snprintf(cmd, sizeof(cmd),"AT+CMGS=\"%s\"\r\n", number); // if(!sim900_check_with_cmd(cmd,">",CMD)) { if(!sim900_check_with_cmd("\"\r\n",">",CMD)) { return false; } delay(1000); sim900_send_cmd(data); delay(500); sim900_send_End_Mark(); return true; }
bool GPRS::sendSMS(char *number, char *data) { // Set message mode to ASCII if(!sim900_check_with_cmd("AT+CMGF=1\r\n", "OK\r\n", CMD)) { return false; } delay(500); sim900_send_cmd("AT+CMGS=\""); sim900_send_cmd(number); if(!sim900_check_with_cmd("\"\r\n",">",CMD)) { return false; } delay(1000); sim900_send_cmd(data); delay(500); sim900_send_End_Mark(); return true; }
int GPRS::deleteSMS(int index) { char cmd[16]; snprintf(cmd,sizeof(cmd),"AT+CMGD=%d\r\n",index); //sim900_send_cmd(cmd); //return 0; // We have to wait OK response if(0 != sim900_check_with_cmd(cmd,"OK",DEFAULT_TIMEOUT,CMD)) { return -1; } return 0; }
bool GPRS::wake(void) { unsigned long timerStart; bool ok = false; //First, send AT dummy command to wake up sim900_send_cmd(F("AT\r\n")); //Second delay almost 100 ms delay(200); sim900_flush_serial(); //Third, send the second AT command to check that it is alive timerStart = millis(); while(!ok && ((unsigned long) (millis() - timerStart) < 3000UL) ) { //Until 3 seconds maximum ok = sim900_check_with_cmd(F("AT\r\n"),"OK",CMD); delay(300); } if (ok) { //Four, exit sleep mode return sim900_check_with_cmd(F("AT+CSCLK=0\r\n"),"OK",CMD); } else { return false; } }
//Here is where we ask for APN configuration, with F() so we can save MEMORY bool GPRS::join(const __FlashStringHelper *apn, const __FlashStringHelper *userName, const __FlashStringHelper *passWord) { char cmd[64]; char ipAddr[32]; //Select multiple connection //sim900_check_with_cmd("AT+CIPMUX=1\r\n","OK",DEFAULT_TIMEOUT,CMD); //set APN. OLD VERSION /* snprintf(cmd,sizeof(cmd),"AT+CSTT=\"%s\",\"%s\",\"%s\"\r\n",_apn,_userName,_passWord); sim900_check_with_cmd(cmd, "OK\r\n", DEFAULT_TIMEOUT,CMD); */ sim900_send_cmd("AT+CSTT=\""); sim900_send_cmd(apn); sim900_send_cmd("\",\""); sim900_send_cmd(userName); sim900_send_cmd("\",\""); sim900_send_cmd(passWord); sim900_check_with_cmd("\"\r\n", "OK\r\n", CMD); //Brings up wireless connection sim900_check_with_cmd("AT+CIICR\r\n","OK\r\n", CMD); //Get local IP address sim900_send_cmd("AT+CIFSR\r\n"); sim900_clean_buffer(ipAddr,32); sim900_read_buffer(ipAddr,32,2); //Serial.print("ipAddr: "); //Serial.println(ipAddr); if(NULL != strstr(ipAddr,"AT+CIFSR")) { _ip = str_to_ip(ipAddr+12); if(_ip != 0) { return true; } } return false; }
boolean GPRS::send(const char * str) { if(!sim900_check_with_cmd(F("AT+CIPSEND\r\n"),">",CMD)) { return false; } delay(500); sim900_send_cmd(str); delay(500); sim900_send_End_Mark(); if(!sim900_wait_for_resp("SEND OK\r\n", DATA, DEFAULT_TIMEOUT * 10, DEFAULT_INTERCHAR_TIMEOUT * 10)) { return false; } return true; }
bool GPRS::openBearer(const __FlashStringHelper *apn) { const uint8_t checkBearerRetryCount = 3; int i; //send AT+SAPBR=3,1,"Contype","GPRS" if (sim900_check_with_cmd(F("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r"),"OK\r\n", CMD) == false) return false; //send AT+SAPBR=3,1,"APN","<apn>" sim900_send_cmd(F("AT+SAPBR=3,1,\"APN\",\"")); if (apn) { sim900_send_cmd(apn); } if (sim900_check_with_cmd(F("\"\r"),"OK\r\n", CMD) == false) return false; //send AT+SAPBR =1,1 if (sim900_check_with_cmd(F("AT+SAPBR=1,1\r\n"),"OK\r\n", CMD) == false) return false; for(i = 0; i < checkBearerRetryCount; i++) { // 3 means "closed" uint8_t bearerStatus = 3; // 1 means "connected" queryBearer(&bearerStatus); if (bearerStatus == 1) break; } if (i >= checkBearerRetryCount) return false; return true; }
boolean GPRS::send(const __FlashStringHelper* str) { if(!sim900_check_with_cmd(F("AT+CIPSEND\r\n"),">",CMD)) { return false; } sim900_send_cmd(str); sim900_send_End_Mark(); if(!sim900_wait_for_resp("SEND OK\r\n", DATA, DEFAULT_TIMEOUT, DEFAULT_INTERCHAR_TIMEOUT)) { return false; } return true; }
bool GPRS::callUp(char *number) { //char cmd[24]; if(!sim900_check_with_cmd("AT+COLP=1\r\n","OK\r\n",CMD)) { return false; } delay(1000); //HACERR quitar SPRINTF para ahorar memoria ??? //sprintf(cmd,"ATD%s;\r\n", number); //sim900_send_cmd(cmd); sim900_send_cmd("ATD"); sim900_send_cmd(number); sim900_send_cmd(";\r\n"); return true; }
bool GPRS::deleteSMS(int index) { //char cmd[16]; char num[4]; //sprintf(cmd,"AT+CMGD=%d\r\n",index); sim900_send_cmd("AT+CMGD="); itoa(index, num, 10); sim900_send_cmd(num); //snprintf(cmd,sizeof(cmd),"AT+CMGD=%d\r\n",index); //sim900_send_cmd(cmd); //return 0; // We have to wait OK response //return sim900_check_with_cmd(cmd,"OK\r\n",CMD); return sim900_check_with_cmd("\r","OK\r\n",CMD); }
bool GPRS::addBookEntry(int index, const char* number, int type, const char *name) { char num[4]; sim900_send_cmd(F("AT+CPBW=")); if( index != -1 ) { itoa(index, num, 10); sim900_send_cmd(num); } sim900_send_cmd(F(",\"")); sim900_send_cmd(number); sim900_send_cmd(F("\",")); itoa(type, num, 10); sim900_send_cmd(num); sim900_send_cmd(F(",\"")); sim900_send_cmd(name); sim900_send_cmd(F("\"")); return sim900_check_with_cmd(F("\r"),"OK\r\n",CMD); }