• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Точка доступа ESP8266 + JSON

Алексей.

Active member
Если бы вы выполнили запрос /ON на приведенном примере, то увидили бы в ответ
Код:
File Not Found

URI:  /ON
Method: GET
Такое впечатление, что вам это не очень интересно и вы нас просто тролите.
 

enjoynering

Well-known member
он просто не понимает. совсем новичок. сам лет 5 назад вот так же тупил.
 

Mestniy2496

Member
Я правильно понял что мне мои предполагаемые запросы нужно добавить так:
Код:
doc["some_text"] = "volume_increase", "volume_decrease", "device_on", "device_off", "timer_increase", "timer_decrease", "state";
 

Алексей.

Active member
Нет не так, для запросов /volume_increase /volume_decrease /device_on /device_off /timer_increase /timer_decrease /state
в обработчике not found выполнять поиск server.uri().indexOf("/volume_increase") и прочих урлов
если урло найдено, выполнять соответствующее действие, подготавливать ответ
Код:
int volume_value;
boolean on_value;
long time_value;

StaticJsonDocument<256> doc;
doc["volume"] = volume_value;
doc["on"] = on_value;
doc["time"] = time_value;

String output;
serializeJson(doc, output);
server.send(200, "application/json", output);
и отправлять его клиенту
 

Mestniy2496

Member
Нет не так, для запросов /volume_increase /volume_decrease /device_on /device_off /timer_increase /timer_decrease /state
в обработчике not found выполнять поиск server.uri().indexOf("/volume_increase") и прочих урлов
если урло найдено, выполнять соответствующее действие, подготавливать ответ
Код:
int volume_value;
boolean on_value;
long time_value;

StaticJsonDocument<256> doc;
doc["volume"] = volume_value;
doc["on"] = on_value;
doc["time"] = time_value;

String output;
serializeJson(doc, output);
server.send(200, "application/json", output);
и отправлять его клиенту
Спасибо большое. Покажите пожалуйста - можно где отправляется ответ? И где он формируется? Можете обьяснить? Спасибо большое.
 

Mestniy2496

Member
Спасибо большое. Покажите пожалуйста - можно где отправляется ответ? И где он формируется? Можете обьяснить? Спасибо большое.
Просто я ответ хочу отправлять постоянно. Ибо хочу сделать таймер именно на МК - и данные Таймера в реалтайм отправлять подключившемуся устройству.
 

Mestniy2496

Member
А. Я только щас допер - что вы мне дали ответы!!! И их обработку. А как принять и обработать запрос? server.uri().indexOf("/volume_increase") - как это оформляется?
 

Алексей.

Active member
Просто я ответ хочу отправлять постоянно. Ибо хочу сделать таймер именно на МК - и данные Таймера в реалтайм отправлять подключившемуся устройству.
Вы выбрали протокол http, со стороны клиента (андроид) используете HttpURLConnection который выполняет метод GET, т.е. клиент строит запрос, соединяется с сервером, отправляет запрос и получает на него ответ.
В HttpWorker.getSource выполняется чтение ответа пока из потока пока можно ещё что-то прочитать, обработка ответа выполняется не взирая на код ответа, который может быть и не двухсотый и не взирая на Content-Type который может быть и не json позже выполняется разбор ответа как json.
Таким образом, после получения ответа, дальнейшее чтение не выполняется.
Скажите пожалуйста, как без запросов клиент должен обрабатывать неожиданные ответы которые МК будет посылать?
А. Я только щас допер - что вы мне дали ответы!!! И их обработку. А как принять и обработать запрос? server.uri().indexOf("/volume_increase") - как это оформляется?
Вы ждете кода который вам напишут? Немножко не тот раздел выбрали.
 

Mestniy2496

Member
Вы меня не поняли - видимо я неправильно обьяснил. Я не могу найти где в коде происходит обработка конкретных get запросов? С которыми я мог бы работать.
 

Алексей.

Active member
Я не могу найти где в коде происходит обработка конкретных get запросов?
Неожиданный поворот, я в вашем коде указал где это выполняется (HttpWorker.getSource), а вы не можете это найти...
Вы уверены что вам это нужно?
 

Mestniy2496

Member
Неожиданный поворот, я в вашем коде указал где это выполняется (HttpWorker.getSource), а вы не можете это найти...
Вы уверены что вам это нужно?
Стоп - но это же в приложении. А мне нужно слушать GET запросы и не только отправлять ответ, а допустим при приходе какой то команды отправлять в serial чтолибо.
 

Сергей_Ф

Moderator
Команда форума
@Mestniy2496 что вам мешает отправлять? И что такое "приложение"?
Вы для себя и для помощников хоть схему обрисуйте, а то совсем ничего непонятно что вы говорите.
 

Mestniy2496

Member
@Mestniy2496 что вам мешает отправлять? И что такое "приложение"?
Вы для себя и для помощников хоть схему обрисуйте, а то совсем ничего непонятно что вы говорите.
Выше я отправлял ссылку на приложение. И судя по тому что пишет Алексей, он с ней ознакомился. Приложение отправляет GET на ЕСП. А ЕСП, должно принять эти запросы и отправить соответствующие команды арде по сериалу. Я просто хочу понять как мне обрабатывать конкретные запросы...
 

Mestniy2496

Member
  • private final String BASE_ADDRESS = "http://127.0.0.1:8080/";
  • private final String VOLUME_INCREASE = "volume_increase";
  • private final String VOLUME_DECREASE = "volume_decrease";
  • private final String DEVICE_ON = "device_on";
  • private final String DEVICE_OFF = "device_off";
  • private final String TIMER_INCREASE = "timer_increase";
  • private final String TIMER_DECREASE = "timer_decrease";
  • private final String GET_STATE = "state";
  • ответ от МК всегда один, в виде Json:
  • final JSONObject jsonObject = new JSONObject(source);
  • final FirePlace firePlace = new FirePlace();
  • firePlace.setVolume(jsonObject.getInt("volume"));
  • firePlace.setOn(jsonObject.getBoolean("on"));
  • firePlace.setTime(jsonObject.getLong("time"));
Вот то что я отправлял ранее
 

Mestniy2496

Member
А стоп - мне просто нужно добавить в мой код чтение GET с помощью HttpWorker.getSource
 

Mestniy2496

Member
Но я просто не втыкаю от куда это все береться? Какая библиотека? Как мне добавить чтение и обработку GET ?
Код:
#include <Arduino.h>
#include <ArduinoJson.h>
#ifdef ARDUINO_ARCH_ESP8266
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#define WebServerImpl ESP8266WebServer
#elif ARDUINO_ARCH_ESP32
#include <WiFi.h>
#include <WebServer.h>
#define WebServerImpl WebServer
#else
#error Unsupported architecture, use ARDUINO_ARCH_ESP8266 or ARDUINO_ARCH_ESP32
#endif
// Это ip адрес по которому будет доступен веб-сервер
IPAddress local_ip(192, 168,   4, 22);
// Это ip адрес шлюза, этот шлюз будут использовать wifi клиенты подключившиеся к точке доступа
IPAddress gateway (192, 168,   4,  9);
// Это маска подсети
IPAddress subnet  (255, 255, 255,  0);
// Экземпляр веб-сервера
WebServerImpl server(80);
// Это обработчик для запроса корневого url
void handle_root() {
  // Отвечаем текстом что выполнен запрос корневого url
  server.send(200, "text/plain", "This is response for root url.");
}
// Это обработчик для url /my-status
void handle_my_status() {
  // Строим документ
  StaticJsonDocument<256> doc;
  // Добавляем строковый элемент с именем "some_text" и значением "bla-bla"
  doc["some_text"] = "bla-bla";
  // Добавляем числовой элемент с именем "my_millis" и значением полученных millis
  doc["my_millis"] = millis();
  String output;
  // Серилизуем в строку
  serializeJson(doc, output);
  // Отправляем ответ клиенту
  server.send(200, "application/json", output);
}
// Это обработчик для всех остальных запросов
void handle_not_found() {
  // Отвечаем запросившему всё что мы о нем думаем
  // и отправляем обратно то, что он прислал в запросе.
  String message = "File Not Found\n\n";
  // Добавляем uri
  message += "URI: ";
  message += server.uri();
  // Добавляем запрошенный метод
  message += "\nMethod: ";
  message += server.method() == HTTP_GET ? "GET" : "POST";
  // Если в строке запроса есть ещё аргументы, добавим их в сообщение
  if (server.args() > 0) {
    message += "\nArguments: ";
    // Указываем сколько было аргументов
    message += server.args();
    message += "\n";
    // Добавляем аргументы 'ключ: значение'
    for (uint8_t i = 0; i < server.args(); i++){
      message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
    }
  }
  // Отправляем ответ
  server.send(404, "text/plain", message);
}
void setup() {
  // Инициализируем wifi
  // Отключаем сохранение параметров во флеш
  WiFi.persistent(false);
  // Выключаем wifi совсем
  WiFi.mode(WIFI_OFF);
  // Зачем-то спим немножко
  delay(100);
  // Устанавливаем параметры ip для интерфейса AP
  WiFi.softAPConfig(local_ip, gateway, subnet);
  // Выбираем режим работы wifi
  WiFi.mode(WIFI_AP);
  // Задаем идентификатор SSID
  WiFi.softAP("MY-ESP");
  // Настраиваем веб-сервер
  // Устанавливаем обработчик корневого url
  server.on("/", HTTP_GET, handle_root);
  // Устанавливаем обработчик для url /my-status
  server.on("/my-status", HTTP_GET, handle_my_status);
  // Устанавливаем обработчик для всего остального не обработанного
  server.onNotFound(handle_not_found);
  // Запускаем сервер
  server.begin();
}
void loop() {
  // Даем серверу обрабатывать запросы
  server.handleClient();
}
 

