Sim800l | не отправляет смс, ошибка "+cms error: requested facility not implemented"

Тема в разделе "Проводная и беспроводная связь", создана пользователем Miheeei, 13 мар 2020.

  1. Miheeei

    Miheeei Нерд

    Добрый день!
    Прошу Вас помочь решить проблему с отправкой смс с модуля SIM800l. Общаюсь с модулем посредством SoftwareSerial, через Arduino mini, IDE.
    Касаемо питания SIM800 и физической связи RX/TX с Arduino все стандартно: питание SIM800 от (4В, 2A), от Arduino передача идет на SIM800 через делитель напряжения, на выходе логической единицы 2,5В, земля общая.
    На все команды отвечает, звонки в обе стороны без проблем, а вот смс только входящие.
    В чем затык?
    Использую простой скетч для сквозного общения между аппаратным и программным UART.
    Скетч:
    Код (C++):
    #include <SoftwareSerial.h>
      SoftwareSerial SIM800(11, 10);
    void setup()
    {
      Serial.begin(9600);
      SIM800.begin(9600);
    }

    void loop()
    {
      if (SIM800.available())
        Serial.write(SIM800.read());
      if (Serial.available())
        SIM800.write(Serial.read());
    }
    Далее диалог с SIM800 по UART и получение ошибки при отправки СМС.
    Код (Text):
    AT
    OK
    AT+GSV
    SIMCOM_Ltd
    SIMCOM_SIM800L
    Revision:1418B04SIM800L24
    OK
    AT+CMGF=1
    OK
    AT+CMGS="+7902*******"
    > Privet

    +CMS ERROR: Requested facility not implemented
     
     
  2. a1000

    a1000 Гуру

    По окончании строки
    Код (C++):
    > Privet
    необходимо ввести Ctrl+Z, но в статье
    http://codius.ru/articles/GSM_модуль_SIM800L_часть_2
    пишется, что через окно Serial среды Arduino IDE, это не так уж просто. Попробуйте сделать как пишет автор статьи - скопировать и вставить символ из статьи.
     
  3. Miheeei

    Miheeei Нерд

    Доброго времени суток, все как раз делаю по данной статье, не стала копировать ссылку, чтоб не нарушить правила форума.
    Но не как не идет, уже взяла готовый скетч там же где есть отдельная процедура отправки смс. Но в итоге та же ошибка. Что само интересно, что если я в конце сообщения не ввиду данный символ то модуль стоит в ожидании завершения сообщения, соответственно ошибки нет и смс нет. Значит этот символ все же дает ему понять что на этом текст сообщения закончился и пора бы отправить его получателю.
     
    Последнее редактирование: 14 мар 2020
  4. AlexU

    AlexU Гуру

    Вот, что в интернетах пишут:
    Тарифом отправка СМС-ок предусмотрена?
     
  5. b707

    b707 Гуру

    или на номере получателя нет этой услуги или он не умеет принимать СМС - например проводной телефон

    Miheeei - попробуйте послать СМС заведомо "валидному" абоненту, например себе
     
    Airbus нравится это.
  6. a1000

    a1000 Гуру

    Для телефона (модуля) успешной отправкой считается передача сообщения СМС центру. Так-что смотреть надо в сторону симки установленной в модуле. Есть ли на ней деньги и возможность отправки СМС.
     
  7. Miheeei

    Miheeei Нерд

    Добрый день, проблема была на стороне оператора.
    Сим карта новая, с простым тарифом без абон.платы. Вставила ее в мобильный и там та же проблема, смс не уходит.
    Связалась с оператором, перезапустили все сервисы на сим карте и все стало работать.
    Всем спасибо за помощь!
     
    Daniil нравится это.
  8. Miheeei

    Miheeei Нерд

    Добрый день, помогите с проблемой парсинга смс.

    А вот то что я собрала:
    Код (C++):
    #include <EEPROM.h>
    #include <SoftwareSerial.h>                     // Библиотека програмной реализации обмена по UART-протоколу
      SoftwareSerial SIM800(11, 10);                // RX, TX

    #define Motion_pin 9
      bool Motion;
    #define Opening_pin 8
      bool Opening;

    bool Security;

    String whiteListPhones = "+7902xxxxxxx, +7928xxxxxxx, +7928xxxxxxx"; // Белый список телефонов

    String _response = "";                          // Переменная для хранения ответа модуля

    void setup()
    {
      Security = EEPROM.read(1);
      pinMode(Motion_pin,  INPUT);
      pinMode(Opening_pin, INPUT);
      Serial.begin(9600);                           // Скорость обмена данными с компьютером
      SIM800.begin(9600);                           // Скорость обмена данными с модемом
      Serial.println("WAITING GSM STARTING... ");
      Serial.println("");
      Serial.println("Start!");
      sendATCommand("AT", true);                    // Отправили AT для настройки скорости обмена данными
      sendATCommand("AT+CLIP=1", true);             // Включаем АОН
      sendATCommand("AT+CMGF=1", true);          // Включаем текстовый режима SMS (Text mode) и сразу сохраняем значение (AT&W)!
      //sendATCommand("AT+CSCS=\"GSM\"", true);
    }

    String sendATCommand(String cmd, bool waiting)
    {
      String _resp = "";                            // Переменная для хранения результата
      Serial.println(cmd);                          // Дублируем команду в монитор порта
      SIM800.println(cmd);                          // Отправляем команду модулю
      if (waiting)                                  // Если необходимо дождаться ответа...
      {                              
        _resp = waitResponse();                     // ... ждем, когда будет передан ответ
        // Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать
        if (_resp.startsWith(cmd))                  // Убираем из ответа дублирующуюся команду
        {              
          _resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2);
        }
        Serial.println(_resp);                      // Дублируем ответ в монитор порта
      }
      return _resp;                                 // Возвращаем результат. Пусто, если проблема
    }

    String waitResponse()                           // Функция ожидания ответа и возврата полученного результата
    {                        
      String _resp = "";                            // Переменная для хранения результата
      long _timeout = millis() + 10000;             // Переменная для отслеживания таймаута (10 секунд)
      while (!SIM800.available() && millis() < _timeout)  {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
      if (SIM800.available())                       // Если есть, что считывать...
      {                    
        _resp = SIM800.readString();                // ... считываем и запоминаем
      }
      else                                          // Если пришел таймаут, то...
      {                                      
        Serial.println("Timeout...");               // ... оповещаем об этом и...
      }
      return _resp;                                 // ... возвращаем результат. Пусто, если проблема
    }

    void loop()
    {
      if (SIM800.available())                       // Если модем, что-то отправил...
      {                  
        _response = waitResponse();                 // Получаем ответ от модема для анализа
        _response.trim();                           // Убираем лишние пробелы в начале и конце
        Serial.println(_response);                  // Если нужно выводим в монитор порта
       
        if (_response.startsWith("RING"))           // Есть входящий вызов
        {        
          int phoneindex = _response.indexOf("+CLIP: \"");// Есть ли информация об определении номера, если да, то phoneindex>-1
          String innerPhone = "";                   // Переменная для хранения определенного номера
          if (phoneindex >= 0)                      // Если информация была найдена
          {                  
            phoneindex += 8;                        // Парсим строку и ...
            innerPhone = _response.substring(phoneindex, _response.indexOf("\"", phoneindex)); // ...получаем номер
            Serial.println("Number: " + innerPhone); // Выводим номер в монитор порта
            sendATCommand("ATA", true);
          }
          // Проверяем, чтобы длина номера была больше 8 цифр, и номер должен быть в списке
          if (innerPhone.length() >= 8 && whiteListPhones.indexOf(innerPhone) >= 0)
          {
            sendATCommand("AT+CREC=4,\"C:\\User\\0.amr\",1,100", true);    
            delay(5000);
            sendATCommand("ATH", true);
          }
          else
          {
            sendATCommand("AT+CREC=4,\"C:\\User\\0.amr\",1,100", true);
            delay(5000);
            sendATCommand("AT+CREC=4,\"C:\\User\\1.amr\",1,100", true);
            delay(43000);
            sendATCommand("ATH", true);
          }
        }
       
        if (_response.startsWith("+CMTI:")) {       // Пришло сообщение об отправке SMS
          int index = _response.lastIndexOf(",");   // Находим последнюю запятую, перед индексом
          String result = _response.substring(index + 1, _response.length()); // Получаем индекс
          result.trim();                            // Убираем пробельные символы в начале/конце
          _response=sendATCommand("AT+CMGR="+result, true); // Получить содержимое SMS
          parseSMS(_response);                      // Распарсить SMS на элементы
          sendATCommand("AT+CMGDA=\"DEL ALL\"", true); // Удалить все сообщения, чтобы не забивали память модуля
        }
      }
      if (Serial.available())                       // Ожидаем команды по Serial...
      {                  
        SIM800.write(Serial.read());                // ...и отправляем полученную команду модему
      };
    }

    void parseSMS(String msg) {
      String msgheader  = "";
      String msgbody    = "";
      String msgphone    = "";

      msg = msg.substring(msg.indexOf("+CMGR: "));
      msgheader = msg.substring(0, msg.indexOf("\r"));

      msgbody = msg.substring(msgheader.length() + 2);
      msgbody = msgbody.substring(0, msgbody.lastIndexOf("OK"));
      msgbody.trim();

      int firstIndex = msgheader.indexOf("\",\"") + 3;
      int secondIndex = msgheader.indexOf("\",\"", firstIndex);
      msgphone = msgheader.substring(firstIndex, secondIndex);

      Serial.println("Phone: "+msgphone);
      Serial.println("Message: "+msgbody);
    }
    В результате перестает работать парсинг смс. Может памяти не хватает?
    МК Arduino mini ATmega168
    Лог по UART
    Код (Text):
    AT
      OK

    AT+CLIP=1
      OK

    AT+CMGF=1
      OK

    +CMTI: "SM",6
      AT+CMGR=6

    Phone:
    Message: