SIM808 Не обнаруживает SMS, если они отправлены в автономном режиме

arduino-uno sim808

Я запускаю UNV SIM808 Shield с Arduino Uno, используя DFRobot_SIM808. Щит не имеет никаких проблем с обнаружением входящих SMS - сообщений при включенном питании. Я только что узнал, что если щит выключен во время отправки SMS-сообщения, он не обнаружит его, когда снова выйдет в сеть.

#include <DFRobot_sim808.h>
#include <SoftwareSerial.h>

#define MESSAGE_LENGTH 160
char message[MESSAGE_LENGTH];
int messageIndex = 0;

char phone[16];
char datetime[24];

#define PIN_TX    3
#define PIN_RX    2

SoftwareSerial mySerial(PIN_TX,PIN_RX);
DFRobot_SIM808 sim808(&mySerial);//Connect RX,TX,PWR,

void setup() {
  mySerial.begin(9600);
  Serial.begin(9600);

  //******** Инициализация модуля sim808 *************
   while(!sim808.init())  { Serial.println("Starting Sim808...");   sim808.powerUpDown(9); }

  delay(3000);  
  Serial.println("Init Success, please send SMS message to me!");
}

void loop() {
  //*********** Обнаружение непрочитанных SMS сообщений ************************
   messageIndex = sim808.isSMSunread();
    Serial.print("messageIndex: ");
    Serial.println(messageIndex);

   //*********** По крайней мере, есть одно НЕПРОЧИТАННОЕ SMS ***********
   if (messageIndex > 0) { 
      sim808.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);
                 
      //***********Чтобы не переполнять память SIM-карты, лучше ее удалить**********
      sim808.deleteSMS(messageIndex);
      Serial.print("From number: ");
      Serial.println(phone);  
      Serial.print("Datetime: ");
      Serial.println(datetime);        
      Serial.print("Recieved Message: ");
      Serial.println(message);    
   }
}

Я делюсь данными последовательного монитора после выключения щита. Я отправил это сообщение (2:24) в 2:24 по местному времени. Через 10 минут я включил экран и ждал, пока сообщение будет обнаружено, но безрезультатно в течение 15 минут. Я отправил еще одно сообщение (2:49) по местному времени, когда щит включен, и он был обнаружен сразу же вместе с предыдущим сообщением.

Он работает каждые 3 секунды, но я очистил данные

02:34:56.342 -> Starting Sim808...
02:35:06.958 -> Init Success, please send SMS message to me!
02:35:09.602 -> messageIndex: -1
02:40:00.686 -> messageIndex: 0
02:45:02.311 -> messageIndex: 0
02:49:26.940 -> messageIndex: 0
02:49:29.560 -> messageIndex: 0
02:49:32.216 -> messageIndex: 0
02:49:33.565 -> messageIndex: 7
02:49:36.269 -> From number: +***********
02:49:36.322 -> Datetime: 21/04/21,02:24:20+12
02:49:36.369 -> Recieved Message: 2:24
02:49:37.624 -> messageIndex: 8
02:49:40.373 -> From number: +***********
02:49:40.373 -> Datetime: 21/04/21,02:49:28+12
02:49:40.426 -> Recieved Message: 2:49
02:49:43.029 -> messageIndex: 0
02:49:45.691 -> messageIndex: 0
02:49:48.314 -> messageIndex: 0

Вот код для функции sim808.isSMSunread ();. Возможно, есть что-то, что может быть изменено в коде, может смягчить эту проблему:

char DFRobot_SIM808::isSMSunread(){
    char gprsBuffer[48];  //48 достаточно, чтобы увидеть +CMGL:
    char *s;
    
    sim808_check_with_cmd("AT+CMGF=1\r\n","OK\r\n",CMD);    delay(1000);
    sim808_send_cmd(F("AT+CMGL=\"REC UNREAD\",1\r\n"));
    sim808_clean_buffer(gprsBuffer,31); 
    sim808_read_buffer(gprsBuffer,30,DEFAULT_TIMEOUT); 

    if(NULL != ( s = strstr(gprsBuffer,"OK"))) {
        delay(50);
        return 0;
    } else {
        sim808_wait_for_resp("OK\r\n", CMD);        
        sim808_send_cmd("AT+CMGL=\"REC UNREAD\",1\r\n");
        sim808_clean_buffer(gprsBuffer,48); 
        sim808_read_buffer(gprsBuffer,47,DEFAULT_TIMEOUT);
        if(NULL != ( s = strstr(gprsBuffer,"+CMGL:"))) {
            s = strstr(gprsBuffer,":");
            if (s != NULL) {
                sim808_wait_for_resp("OK\r\n", CMD);
                return atoi(s+1);
            }
        } else {
            return -1; 
        }
    } 
    return -1;
}

То, что я ищу, - это заставить щит обнаруживать любые непрочитанные сообщения, если он был отправлен в выключенном состоянии?

, 👍2

Обсуждение

вам придется построить машину времени, @jsotola

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

@jsotola Как только я вставил sim-карту в свой телефон, я немедленно получил SMS., @ASH

затем вам нужно узнать, как телефон извлекает сохраненные сообщения ... это не имеет ничего общего с arduino, @jsotola

есть ли у sim808 команды at, как на этой странице https://www.developershome.com/sms/readSmsByAtCommands.asp ?, @user30878

@user30878 Я не совсем уверен, понял ли я вас, но да, модуль отвечает на команды AT, и вот как это работает., @ASH

Проверьте страницу, на которую я ссылаюсь., @user30878

@user30878, как я понимаю, у них возникли проблемы с получением сообщений, которые стояли в очереди в сети после того, как они только что включились, а не с чтением сообщений в целом., @timemage

@timemage команда "CMGR", как говорят, получает SMS из области хранения. Я не знаю, что такое хранилище, но в комментариях выше сказано, что это может быть решением., @user30878

на этот вопрос стоит взглянуть https://stackoverflow.com/questions/29867646/minicom-atcmgr-n-not-showing-the-sms-content URL-адрес, указанный в ответе, содержит сведения о хранении https://www.smssolutions.net/tutorials/gsm/receivesmsat/, @user30878

@user30878 Я перепробовал все возможные типы хранилищ, но в итоге столкнулся с той же проблемой. В+CPMS="SM", а затем ME, MT, SM_P, ME_P и MT, @ASH