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.
Большое спасибо!
@Krystof, 👍2
3 ответа
Знаете ли вы, что может быть причиной этого? Это буквально случайно.
Может быть ваш код, может быть ваш сетевой провайдер/сигнал. Это невозможно сказать, если вы не предоставите нам свой код для проверки.
Еще вопрос. Что означают «10» и «0» в HTTP-запросе? «time201908191820» — это текущее время, напечатанное с PHP.
Они выглядят как часть тела ответа, поэтому они печатаются любым запрошенным PHP-скриптом. Либо так, либо они генерируются вашей неизвестной программой Arduino.
Спасибо за ответ. Код выглядит следующим образом:
#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 модуля при получении ответа от сервера. Подумав, я не думаю, что это может быть так. Блок питания сделан очень мощным, и в нем достаточно байпасных заглушек, чтобы уменьшить шум и обеспечить достаточную энергию во время скачков тока. Также модуль не зависает. Он все еще подключен к серверу, через пару секунд он закрывает соединение, как и должно быть.
- Последовательный буфер каким-то образом переполняется. Это была просто быстрая мысль. Буфер Arduino может каким-то образом заполниться, поэтому он больше не сможет сохранять входящие данные. Я думаю, что это ерунда, но...
Спасибо за ответы.
Кристоф
Я разобрался. Ответ на запрос HTTP GET был прочитан как строка. Строка имеет около 284 байт. Поскольку он такой большой, строка сохраняется фрагментированной, что, по-видимому, является проблемой. Решение состоит в том, чтобы создать буфер и сохранить туда символы из серийного номера.
- GSM-модуль Sim800l не может подключить данные gprs
- Отправить HTTP get запрос от GSM SIM800c и Arduino
- Как настроить модуль TinySine 3G (SIM5320E) для запроса HTTP GET
- Модуль Sim808 Неверный HTTP-запрос
- Как публиковать запросы HTTP POST на моем веб-сайте?
- Проблема с получением SMS - GSM-модуль Arduino Uno и SIM900A
- Мини-модем SIM900a, IMEI 0, помощь с контактами TX RX
- Как получить данные из базы данных моего сервера в переменную в моем Arduino?