HTTP-запрос SIM800L ненадежен

У меня есть вопрос относительно SIM800L и HTTP-запроса GET. Я использую этот простой код https://exploreembedded.com/wiki/Setting_up_GPRS_with_SIM800L для связи с SIM800l с помощью AT-команд. Для выполнения HTTP-запроса я использую следующий набор AT-команд:

AT+CFUN=1
OK

AT+CSTT="internet","",""
OK

AT+CIICR
OK

AT+CIFSR
10.180.xxx.xx

AT+CIPSTART="TCP","84.42.xxx.xx",80
OK

CONNECT OK


AT+CIPSEND=52
> 
GET /bakalarka.php/? HTTP/1.1
Host:84.42.xxx.xx



SEND OK
HTTP/1.1 200 OK
Date: Mon, 19 Aug 2019 16:20:27 GMT
Server: Apache
X-Frame-Options: SAMEORIGIN
Vary: Accept-Encoding
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

10
time201908191820
0



CLOSED

Проблема в том, что иногда. Или каждый раз, когда я не получаю весь ответ HTTP. Я обычно получаю только начало. Что-то вроде этого:

AT+CIPSEND=52
> 
GET /bakalarka.php/? HTTP/1.1
Host:84.42.xxx.xx



SEND OK
HTTP/1.1 200 OK
Date: Mon, 19 Aug 2019 16:20:27 GMT
Server: Apac

а затем через пару секунд соединение закрывается.

CLOSED

Знаете ли вы, что может быть причиной этого? Это буквально случайно. Мне нужна информация с веб-страницы (текущее время), и в настоящее время она действительно ненадежна.

Еще вопрос. Что означают «10» и «0» в HTTP-запросе? «time201908191820» — это текущее время, напечатанное из PHP.

Большое спасибо!

, 👍2


3 ответа


0

Знаете ли вы, что может быть причиной этого? Это буквально случайно.

Может быть ваш код, может быть ваш сетевой провайдер/сигнал. Это невозможно сказать, если вы не предоставите нам свой код для проверки.

Еще вопрос. Что означают «10» и «0» в HTTP-запросе? «time201908191820» — это текущее время, напечатанное с PHP.

Они выглядят как часть тела ответа, поэтому они печатаются любым запрошенным PHP-скриптом. Либо так, либо они генерируются вашей неизвестной программой Arduino.

,

1

Спасибо за ответ. Код выглядит следующим образом:

#include <SoftwareSerial.h>

String Arsp, Grsp;
SoftwareSerial gsm(12, 8); // RX, TX

String GET = "GET /bakalarka.php/? HTTP/1.1\r\nHost:84.42.xxx.xx\r\n\r\n";

void setup() {

  Serial.begin(115200);
  Serial.println("Testing GSM SIM800L");
  gsm.begin(19200);

}

void loop() {

  AT("AT+CFUN=1");
  AT("AT+CSTT=\"internet\",\"\",\"\"");
  AT("AT+CIICR");
  AT("AT+CIFSR");
  AT("AT+CIPSTART=\"TCP\",\"84.42.xxx.xx\",80");

  int get_length;
  get_length = GET.length();

  AT("AT+CIPSEND=" + String(get_length));
  AT(GET);
}

void AT(String AT){

  gsm.println(AT);

  if(gsm.available()){

    Grsp = gsm.readString();
    Serial.println(Grsp);
  }
}

Я думал о нескольких вещах, которые могли вызвать это. 1. Аппаратная конструкция - некоторый шум мог вызвать зависание GSM модуля при получении ответа от сервера. Подумав, я не думаю, что это может быть так. Блок питания сделан очень мощным, и в нем достаточно байпасных заглушек, чтобы уменьшить шум и обеспечить достаточную энергию во время скачков тока. Также модуль не зависает. Он все еще подключен к серверу, через пару секунд он закрывает соединение, как и должно быть.

  1. Последовательный буфер каким-то образом переполняется. Это была просто быстрая мысль. Буфер Arduino может каким-то образом заполниться, поэтому он больше не сможет сохранять входящие данные. Я думаю, что это ерунда, но...

Спасибо за ответы.

Кристоф

,

1

Я разобрался. Ответ на запрос HTTP GET был прочитан как строка. Строка имеет около 284 байт. Поскольку он такой большой, строка сохраняется фрагментированной, что, по-видимому, является проблемой. Решение состоит в том, чтобы создать буфер и сохранить туда символы из серийного номера.

,