Массив строка, разбор.

sergeyksv45
Offline
Зарегистрирован: 24.02.2016

Здравствуйте !!!

Прошу помощи !!! Начал проект сигнализации для дачи и столкнулся с проблемой программирования дополнительных номеров в память сигналки для снятия и постановки на охрану через смс сообщения. Записаться админом с первого пришедшего смс и потом управлять сигналкой получается без проблем - считываю номер и записываю в память, далее если смс пришло с номера админа и содержит текст "alarm on", то включить охрану..., а вот как прописать дополнительного пользователя например жену или дочь никак не получается. Дополнительно прописать c номера админа "пользователя - 1, user1" с которого можно управлять сигналкой. Смс текст массив и как разобрать смс текст  "user1;+79xxxxxxxxxx" где  1й фрагмент строки в массиве содержит "user1" далее разделение ";" и 2й фрагмент начинается с "+7", то записываем в память номер пользователя "user1" для управления включением и отключением охраны. Пользую библиотеку GSM.h.

  

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

А где пробема-то? Где код? В чём там ошибки? Вы же что-то писали, пробовали? Выкладывайте.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

ЕвгенийП пишет:

Выкладывайте.

я запретил.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Клапауций 234 пишет:

ЕвгенийП пишет:

Выкладывайте.

я запретил.

Низ-зя!

Во избежание правовых коллизий следует сначала отменить http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment... и только потом можно запрещать.

sergeyksv45
Offline
Зарегистрирован: 24.02.2016

Сравнивать построчно научился, а вот как разложить никак не могу понять. Вот скетч

#include <GPRS_Shield_Arduino.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <EEPROM.h>
#include <string.h>
#define PIN_TX    2
#define PIN_RX    3
#define BAUDRATE  9600
#define MESSAGE_LENGTH 160
char message[30];
int messageIndex = 0;
char phone[20];
char phone_admin[20];
char phone_user1[20];
char datetime[24];
char buffer[30];
char s1[20], s2[20];
GPRS gprsTest(PIN_TX,PIN_RX,BAUDRATE);//RX,TX,PWR,BaudRate
byte ledPin_0 = A4;
int admin = 0;

void setup() {
  
//for (int i = 0 ; i < EEPROM.length() ; i++) {EEPROM.write(i, 0);}    // стирание всех ячеек памяти в "0"
EEPROM.get(0, admin);
EEPROM.get(10, phone_admin);

delay(1000);
Serial.begin(9600);
  while(!gprsTest.init()) {
  Serial.print("init error\r\n");
  delay(1000);}
delay(3000);  
Serial.println("Init Success, please send SMS message to me!");
pinMode(ledPin_0, OUTPUT);
Serial.print("byte_admin = ");
Serial.println(admin); 
Serial.println("phone_admin:");
Serial.println(phone_admin);
Serial.println(" ");
}

