int retrieveTextMessage(struct ModemInterface* interf, char* buffer, int length, int id) { #if defined(LINUX) || defined(ARDUINO) mmSendCommand(interf, F("AT+CMGR=")) mmSendCommand(interf, id); mmSendCommand(interf, F("\r")) if (mmFind(interf->modem, F("+CMGR: "))) { mmFind(interf->modem, F(",")); mmFind(interf->modem, F(",")); return mmReadBytesUntil(interf->modem, ',', buffer, length); } else { return 0; } #endif #ifdef _WIN32 int total = 0; sprintf(buffer, "AT+CMGR=%i", id); mmSendCommand(interf, buffer); mmSendCommand(interf, "\r"); if (mmFind(interf->modem, "+CMGR: ")) { mmFind(interf->modem, "\n"); total = mmReadBytesUntil(interf->modem, (char)10, buffer, length); } PurgeComm(interf->modem->hSerial, PURGE_RXCLEAR | PURGE_TXCLEAR); return total; #endif }
int sendTextMessage(struct ModemInterface* interf, char* number, char* buffer) { #if defined(LINUX) || defined(ARDUINO) mmSendCommand(interf, F("AT+CMGS=\"")); mmSendCommand(interf, number); mmSendCommand(interf, F("\"\r")); if (mmFind(interf->modem, F(">"))) { mmSendCommand(interf, buffer); mmWriteByte(interf->modem, 26); mmSendCommand(interf, F("\r")); return 1; } return 0; #endif #ifdef _WIN32 char c; mmSendCommand(interf, "AT+CMGS=\""); mmSendCommand(interf, number); mmSendCommand(interf, "\"\r"); Sleep(1); if (mmFind(interf->modem, ">")) { mmSendCommand(interf, buffer); mmWriteByte(interf->modem, (char)26); mmSendCommand(interf, "\r"); return 1; } return 0; #endif }
int retrievePhoneNumber(struct ModemInterface* interf, char* buffer, int length, int id) { #if defined(LINUX) || defined(ARDUINO) mmSendCommand(interf, F("AT+CMGR=")); mmSendCommand(interf, id); mmSendCommand(interf, F("\r")); if (mmFind(interf->modem, F("+CMGR: "))) { mmFind(interf->modem, F(",")); return mmReadBytesUntil(interf->modem,',',buffer,length); } else { return 0; } #endif #ifdef _WIN32 mmSendCommand(interf, "AT+CMGR="); mmSendCommand(interf, id); mmSendCommand(interf, "\r"); if (mmFind(interf->modem, "+CMGR: ")) { mmFind(interf->modem, ","); return mmReadBytesUntil(interf->modem,',',buffer,length); } else { return 0; } #endif }
//auto checks for OK from data after sending command bool mmSendCommandCheckForOkay(struct ModemInterface* interf, char* cmd) { mmFlushBuffer(interf); mmSendCommand(interf,cmd); mmSendCommand(interf,"\r"); #ifdef ARDUINO //mmFind(interf->modem, cmd); return mmCheckForOkay(interf); #endif #ifdef LINUX int c; mmFind(interf->modem, cmd); do{ c = mmRead(interf->modem); if(c < 0){ usleep(1); }else{ //printf("%c", c); } } while(c != 'O' && c != 'E'); return c == 'O'; #endif #ifdef _WIN32 int c; mmFind(interf->modem, cmd); do{ c = mmRead(interf->modem); if(c < 0){ usleep(1); }else{ //printf("%c", c); } } while(c != 'O' && c != 'E'); return c == 'O'; #endif }
int deleteTextMessage(struct ModemInterface* interf, int id) { #if defined(LINUX) || defined(ARDUINO) mmSendCommand(interf, F("AT+CMGD=")); mmSendCommand(interf, id); mmSendCommand(interf, F("\r")); return mmFind(interf->modem, F("OK")); #endif #ifdef _WIN32 char cmd[128]; sprintf(cmd, "AT+CMGD=%i", id); mmSendCommand(interf, "\r"); return mmFind(interf->modem, "OK"); #endif }
//auto checks for OK from data after sending command bool mmSendCommandCheckForOkay(struct ModemInterface* interface, FlashStringHelper cmd) { mmFlush(interface->modem); mmSendCommand(interface,cmd); mmSendCommand(interface,"\r"); mmFind(interface->modem, cmd); return mmCheckForOkay(interface); }
int mmRetrieveTextMessage(struct ModemInterface* interface, char* buffer, int length, int id) { mmSendCommand(interface, F("AT+CMGR=")); mmPrinti(interface->modem, id); //mmSendCommand(interface, id); mmWriteByte(interface->modem, '\r'); mmFind(interface->modem, F("AT+CMGR=")); int c = mmFindChars(interface->modem, 'E', ':'); int len; if (c == ':') { //mmFindChar(interface->modem, ':')) { mmFindChar(interface->modem, ':'); for(int i = 0; i < 7; i++) mmFindChar(interface->modem, ','); len = mmParseInt(interface->modem); mmFindChar(interface->modem, '\n'); if(length > len) length = len; len = length; int count; do{ count = mmReadBytes(interface->modem,buffer,length); buffer+=count; length-=count; }while(length > 0); buffer[0] = 0; return len; } else { return 0; } }
int mmGetTextLists(struct ModemInterface* interface, int* ids, int length) { mmSendCommand(interface, F("AT+CMGL\r")); mmFind(interface->modem, F("AT+CMGL\r")); int count = 0; int c; int len; while(count < length){ int c = mmFindChars(interface->modem, 'O', '+'); if(c == '+'){ mmFindChar(interface->modem, ' '); // ids[count++] = mmParseInt(interface->modem); mmFindChar(interface->modem, ':'); mmFindChar(interface->modem, ','); mmFindChar(interface->modem, ','); len = mmParseInt(interface->modem); mmFindChar(interface->modem, '\r'); for(int i = 0; i < len; i++) if(mmRead(interface->modem) < 0) i--; }else{ break; } } return count; /*while (mmFindChar(interface->modem, '+') && i < length) { ids[i] = mmParseInt(interface->modem); i++; //mmFindChar(interface->modem, '+'); } return i;*/ }
bool mmDeleteTextMessage(struct ModemInterface* interface, int id) { mmSendCommand(interface, F("AT+CMGD=")); mmPrinti(interface->modem, id); //mmSendCommand(interface, id); mmSendCommand(interface, F("\r")); mmFind(interface->modem, F("AT+CMGD=")); return mmCheckForOkay(interface); }
int getTextLists(struct ModemInterface* interf, int* ids, int length) { int i = 0; int temp, j; #if defined(LINUX) || defined(ARDUINO) mmSendCommand(interf, F("AT+CMGL\r")); while (mmFind(interf->modem, F("AT+CMGL")) && i < length) { ids[i] = mmParseInt(interf->modem); i++; } #endif #ifdef _WIN32 char * buffer[32]; char * ptr; mmSendCommand(interf, "AT+CMGL\r"); if (!mmFind(interf->modem, "+CMGL: ")) return -1; else { if (mmReadBytesUntil(interf->modem, ',', buffer, 32)) { ids[i] = (int)strtol((const char *)buffer, &ptr, 10); i++; } } while (mmFind(interf->modem, "+CMGL: ") && i < length) { if (mmReadBytesUntil(interf->modem, ',', buffer, 32)) { temp = (int)strtol((const char *)buffer, &ptr, 10); for (j = 0; j < i && ids[j] != temp; j++); if (j == i) { ids[i] = temp; i++; } } } PurgeComm(interf->modem->hSerial, PURGE_RXCLEAR | PURGE_TXCLEAR); #endif return i; }
bool mmSendTextMessage(struct ModemInterface* interface, char* number, char* buffer) { mmSendCommand(interface, F("AT+CMGS=\"")); mmSendCommand(interface, number); mmSendCommand(interface, F("\"\r")); mmFind(interface->modem, F("AT+CMGS=\"")); int c = mmFindChars(interface->modem, 'E', '>'); //sleep_millis(milliTimeoutSMS); if (c == '>') { mmSendCommand(interface, buffer); mmWriteByte(interface->modem,26); mmSendCommand(interface, F("\r")); return true; } return false; }
bool mmRetrieveTimestamp(struct ModemInterface* interface, char* buffer, int length, int id) { mmSendCommand(interface, F("AT+CMGR=")); mmPrinti(interface->modem, id); //mmSendCommand(interface, id); mmSendCommand(interface, F("\r")); mmFind(interface->modem, F("AT+CMGR=")); int c = mmFindChars(interface->modem, 'E', ':'); if (c == ':') { mmFindChar(interface->modem, ','); mmFindChar(interface->modem, ','); mmFindChar(interface->modem, ','); mmFindChar(interface->modem, ','); mmFindChar(interface->modem, '"'); return mmReadBytesUntil(interface->modem,'"',buffer,length); } else { return 0; } }
//initialization of modem - returns true if all commands completed successfully, false otherwise bool mmInit(struct ModemInterface *interf) { sleep_seconds(3); mmSendCommand(interf, F("+++")); sleep_seconds(1); interf->dlmode = 0; interf->disconnectIndex = 0; int i = 0; //command counter mmFlushBuffer(interf); for(i = 0; i < 3; i++){ mmSendCommand(interf, F("AT\r")); } mmFind(interf->modem, F("OK")); mmFlushBuffer(interf); i = 0; int j = 0; //retry counter while (i < 6 && j < 10) { switch(i) { case 0: (mmSendCommandCheckForOkay(interf, F("ATE1")))?i++:j++; break; case 1: (mmSendCommandCheckForOkay(interf, F("AT+CMEE=0"))) ? i++ : j++; break; case 2: (mmSendCommandCheckForOkay(interf, F("AT+UMNOCONF=3,23"))) ? i++ : j++; break; case 3: (mmSendCommandCheckForOkay(interf, F("AT+CFUN=1"))) ? i++ : j++; break; case 4: (mmSendCommandCheckForOkay(interf, F("AT+CMGF=1"))) ? i++ : j++; break; case 5: (mmSendCommandCheckForOkay(interf, F("AT+CSDH=1"))) ? i++ : j++; //for text message length break; } #ifdef ARDUINO //delay(250); #endif } return (i == 6) ? true : false; }
bool mmRetrievePhoneNumber(struct ModemInterface* interface, char* buffer, int length, int id) { mmSendCommand(interface, F("AT+CMGR=")); mmPrinti(interface->modem, id); //mmSendCommand(interface, id); mmWriteByte(interface->modem, '\r'); mmFind(interface->modem, F("AT+CMGR=")); int c = mmFindChars(interface->modem, 'E', ':'); if (c == ':') { mmFindChar(interface->modem, '+'); int index = 0; length--; //save room for null terminator while(index < length){ c = mmRead(interface->modem); if( c < 0) continue; if(c == '\"') break; buffer[index++] = c; } buffer[index] = 0; return index; } else { return 0; } }