Алексей.

Active member
Но я просто не втыкаю от куда это все береться? Какая библиотека? Как мне добавить чтение и обработку GET ?
Библиотека веб-сервера та что есть в СДК, заголовочные файлы в примере.
Внешняя библиотека только ArduinoJson, берется или из менеджера библиотек или клонируется с гитхаба, как удобнее, так и добывается.
"Чтение" get запроса уже выполнил сервер и вызвал указанный обработчик, читать уже нечего.
Все необходимые данные запрашиваем у сервера когда выполняется код обработчика.
У меня слова все кончились...
Код:
#include <Arduino.h>
#include <ArduinoJson.h>
#ifdef ARDUINO_ARCH_ESP8266
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#define WebServerImpl ESP8266WebServer
#elif ARDUINO_ARCH_ESP32
#include <WiFi.h>
#include <WebServer.h>
#define WebServerImpl WebServer
#else
#error Unsupported architecture, use ARDUINO_ARCH_ESP8266 or ARDUINO_ARCH_ESP32
#endif
// Это ip адрес по которому будет доступен веб-сервер
IPAddress local_ip(192, 168,   4, 22);
// Это ip адрес шлюза, этот шлюз будут использовать wifi клиенты подключившиеся к точке доступа
IPAddress gateway (192, 168,   4,  9);
// Это маска подсети
IPAddress subnet  (255, 255, 255,  0);
// Экземпляр веб-сервера
WebServerImpl server(80);

// Статические переменные, отправляемые на каждом get запросе в котором присутствует нужная url
int volume_value = 0;
boolean on_value = false;
long time_value = 0;

// Это обработчик для всех запросов GET POST и т.д.
void handle_not_found() {
  // Предварительно установим код ответа
  int response_code = 404;
  // Обрабатываем только GET запросы, на все остальные отвечаем 404-м кодом
  if (server.method() == HTTP_GET) {
    if (server.uri().indexOf("/volume_increase") >= 0) {
      // TODO Вот тут что то делаем, был запрошен /volume_increase
      // Устанавливаем значение volume_value, чтоб как-то проинформировать
      // что обрабатывался запрос /volume_increase
      volume_value = 10;
      // Устанавливаем код ответа
      response_code = 200;
    } else if (server.uri().indexOf("/volume_decrease") >= 0) { 
      // TODO
      volume_value = 20;
      response_code = 200;
    } else if (server.uri().indexOf("/device_on") >= 0) { 
      // TODO
      volume_value = 30;
      response_code = 200;
    } else if (server.uri().indexOf("/device_off") >= 0) { 
      volume_value = 40;
      // TODO
      response_code = 200;
    } else if (server.uri().indexOf("/timer_increase") >= 0) { 
      // TODO
      volume_value = 50;
      response_code = 200;
    } else if (server.uri().indexOf("/timer_decrease") >= 0) { 
      // TODO
      volume_value = 60;
      response_code = 200;
    } else if (server.uri().indexOf("/state") >= 0) { 
      response_code = 200;
    }
  }
  // Код ответа ответа был установлен отличным от 404, значит нужно ответить статусом
  if (response_code != 404) {
    // Строим json документ
    StaticJsonDocument<256> doc;
    // Устанавливаем значение "volume"
    doc["volume"] = volume_value;
    // Устанавливаем значение "on"
    doc["on"] = on_value;
    // Устанавливаем значение "time"
    doc["time"] = time_value;
    // Серилизуем json документ в строку
    String output;
    serializeJson(doc, output);
    // Отправляем ответ
    server.send(response_code, "application/json", output);
  } else {
    // Отправляем ответ
    server.send(response_code, "text/plain", "File Not Found\n\n");
  }
}
void setup() {
  // Инициализируем wifi
  // Отключаем сохранение параметров во флеш
  WiFi.persistent(false);
  // Выключаем wifi совсем
  WiFi.mode(WIFI_OFF);
  // Устанавливаем параметры ip для интерфейса AP
  WiFi.softAPConfig(local_ip, gateway, subnet);
  // Выбираем режим работы wifi
  WiFi.mode(WIFI_AP);
  // Задаем идентификатор SSID
  WiFi.softAP("MY-ESP");
 
  // Настраиваем веб-сервер
  // Устанавливаем обработчик для всех запросов, определять методы и запрошенные url будем в нем
  server.onNotFound(handle_not_found);
  // Запускаем сервер
  server.begin();
}
void loop() {
  // Даем серверу обрабатывать запросы
  server.handleClient();
}
На ПК
запрашиваю /device_on и получаю json со статусом
~$ curl http://192.168.4.22/device_on
{"volume":30,"on":false,"time":0}
запрашиваю /
~$ curl http://192.168.4.22/
File Not Found
 
Сверху Снизу