создание постоянного HTTP-соединения для создания «гладких» данных через GSM-отправку
Цели проекта
- Отправлять данные через GSM в firebase
- Быстрая выборка: необходимо отправлять 16 байт каждые полсекунды в firebase.
- Отправлять данные с помощью GET или POST на сервер с PHP-скриптом, который перенаправляет данные в firebase
Проблемы -- Чрезвычайно низкая скорость передачи данных!
- Используя стандартный запрос GET или POST со стороны клиента (arduino), невозможно достичь второй (2) цели проекта.
Чтобы правильно отправить данные, мне нужно закрыть соединение с сервером, поэтому следующий пакет данных, к сожалению, ждет (2-6 секунд) для установления нового соединения.
Это что, ерунда? Я использую библиотеку ArduinoHttpClient.
Моя настоящая бессмысленная связь, совершенно бесполезная, но работающая
while(1){
http.post("/test.php","application/x-www-form-urlencoded","data=0");
http.stop(); //закрытие соединения с сервером
//следующая инструкция занимает более 5 секунд, чтобы установить новое соединение :(
http.post("/test.php","application/x-www-form-urlencoded","data=0");
http.stop(); //закрытие соединения с сервером, почему?
}
Данные отправляются раз в 2-6 секунд, это даже не смешно. НУЖНО отправлять данные каждые 0,5 секунды!
Поэтому я решил создать суперрешение, которое не работает :C
while(1){
http.post("/test.php","application/x-www-form-urlencoded","data=0");
delay(xxx);
//не закрывать соединение, не тратить время на установку нового :)
}
Просто скажите мне, почему это соединение не "Keep-Alive", которое также используется с
http.sendHeader("Соединение: Keep-Alive"); или http.connectionKeepAlive();
//Первый запуск
http.post(blabla);// возвращает значение: 0 & данные заносятся в firebase
//Второй запуск
http.post(blabla);// возвращает значение: -2 & данные не регистрируются в firebase
мой файл test.php
<?php
require_once 'firebaseLib.php';
$url = 'https://czujniki-aa5ca.firebaseio.com/';
// --- Используйте здесь свой токен из Firebase
$token = ':-CCCCCCCCCCCCCCCCCCCCCCC';
$arduino_data_post = $_POST['data'];
$firebasePath = '/';
$fb = new fireBase($url, $token);
$response = $fb->push($firebasePath, $arduino_data_post);
sleep(2);
1 ответ
Метод HttpClient.stop() библиотеки ArduinoHttpCliemt выполняет две функции. Он сбрасывает состояние объекта HttpClient и останавливает базовое клиентское соединение (TCP-соединение). Если HttpClient.stop() не вызывается, внутреннее состояние не подходит для повторного вызова get() или post().
Метод resetState() вызывается в HttpClient.stop() для сброса внутреннего состояния объекта HttpClient. Но resetState() защищен. Чтобы вызвать его, мы должны изменить заголовочный файл библиотеки.
В HttpClient.h сделайте resetState() общедоступным (переместив 'protected:'), а затем в скетче вызовите resetState() перед post(). Он поместит объект HttpClient в начальное состояние без разрыва базового соединения TCP.
Да, это работа, но время между POST все еще огромно. [ссылка](ibb.co/7rc2Yt8) скриншот, @Piotr Lewandowski
добавьте #define LOGGING
в начале HttpClient.cpp, чтобы увидеть, использует ли он соединение или переподключается, @Juraj
[ссылка](https://ibb.co/k88TXXm) журналирование возвращает: соединение уже открыто, подключено. Посмотрите на время, задержка увеличивается при отправке новых сообщений. Открывает ли он новые соединения вместо использования первого?, @Piotr Lewandowski
нет, всегда печатает Connected. поэтому он повторно использует соединение. это был твой вопрос. запрос требует времени, а не соединения., @Juraj
попробуйте прочитать ответ с помощью int statusCode = client.responseStatusCode();
, @Juraj
[ссылка](https://ibb.co/Q9ZHxJN), с responseStatusCode(); клиент arduino ничего не делает, @Piotr Lewandowski
поэтому не получает ответа. проверить сервер, @Juraj
[ссылка](https://ibb.co/gJxQSfw) теперь я настроил его для повторного подключения при каждом POST. И это кажется парадоксом, потому что у нас задержки стали меньше, если смотреть на метку времени. Довольно неприятно, поддержка активности должна сокращать время между запросами, но она работает в противоположном направлении., @Piotr Lewandowski
потому что проблема не в новом соединении, как вы можете видеть по времени вывода, @Juraj
- Как настроить модуль TinySine 3G (SIM5320E) для запроса HTTP GET
- Как публиковать запросы HTTP POST на моем веб-сайте?
- GSM-модуль Sim800l не может подключить данные gprs
- SIM A9G: +CME ERROR: 53 failure
- esp32 http client response только 200 не получил данные после этого
- Отправить HTTP get запрос от GSM SIM800c и Arduino
- POST-запрос на Arduino MKR1400 GSM не работает
- HTTP-запрос SIM800L ненадежен
отключается ли «модем» от сети без активного подключения? найдите параметр, чтобы сохранить подключение GPRS, @Juraj
@Juraj, я думаю, что модем не отключает сеть сам по себе, я проверю код и отпишусь. Если не заработает, буду тестировать на чистых АТ-командах., @Piotr Lewandowski
попробуйте в библиотеке в HttpClient.h сделать resetState() общедоступным (переместив 'protected:'), а затем в скетче вызовите resetState() перед post(), @Juraj
@Juraj [ссылка](https://ibb.co/7rc2Yt8) посмотрите на скриншот. resetState() работает нормально, и теперь нам не нужно использовать stop(), но по сути он работает как .stop(); Посмотрите на метку времени, задержка между загрузкой данных по-прежнему ужасна. 0 означает 0 код ошибки, поэтому данные отправляются успешно, @Piotr Lewandowski