создание постоянного 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);

, 👍0

Обсуждение

отключается ли «модем» от сети без активного подключения? найдите параметр, чтобы сохранить подключение GPRS, @Juraj

@Juraj, я думаю, что модем не отключает сеть сам по себе, я проверю код и отпишусь. Если не заработает, буду тестировать на чистых АТ-командах., @Piotr Lewandowski

попробуйте в библиотеке в HttpClient.h сделать resetState() общедоступным (переместив 'protected:'), а затем в скетче вызовите resetState() перед post(), @Juraj

@Juraj [ссылка](https://ibb.co/7rc2Yt8) посмотрите на скриншот. resetState() работает нормально, и теперь нам не нужно использовать stop(), но по сути он работает как .stop(); Посмотрите на метку времени, задержка между загрузкой данных по-прежнему ужасна. 0 означает 0 код ошибки, поэтому данные отправляются успешно, @Piotr Lewandowski


1 ответ


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