void loop() {
  
messageIndex = gprsTest.isSMSunread();

   if (messageIndex > 0) {                                // если есть непрочитанное входящее смс
      gprsTest.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);   // читаю        
      gprsTest.deleteSMS(messageIndex);                   // стираю смс
      Serial.print("From number: ");
      Serial.println(phone);                              // номер с которого отправлено сообщение
      Serial.print("Recieved Message: ");
      Serial.println(message);                            //текст сообщения
      Serial.println(" ");
      
      if (admin == 0){                                      // первое любое сообщение записывает номер админа если не записан
         for(int i=0; i<20; i++){ phone_admin[i] = phone[i], admin = 1; 
            EEPROM.put(0, admin), EEPROM.put(10, phone_admin); }}     //записываю в память номер админа и переменную админ
      
      if (admin == 1){  

      //  if (strcmp(phone, phone_admin) == 0) // если входящее сообщение с номера админа 
      // тут начинается вопрос  
      //  ????????????????   как разложить по разделителю ";" текс сообщения "User1;+7919XXXXXXX"
      //  s1 = "User1";                        первая часть сообщения до разделителя ";"
      //  s2 = "+7919XXXXXXX";                 вторая часть сообщения после разделителя ";"
      //  if (strcmp(s1, "User1") == 0) {      если первая часть содержит "User1"
      //     for(int i=0; i<20; i++){ phone_user1[i] = s2[i];  номер phone_user1 равен строке второй части сообщения
      //     EEPROM.put(20, User1); }}          записываю номер пользователя 1 в память 
      
        if (strcmp(phone, phone_admin) == 0 || strcmp(phone, phone_user1) == 0 ) { //если номер вхд соощения совпадает с ном админа ли пользов 1
         if (strcmp(message, "Alarm on") == 0) { digitalWrite(ledPin_0, HIGH); }        // если текст содержит "Alarm on" сигналка вкл
         if (strcmp(message, "Alarm off") == 0) { digitalWrite(ledPin_0, LOW); }}}      // если текст содержит "Alarm off" сигналка вкл
         
         
      
      Serial.print("byte_admin = ");
      Serial.println(admin);
      Serial.println("phone_admin:");
      Serial.println(phone_admin);
      Serial.println(" ");
      Serial.println(" ");

   }
      
      
      
}

 

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

sergeyksv45 пишет:

Сравнивать построчно научился, а вот как разложить никак не могу понять.

Чего разложить? На что разложить? В какой строке кода проблема? Вы что-то там думаете себе, но мы же Ваших мыслей не читаем.

Излагайте понятно.

sergeyksv45
Offline
Зарегистрирован: 24.02.2016

Смс текст как разобрать  "user1;+79xxxxxxxxxx" на два фрагмента где  1й фрагмент в массиве содержит "user1" далее разделение ";" и 2й фрагмент содержит "+79xxxxxxxxxx" это будет номер user1

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

А текст какого типа? char * (или char[])?

Ну так в лоб и разбирайте, примерно вот так

void setup(void) {
	Serial.begin(115200);
	char * text = "user1;+79xxxxxxxxxx";

	 Serial.print("Iznachalniy text: ");
	 Serial.println(text);

	char * part1 = text;
	char * part2 = strchr(text, ';');
	if (!part2) Serial.println("NETU tam ';' ni hrena!");
	else {
		*part2++ = '\0';
		Serial.print("Part 1: ");
		Serial.println(part1);
		Serial.print("Part 2: ");
		Serial.println(part2);
	}
}

void loop(void){}

 

sergeyksv45
Offline
Зарегистрирован: 24.02.2016

char message[30]; массив 30 символов

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

Ну, я Вам пример привёл - делайте. С массивом или с указателем - разницы нет.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

А текст какого типа? char * (или char[])?

А что, есть какая-то разница?

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

andriano пишет:

ЕвгенийП пишет:

А текст какого типа? char * (или char[])?

А что, есть какая-то разница?

Почти нет, потому и в скобках. Вопрос был "это массив (в том или ином виде) символов или String".

sergeyksv45
Offline
Зарегистрирован: 24.02.2016

Большое СПАСИБО!!! помог Ваш пример и всё заработало

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

С Победой!

sergeyksv45
Offline
Зарегистрирован: 24.02.2016

Иду дальше и можно совет? Мне нужна только отправка и чтение смс, библиотеку подключил и памяти для переменных сразу съело 70%. Может есть не "тяжелые" библы или всеж учится работать чисто АТ командами и не запариваться с библиотеками (изучать и выкидывать с них всё лишнее)

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

Не знаю. Я использую готовые библиотеки только когда впервые купил новый для себя прибор и его надо быстро проверить рабочий или нет, ну и в подобных ситуациях. В сколько-нибудь отличных от нуля проектах - никогда не использую. Особенно, после того, как как имел удовольствие посмотреть на такие библиотеки как "DallasTemperature", "TLC5940" и т.п.

sergeyksv45
Offline
Зарегистрирован: 24.02.2016

"DallasTemperature" это вообще якорь :)))) для ардуины, отказался почти сразу от нее