Перезагрузка по СМС (проверка номера телефона)
- Войдите на сайт для отправки комментариев
Вс, 07/05/2017 - 12:03
Добрый день. Обращаюсь за помощью к специалистам). Собрал устройство на 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;
}
}
Перед строкой 42 напечатайте в Serial (или там ещё куда) строку currStr полностью. Посмотрите на неё и всё поймёте. Вытащите номер также, как Вы команду reboot вытаскиваете.
Получил в мониторе порта вот такую строку:
+CMT: "+38067#######","","17/05/07,13:58:22+12"
Reboot
Как мне правильно вставить это в код? Прошу прощения, возможно это элементарно, но я новичёк в этом...
if(!currStr.compareTo("+38067#######")) {Попробовал так, но ничего не происходит. Строка приходит, но алгоритм не выполняется. А если пишу любой текст и присылаю его в смс - то всё работает.
if(currStr.indexOf("+38067#######")) {Теперь с любого номера и любой текст принимает и отрабатывает...
Поборол задачу путём добавления таких строк:
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; } }