Как запретить другим телефонам/мобильным номерам отправлять SMS-команды на Arduino?

ВВЕДЕНИЕ:

Я новичок, когда дело доходит до программирования Arduino и использования AT-команд. Я уже пытался обыскать весь интернет и спрашивал на форуме Arduino, но мне не повезло, и никто не дал мне четкого представления об этом.

ПРОБЛЕМА:

Итак, у меня есть этот код, где SMS-команда может включать и выключать свет, и он будет реагировать только на определенный номер телефона. Моя проблема в том, что программа отвечает, даже когда я использую разные номера телефонов. Я надеюсь, что есть способ внести в белый список только определенный номер, чтобы никто не мог разыграть программу без ведома владельца.

НАПРИМЕР:

  • Телефон владельца +631234567890
  • Какой-то случайный номер телефона: +63xxxxxxxxxx

Владелец может включать и выключать свет. [ДА]
Но предположительно случайный номер телефона НЕ МОЖЕТ и никогда не будет иметь права включать и выключать свет. Только хозяин может.

ВОТ МОЙ ТЕКУЩИЙ КОД: CCTO

#include <SoftwareSerial.h>
SoftwareSerial GPRS(10, 11);
String textMessage;
String lampState;
const int relay = 12;

void setup() {  
  pinMode(relay, OUTPUT);
  digitalWrite(relay, HIGH);

  Serial.begin(9600); 
  GPRS.begin(9600);
  delay(5000);
  Serial.print("GPRS ready...\r\n");
  GPRS.print("AT+CMGF=1\r\n"); 
  delay(1000);
  GPRS.print("AT+CNMI=2,2,0,0,0\r\n");
  delay(1000);
}

void loop(){
  if(GPRS.available()>0){
    textMessage = GPRS.readString();
    Serial.print(textMessage);    
    delay(10);
  } 
  if(textMessage.indexOf("ON")>=0){
    // Turn on relay and save current state
    digitalWrite(relay, HIGH);
    lampState = "ON";
    Serial.println("Lamp set to ON\r\n");  
    textMessage = "";
    GPRS.println("AT+CMGS=\"+631234567890\"");
    delay(500);
    GPRS.print("Lamp was finally switched ON.\r");
    GPRS.write( 0x1a );
    delay(1000);
  }
  if(textMessage.indexOf("OFF")>=0){
    // Turn off relay and save current state
    digitalWrite(relay, LOW);
    lampState = "OFF"; 
    Serial.println("Lamp set to OFF\r\n");
    textMessage = "";
    GPRS.println("AT+CMGS=\"+631234567890\"");
    delay(500);
    GPRS.print("Lamp was finally switched OFF.\r");
    GPRS.write( 0x1a );
    delay(1000);
  }
  if(textMessage.indexOf("STATUS")>=0){
    String message = "Lamp is " + lampState;
    GPRS.print("AT+CMGF=1"); 
    delay(1000);
    Serial.println("Lamp state resquest");
    textMessage = "";
    GPRS.println("AT+CMGS=\"+631234567890\"");
    delay(500);
    GPRS.print("Lamp is currently ");
    GPRS.println(lampState ? "ON" : "OFF");
    GPRS.write( 0x1a );
    delay(1000);
  }
}

Как я могу это сделать?


person Ren Bermudez    schedule 17.08.2018    source источник
comment
Есть предположение, что программа должна позволить ей прочитать и проигнорировать сообщение, если оно не является получателем.   -  person Ren Bermudez    schedule 19.08.2018


Ответы (2)


Ваше текстовое сообщение должно содержать информацию об отправителе и времени сообщения. Что-то вроде этого:

+CMGL: 2,"REC UNREAD","+63xxxxxxxxxx",,"02/07/18,00:07:22+32" Простая демонстрация текстовых сообщений SMS.

Итак, вам нужно извлечь номер телефона и сравнить его с авторизованным.

person Ruslan    schedule 26.08.2018

Вы можете указать в коде нужный номер телефона и сравнить его с номером, присвоенным входящему SMS. Если число совпадает с числом в вашем коде, продолжайте алгоритм. В противном случае проигнорируйте сообщение.

Получил этот код с официального форума Arduino, который вы можете проверить по ссылке, указанной в конце. Вы можете закодировать эти две функции:


String CellNumtemp;
String CellNum;


// check if there are incoming SMS
void ricezione(){
  Serial.println ("controllo ricezione SMS");
  // AT command to set mySerial to SMS mode
  mySerial.print("AT+CMGF=1\r");
  delay(100);
  // Read the first SMS saved in the sim
  mySerial.print("AT+CMGR=1\r");
  delay(10); 
  if(mySerial.available()>0){
    textMessage = mySerial.readString();
    Serial.print(textMessage); 
    delay(10);
  }
  // check if the SMS is "STATO"
  if(textMessage.indexOf("STATO")>=0){   
    Serial.println("Invio info stato arnia");
    //save the phone number of the senders in a string (this works with italian region you must adapt to   yours) 
    CellNumtemp = textMessage.substring(textMessage.indexOf("+39"));
    CellNum = CellNumtemp.substring(0,13);
    smsstato();
    CellNumtemp = "";
    textMessage = "";   
  }
  mySerial.print("AT+CMGD=1\r");
  delay(100);
  mySerial.print("AT+CMGD=2\r");
  delay(100);   
}


// Send sms with all the information to the number stored
void smsstato(){
  // delete the first SMS
  mySerial.print("AT+CMGD=1\r");
  delay(100);
  mySerial.print("AT+CMGF=1\r");   
  delay(1000);
  mySerial.print("AT+CMGS=\"");
  mySerial.print(CellNum);
  mySerial.print("\"\r"); 
  delay(1000);
  //The text of the message to be sent.
  mySerial.print("INFO: Latitudine: ");
  mySerial.print(latitude);
  mySerial.print(", Longitudine: ");
  mySerial.print(logitude);
  mySerial.print(", Ampere: ");
  mySerial.print(consumotemp);
  delay(1000);
  mySerial.write(0x1A);
  delay(1000);
  Serial.println("sms stato");
}```

Thanks to the user ilteo85 on the https://forum.arduino.cc.
Check this out for reference: https://forum.arduino.cc/index.php?topic=637264.0
person neeltron    schedule 26.01.2021
comment
Привет ! Прочтите Как написать хороший ответ. Попробуйте включить пример кода (может быть даже псевдокод), чтобы показать, как будет выглядеть ваше предложение — старайтесь не просто публиковать внешние ссылки, поскольку в будущем они могут стать недоступными. - person Pascal Lamers; 26.01.2021
comment
Хорошо, я отредактирую. Спасибо за совет! - person neeltron; 26.01.2021