Перезагрузка по СМС (проверка номера телефона)

intelmedia
Offline
Зарегистрирован: 07.05.2017

Добрый день. Обращаюсь за помощью к специалистам). Собрал устройство на Arduino Pro mini + gsm модуль SIM800L для перезагрузки по смс оборудования, в случае его зависания. Хотел бы добавить для безопасности  в имеющийся скетч проверку номера телефона с которого приходит смс, но мои познания в программировании пока не позволяют этого сделать. Подскажите, пожалуйста как это реализовать.

#include <SoftwareSerial.h>

SoftwareSerial gprsSerial(10, 11); // установка контактов 10 и 11 для программного порта
int updateTime = 0;
int Relay = 4; // для реле
int Led = 2; // для светодиода

 
void setup()
{
 delay(10000);  //время на инициализацию модуля
 gprsSerial.begin(4800);
 pinMode(Relay, OUTPUT);
 pinMode(Led, OUTPUT);

 
 // настройка приема сообщений
 
 gprsSerial.print("AT+CMGF=1\r");
 delay(500); // задержка на обработку команды
 gprsSerial.print("AT+IFC=1, 1\r");
 delay(500);
 gprsSerial.print("AT+CPBS=\"SM\"\r");
 delay(500); // задержка на обработку команды
 gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
 delay(700);
}
 
String currStr = "";
// если эта строка сообщение, то переменная примет значение True
boolean isStringMessage = false;
 
void loop()
{
 if (!gprsSerial.available())
 return;
 char currSymb = gprsSerial.read();
 if ('\r' == currSymb) {
 if (isStringMessage) {
  
 // если текущая строка – сообщение, то…
 if (!currStr.compareTo("Reboot")) {
    digitalWrite(Relay, HIGH);
    digitalWrite(Led, HIGH);
    delay(6000);
    digitalWrite(Relay, LOW);
    digitalWrite(Led, LOW);
     } 

 isStringMessage = false;
 
 } else {
 if (currStr.startsWith("+CMT")) {
 // если текущая строка начинается с "+CMT", то следующая сообщение
 isStringMessage = true;
 }
 }
 currStr = "";
 } else if ('\n' != currSymb) {
 currStr += String(currSymb);
 }

}

void touch()
{
  if (millis() >= updateTime) {
    gprsSerial.println("AT+CMGD=1,4");
    gprsSerial.println("AT");
    gprsSerial.println("AT+CMGF=1");
    gprsSerial.println("AT+CLIP=1");
    updateTime += 5000;
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Перед строкой 42 напечатайте в Serial (или там ещё куда) строку currStr  полностью. Посмотрите на неё и всё поймёте. Вытащите номер также, как Вы команду reboot вытаскиваете.

intelmedia
Offline
Зарегистрирован: 07.05.2017

Получил в мониторе порта вот такую строку:

+CMT: "+38067#######","","17/05/07,13:58:22+12"
Reboot

Как мне правильно вставить это в код? Прошу прощения, возможно это элементарно, но я новичёк в этом...

Araris
Offline
Зарегистрирован: 09.11.2012

if (!currStr.compareTo("+38067#######")) {

intelmedia
Offline
Зарегистрирован: 07.05.2017

Попробовал так, но ничего не происходит. Строка приходит, но алгоритм не выполняется. А если пишу любой текст и присылаю его в смс - то всё работает.

Araris
Offline
Зарегистрирован: 09.11.2012

if (currStr.indexOf("+38067#######")) {

intelmedia
Offline
Зарегистрирован: 07.05.2017

Теперь с любого номера и любой текст принимает и отрабатывает...

intelmedia
Offline
Зарегистрирован: 07.05.2017

Поборол задачу путём добавления таких строк:

const char*adminNumber[]={"+38067#######","+38068#######","+38066#######"};

for (int8_t i = 0; i <=2; i++)// чтсло 2 (+1) это колличество заданных телефонов
if (currStr.indexOf(adminNumber[i])!= -1)

Всё работает!

#include <SoftwareSerial.h>

SoftwareSerial gprsSerial(10, 11); // установка контактов 10 и 11 для программного порта
int updateTime = 0;
int Relay = 4; // для реле
int Led = 2; // для светодиода
const char*adminNumber[]={"+38067#######","+38068#######","+38066#######"};
 
void setup()
{
 delay(10000);  //время на инициализацию модуля
 Serial.begin(4800);
 gprsSerial.begin(4800);
 pinMode(Relay, OUTPUT);
 pinMode(Led, OUTPUT);

 
 // настройка приема сообщений
 
 gprsSerial.print("AT+CMGF=1\r"); //установка текстового режима смс-сообщений
 delay(500); // задержка на обработку команды
 gprsSerial.print("AT+IFC=1, 1\r"); //установка контроля потока передачи данных
 delay(700);
 gprsSerial.print("AT+CPBS=\"SM\"\r"); //открытый доступ к данным телефонной книги sim
 delay(700); // задержка на обработку команды
 gprsSerial.print("AT+CNMI=1,2,2,1,0\r");//включает оповещение о новых сообщениях в формате +CMT
 delay(700);
}
 
String currStr = ""; // если эта строка сообщение, то переменная примет значение True
boolean isStringMessage = false; //флаг на обработку сообщений
 
void loop()
{
 if (!gprsSerial.available()) //если от модуля данных нет то дальше не идём
 return;
 char currSymb = gprsSerial.read(); //запись в переменную символы,которые получаем от модуля
 if ('\r' == currSymb) {
 if (isStringMessage)  //если флаг на обработку открыт, то проверяем сообщение на команды
 { 
 if (!currStr.compareTo("Reboot")) {
    digitalWrite(Relay, HIGH);
    digitalWrite(Led, HIGH);
    delay(6000);
    digitalWrite(Relay, LOW);
    digitalWrite(Led, LOW);
     } 

 isStringMessage = false; //закрываем флаг на обработку сообщений
 
 } else {
 if (currStr.startsWith("+CMT")) {
 // если текущая строка начинается с "+CMT", то следующая сообщение
 
 
 Serial.println(currStr);
for (int8_t i = 0; i <=2; i++)// чтсло 2 (+1) это колличество заданных телефонов
{
if (currStr.indexOf(adminNumber[i])!= -1)
{

Serial.println(adminNumber[i]);
 
 isStringMessage = true;
 }
 }
 }
 }
 currStr = "";
 } else if ('\n' != currSymb) {
 currStr += String(currSymb);
 }

}

void touch()
{
  if (millis() >= updateTime) {
    gprsSerial.println("AT+CMGD=1,4");
    gprsSerial.println("AT");
    gprsSerial.println("AT+CMGF=1");
    gprsSerial.println("AT+CLIP=1");
    updateTime += 5000;
  }
}