SIM900 парсинг оператора

YaSerg
Offline
Зарегистрирован: 02.03.2017

Всем привет!

Хочу получить в переменную имя оператора с помощью  АТ команд.

На данный момент научился читать смски на примере скетча по влючению светодиодов.

#include <SoftwareSerial.h>
 
SoftwareSerial gprsSerial(7, 8);
 
//для зелёного светодиода будем использовать второй цифровой вход,
//а для жёлтого - третий
int greenPin = 2;
int yellowPin = 3;
 
void setup()
{
    gprsSerial.begin(19200);
    pinMode(greenPin, OUTPUT);
    pinMode(yellowPin, OUTPUT);
 
    // Настраиваем приём сообщений с других устройств
    // Между командами даём время на их обработку
    gprsSerial.print("AT+CMGF=1\r");
    delay(300);
    gprsSerial.print("AT+IFC=1, 1\r");
    delay(300);
    gprsSerial.print("AT+CPBS=\"SM\"\r");
    delay(300);
    gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
    delay(500);
}
 
String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;
 
void loop()
{
    if (!gprsSerial.available())
        return;
 
    char currSymb = gprsSerial.read();    
    if ('\r' == currSymb) {
        if (isStringMessage) {
            //если текущая строка - SMS-сообщение,
            //отреагируем на него соответствующим образом
            if (!currStr.compareTo("Green on")) {
                digitalWrite(greenPin, HIGH);
            } else if (!currStr.compareTo("Green off")) {
                digitalWrite(greenPin, LOW);
            } else if (!currStr.compareTo("Yellow on")) {
                digitalWrite(yellowPin, HIGH);
            } else if (!currStr.compareTo("Yellow off")) {
                digitalWrite(yellowPin, LOW);
            }
            isStringMessage = false;
        } else {
            if (currStr.startsWith("+CMT")) {
                //если текущая строка начинается с "+CMT",
                //то следующая строка является сообщением
                isStringMessage = true;
            }
        }
        currStr = "";
    } else if ('\n' != currSymb) {
        currStr += String(currSymb);
    }
}

На запрос AT+COPS? получаем ответ +COPS: 0,0,"MTS-RUS"

Я предполагаю, что должно получиться нечто после строки 56

else if (currStr.startsWith("+COPS)) {
                //как то взять например с 9го символа в переменную
            }

Как не знаю. Может у кого его пример на котором можно понять. Заранее благодарен.

b707
Offline
Зарегистрирован: 26.05.2017

по Вашей ссылке упоминается библиотека GPRS_Shield - скачайте ее и посмотрите, в ней внутри есть код получения СМС с разбором его на собственно текст, номер отправителя, дату и тд.

YaSerg
Offline
Зарегистрирован: 02.03.2017

b707 пишет:

по Вашей ссылке упоминается библиотека GPRS_Shield - скачайте ее и посмотрите, в ней внутри есть код получения СМС с разбором его на собственно текст, номер отправителя, дату и тд.

Хочу построить на базе платки с WiFI (Wemos D1 R2) но с ней, к сожалению не работают библиотеки. Поэтому хочу написать свою ф-цию парсинга АТ команд. А так, заходя в тупик, уже думал сменить плату и построить скетч с библиотекой.

b707
Offline
Зарегистрирован: 26.05.2017

YaSerg пишет:

b707 пишет:

по Вашей ссылке упоминается библиотека GPRS_Shield - скачайте ее и посмотрите, в ней внутри есть код получения СМС с разбором его на собственно текст, номер отправителя, дату и тд.

Хочу построить на базе платки с WiFI (Wemos D1 R2) но с ней, к сожалению не работают библиотеки. Поэтому хочу написать свою ф-цию парсинга АТ команд. А так, заходя в тупик, уже думал сменить плату и построить скетч с библиотекой.

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

YaSerg
Offline
Зарегистрирован: 02.03.2017

Можете тогда дать пояснение по приведённому скетчу? Попробую сам придумать как парсить.

 

Насколько я понял ответ шилда при получении новой смс состоит из (построчно):

1. Переход строки;
2. Служебной информации начинающейся с +CMT;
3. Чистого текста смс

Читаем что говорит шилд в переменную char currSymb, если переход строки идём дальше. 

В скетче данная конструкция
 
37
    char currSymb = gprsSerial.read();   
38
    if ('\r' == currSymb)
 
А как переходим дальше, если ответ состоит из трёх строк?
 
Далее обнуляется сроковая переменная и если прочитанное от модуля не новая строка к обнулённой переменной currStr прибавляем прочитанное от модуля.
        currStr = "";
60
    } else if ('\n' != currSymb) {
61
        currStr += String(currSymb);

Понимаю что здесь как-то реализовано построчное чтение, но моих знаний не достаочно что бы понять именно как.

YaSerg
Offline
Зарегистрирован: 02.03.2017

b707 пишет:

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

Тоже пришёл к такому выводу, но моих знаний не хватило что бы ковынуться глубже http://arduino.ru/forum/programmirovanie/biblioteka-gsmh-dlya-sim900

b707
Offline
Зарегистрирован: 26.05.2017

все-таки попытайтесь разобраться, внутри библиотеки функции местами неплохо комментированы, дан формат команд и ответов модема, например

bool GPRS::readSMS(int messageIndex, char *message, int length, char *phone, char *datetime)  
{
  /* Response is like:
  AT+CMGR=2
  
  +CMGR: "REC READ","XXXXXXXXXXX","","14/10/09,17:30:17+08"
  SMS text here
  
  So we need (more or lees), 80 chars plus expected message length in buffer. CAUTION FREE MEMORY
  */

 

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

Если что, я имею в виду вот эту библиотеку - GPRS_SIM900, как я уже писал, их в интернете много

YaSerg
Offline
Зарегистрирован: 02.03.2017

b707 пишет:

все-таки попытайтесь разобраться, внутри библиотеки функции местами неплохо комментированы, дан формат команд и ответов модема, например

bool GPRS::readSMS(int messageIndex, char *message, int length, char *phone, char *datetime)  
{
  /* Response is like:
  AT+CMGR=2
  
  +CMGR: "REC READ","XXXXXXXXXXX","","14/10/09,17:30:17+08"
  SMS text here
  
  So we need (more or lees), 80 chars plus expected message length in buffer. CAUTION FREE MEMORY
  */

 

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

Если что, я имею в виду вот эту библиотеку - GPRS_SIM900, как я уже писал, их в интернете много

Скачал и установил упомянутую вами библиотеку, копал GSM.h не нашел какими пинами подключается RX TX и power on.

b707
Offline
Зарегистрирован: 26.05.2017

YaSerg пишет:

Скачал и установил упомянутую вами библиотеку, копал GSM.h не нашел какими пинами подключается RX TX и power on.

Вы что-то путаете, в этой библиотеке нет файла GSM.h

Подключение модема происходит следующей командой

GPRS gprsTest(PIN_TX,PIN_RX,BAUDRATE);//RX,TX,BaudRate

Библиотеку не обязательно было устанавливать - используйте ее просто как пример исходного кода. Парсинг оператора посмотрите в функции GPRS::readSMS в файле GPRS_Shield_Arduino.cpp