diff --git a/src/TinyGsmClientSIM800.h b/src/TinyGsmClientSIM800.h index 596a443..6eaf63d 100644 --- a/src/TinyGsmClientSIM800.h +++ b/src/TinyGsmClientSIM800.h @@ -223,6 +223,11 @@ public: if (waitResponse() != 1) { return false; } + + // PREFERRED SMS STORAGE + sendAT(GF("+CPMS="), GF("\"SM\""), GF(","), GF("\"SM\""), GF(","), GF("\"SM\"")); + waitResponse(); + getSimStatus(); return true; } @@ -652,9 +657,167 @@ public: } } + int8_t getSMSInterrupt(void){ + sendAT(GF("+CFGRI?")); + if(waitResponse(GF(GSM_NL "+CFGRI:")) != 1) return -1; + return stream.readStringUntil('\n').toInt(); + } + + bool setSMSInterrupt(uint8_t status){ + sendAT(GF("+CFGRI="), status); + if(waitResponse() != 1) return false; + return true; + } + + int8_t countSMS(void){ + sendAT(GF("+CMGF=1")); + if(waitResponse() != 1) return -1; + + sendAT(GF("+CPMS?")); + if(waitResponse(GF(GSM_NL "+CPMS:")) != 1) return -1; + + streamSkipUntil(','); + uint8_t count = stream.readStringUntil(',').toInt() - 1; + waitResponse(); + + return count; + } + + bool deleteSMS(){ + sendAT(GF("+CMGF=1")); + if(waitResponse() != 1) return false; + + sendAT(GF("+CMGDA=\"DEL ALL\"")); + if(waitResponse() != 1) return false; + + return true; + } + + bool deleteSMS(uint8_t i){ + sendAT(GF("+CMGF=1")); + if(waitResponse() != 1) return false; + + sendAT(GF("+CMGD="), i); + if(waitResponse() != 1) return false; + + return true; + } + + String deleteSMSOpt() { + sendAT(GF("+CMGD=?")); + if (waitResponse() != 1) { + return ""; + } + if (waitResponse(10000L, GF(GSM_NL "+CMGD::")) != 1) { + return ""; + } + stream.readStringUntil('"'); + String indexes = stream.readStringUntil('"'); + stream.readStringUntil(','); + String options = stream.readStringUntil('\n'); + return indexes; + } + + bool readSMS(uint8_t i, String& msg){ + // set message format to text mode + sendAT(GF("+CMGF=1")); + if (waitResponse() != 1) return false; + // show sms text mode parameters + sendAT(GF("+CSDH=1")); + if (waitResponse() != 1) return false; + // set GSM charset + sendAT(GF("+CSCS=\"GSM\"")); + if (waitResponse() != 1) return false; + + sendAT(GF("+CMGR="), i); + uint8_t cmgrResponse = waitResponse(GF(GSM_NL "+CMGR:")); + if ( cmgrResponse == 1 ) { + streamSkipUntil('\n'); + msg = stream.readStringUntil('\n'); + return true; + } + + return false; + } + + uint8_t getNewSMSIndex() { + if (waitResponse(GF(GSM_NL "+CMTI:")) != 1) { + return false; + } + + streamSkipUntil(','); + int res = stream.readStringUntil('\n').toInt(); + return res; + } + + bool readSMSRaw(uint8_t i, String& msg) { + // set message format to text mode + sendAT(GF("+CMGF=1")); + if (waitResponse() != 1) return false; + // show sms text mode parameters + sendAT(GF("+CSDH=1")); + if (waitResponse() != 1) return false; + // set GSM charset + sendAT(GF("+CSCS=\"GSM\"")); + if (waitResponse() != 1) return false; + + // get message by index + sendAT(GF("+CMGR="), i); + uint8_t cmgrResponse = waitResponse(GF(GSM_NL "+CMGR:")); + if ( cmgrResponse != 1 ) { + return false; + } + + msg = stream.readStringUntil('\n') + '\n' + + stream.readStringUntil('\n') + '\n'; + + if (waitResponse() != 1) { + return false; + } + + return true; + } + + bool readAllSMSRaw(String& msg) { + // set message format to text mode + sendAT(GF("+CMGF=1")); + if (waitResponse() != 1) return false; + // show sms text mode parameters + sendAT(GF("+CSDH=1")); + if (waitResponse() != 1) return false; + // set GSM charset + sendAT(GF("+CSCS=\"GSM\"")); + if (waitResponse() != 1) return false; + + // get all messages + sendAT(GF("+CMGL=\"ALL\"")); + + const unsigned long timeout = 10000L; + unsigned long startMillis = millis(); + bool isTimeout = false; + String line; + do { + line = stream.readStringUntil('\n'); + line.trim(); + if ( line != "" && line != "OK" ) { + msg = msg + line + String("\r\n"); + } + isTimeout = (millis() - startMillis) > timeout; + delay(0); + if ( isTimeout ) { + DBG("timeout"); + break; + } + } while (line != "OK"); + + return (line == "OK"); + } + bool sendSMS(const String& number, const String& text) { sendAT(GF("+CMGF=1")); waitResponse(); + sendAT(GF("+CSCS=\"GSM\"")); + waitResponse(); sendAT(GF("+CMGS=\""), number, GF("\"")); if (waitResponse(GF(">")) != 1) { return false;