cattledog:
Good news. I hope you learned a lesson from this. Programming involves close attention to detail. Computers are unforgiving and "stupid". If you don't tell then exactly, and precisely, what they expect, they won't do what you tell them. You would do better to slow down a bit, think things through, and be more careful in the future.
I m not familiar with the GSM module, and if there are an possible settings for "valid sender".
You can certainly determine the phone number which sent the incoming message, and test it against a list of valid numbers. An alternative might be to add a password to the message.
Sir,
now i add a valid sender function in my program with the help of youtube.
codes showing below
#include <SoftwareSerial.h>
SoftwareSerial GPRS(10, 11); // RX, TX
enum _parseState {
PS_DETECT_MSG_TYPE,
PS_IGNORING_COMMAND_ECHO,
PS_READ_CMTI_STORAGE_TYPE,
PS_READ_CMTI_ID,
PS_READ_CMGR_STATUS,
PS_READ_CMGR_NUMBER,
PS_READ_CMGR_SOMETHING,
PS_READ_CMGR_DATE,
PS_READ_CMGR_CONTENT,
};
byte state = PS_DETECT_MSG_TYPE;
String textMessage;
String relayState = "LOW";
const int relay = 4;
char buffer[82];
byte pos = 0;
const uint8_t switchPin = 3;
const bool switchOn = false; // using INPUT_PULLUP
const bool switchOff = true;
bool lastState = switchOff;
bool newState;
int joystick[1];
int lastReceivedSMSId = 0;
boolean validSender = false;
void resetBuffer() {
memset(buffer, 0, sizeof(buffer));
pos = 0;
}
void setup()
{
GPRS.begin(9600);
Serial.begin(9600);
// Set as appropriate for your case
lastState = !digitalRead(switchPin);
pinMode ( switchPin, INPUT_PULLUP );
pinMode(2, OUTPUT);
pinMode(4, OUTPUT);
pinMode(6, OUTPUT);
digitalWrite(2, HIGH);
digitalWrite(4, HIGH);
digitalWrite(6, HIGH);
for (int i = 1; i <= 15; i++) {
GPRS.print("AT+CMGD=");
GPRS.println(i);
delay(200);
// Not really necessary but prevents the serial monitor from dropping any input
while(GPRS.available()){
Serial.write(GPRS.read());
}
}
}
void loop()
{
joystick[0] = digitalRead(switchPin);
newState = joystick[0];
delay(5000);
if (newState == switchOn and lastState == switchOff)
{
sendSMS();
}
lastState = newState;
delay(500);
while(GPRS.available()) {
byte b = (GPRS.read());
parseATText(b);
}
}
void parseATText(byte b) {
buffer[pos++] = b;
switch (state) {
case PS_DETECT_MSG_TYPE:
{
if ( b == '\n' )
resetBuffer();
else {
if ( pos == 3 && strcmp(buffer, "AT+") == 0 ) {
state = PS_IGNORING_COMMAND_ECHO;
}
else if ( pos == 6 ) {
if ( strcmp(buffer, "+CMTI:") == 0 ) {
Serial.println("Received CMTI");
state = PS_READ_CMTI_STORAGE_TYPE;
}
else if ( strcmp(buffer, "+CMT: ") == 0 ) {
Serial.println("Received CMGR");
state = PS_READ_CMGR_NUMBER;//PS_READ_CMGR_STATUS;
}
resetBuffer();
}
}
}
break;
case PS_IGNORING_COMMAND_ECHO:
{
if ( b == '\n' ) {
state = PS_DETECT_MSG_TYPE;
resetBuffer();
}
}
break;
case PS_READ_CMTI_STORAGE_TYPE:
{
if ( b == ',' ) {
Serial.print("SMS storage is ");
Serial.println(buffer);
state = PS_READ_CMTI_ID;
resetBuffer();
}
}
break;
case PS_READ_CMTI_ID:
{
if ( b == '\n' ) {
lastReceivedSMSId = atoi(buffer);
Serial.print("SMS id is ");
Serial.println(lastReceivedSMSId);
GPRS.print("AT+CMGR=");
GPRS.println(lastReceivedSMSId);
//delay(500); don't do this!
state = PS_DETECT_MSG_TYPE;
resetBuffer();
}
}
break;
case PS_READ_CMGR_NUMBER:
{
if ( b == ',' ) {
// Uncomment these two lines to check the sender's cell number
validSender = false;
if ( strcmp(buffer,"\"+91798755378\",") == 0 ){
validSender = true;
Serial.print("CMGR number: ");
Serial.println(buffer);
state = PS_READ_CMGR_SOMETHING;
resetBuffer();}
else if ( strcmp(buffer,"\"+91799964539\",") == 0 ){
validSender = true;
Serial.print("CMGR number: ");
Serial.println(buffer);
state = PS_READ_CMGR_SOMETHING;
resetBuffer();}
}
}
break;
case PS_READ_CMGR_SOMETHING:
{
if ( b == ',' ) {
Serial.print("CMGR something: ");
Serial.println(buffer);
state = PS_READ_CMGR_DATE;
resetBuffer();
}
}
break;
case PS_READ_CMGR_DATE:
{
if ( b == '\n' ) {
Serial.print("CMGR date: ");
Serial.println(buffer);
state = PS_READ_CMGR_CONTENT;
resetBuffer();
}
}
break;
case PS_READ_CMGR_CONTENT:
{
//delay(3000);
if ( b == '\n' ) {
Serial.print("CMGR content: ");
Serial.print(buffer);
parseSMSContent();
GPRS.print("AT+CMGD=");
GPRS.println(lastReceivedSMSId);
// delay(3000);// don't do this!
state = PS_DETECT_MSG_TYPE;
resetBuffer();
}
}
break;
}
}
void parseSMSContent()
{
char* ptr = buffer;
if ( strlen(ptr) >= 4 ) {
if ( ptr[0] == 'v' ) {
if ( ptr[1] == 'r' )
if ( ptr[2] == 'm' )
if (digitalRead(switchPin)==LOW)
digitalWrite(2, LOW);
relayState = "on";
Serial.println("Relay set to ON");
}
if ( ptr[0] == 'a' ) {
if ( ptr[1] == 'r' )
if ( ptr[2] == 'a' )
digitalWrite(2, HIGH);
relayState = "off";
Serial.println("Relay set to OFF");
}
if ( ptr[0] == 'd' ) {
if ( ptr[1] == 'a' )
if ( ptr[2] == 'z' )
digitalWrite(4, HIGH);
String message = "relay is " + (relayState);
Serial.println("relay state resquest");
GPRS.println("AT+CMGS=\"+91798755378\"");
delay(1000);
GPRS.println(message);
GPRS.write( 0x1a );
delay(500);
}
ptr += 4;
}
}
void sendSMS()
{
Serial.println("Switch was turned ON ");
GPRS.println("AT+CMGS=\"+91798755768\"");
delay(500);
GPRS.println ("Switch was turned ON");
GPRS.write( 0x1a ); // ctrl+Z character
delay(500);
}
its working properly...
some problem also be there, that is if i have send the sms other than pre determined texts("ara","vrm","daz") to GSM module its gets hang and not responding further SMS. Otherwise its working