Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

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

Тема в разделе "Железные вопросы по esp8266", создана пользователем Mestniy2496, 5 дек 2019.

  1. Алексей.

    Алексей. Авторитетный участник сообщества

    Сообщения:
    625
    Симпатии:
    73
    Если бы вы выполнили запрос /ON на приведенном примере, то увидили бы в ответ
    Код (Text):
    1. File Not Found
    2.  
    3. URI:  /ON
    4. Method: GET
    Такое впечатление, что вам это не очень интересно и вы нас просто тролите.
     
  2. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    Да не тролю я! Попробую. Спасибо вам огромное!
     
  3. enjoynering

    enjoynering Авторитетный участник сообщества

    Сообщения:
    608
    Симпатии:
    61
    он просто не понимает. совсем новичок. сам лет 5 назад вот так же тупил.
     
  4. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    Я правильно понял что мне мои предполагаемые запросы нужно добавить так:
    Код (C):
    1. doc["some_text"] = "volume_increase", "volume_decrease", "device_on", "device_off", "timer_increase", "timer_decrease", "state";
     
  5. Алексей.

    Алексей. Авторитетный участник сообщества

    Сообщения:
    625
    Симпатии:
    73
    Нет не так, для запросов /volume_increase /volume_decrease /device_on /device_off /timer_increase /timer_decrease /state
    в обработчике not found выполнять поиск server.uri().indexOf("/volume_increase") и прочих урлов
    если урло найдено, выполнять соответствующее действие, подготавливать ответ
    Код (C):
    1. int volume_value;
    2. boolean on_value;
    3. long time_value;
    4.  
    5. StaticJsonDocument<256> doc;
    6. doc["volume"] = volume_value;
    7. doc["on"] = on_value;
    8. doc["time"] = time_value;
    9.  
    10. String output;
    11. serializeJson(doc, output);
    12. server.send(200, "application/json", output);
    и отправлять его клиенту
     
  6. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    Спасибо большое. Покажите пожалуйста - можно где отправляется ответ? И где он формируется? Можете обьяснить? Спасибо большое.
     
  7. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    Просто я ответ хочу отправлять постоянно. Ибо хочу сделать таймер именно на МК - и данные Таймера в реалтайм отправлять подключившемуся устройству.
     
  8. Mestniy2496

    Mestniy2496 Новичок

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

    Алексей. Авторитетный участник сообщества

    Сообщения:
    625
    Симпатии:
    73
    Вы выбрали протокол http, со стороны клиента (андроид) используете HttpURLConnection который выполняет метод GET, т.е. клиент строит запрос, соединяется с сервером, отправляет запрос и получает на него ответ.
    В HttpWorker.getSource выполняется чтение ответа пока из потока пока можно ещё что-то прочитать, обработка ответа выполняется не взирая на код ответа, который может быть и не двухсотый и не взирая на Content-Type который может быть и не json позже выполняется разбор ответа как json.
    Таким образом, после получения ответа, дальнейшее чтение не выполняется.
    Скажите пожалуйста, как без запросов клиент должен обрабатывать неожиданные ответы которые МК будет посылать?
    Вы ждете кода который вам напишут? Немножко не тот раздел выбрали.
     
    Mestniy2496 нравится это.
  10. Mestniy2496

    Mestniy2496 Новичок

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

    Алексей. Авторитетный участник сообщества

    Сообщения:
    625
    Симпатии:
    73
    Неожиданный поворот, я в вашем коде указал где это выполняется (HttpWorker.getSource), а вы не можете это найти...
    Вы уверены что вам это нужно?
     
    Mestniy2496 нравится это.
  12. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    Стоп - но это же в приложении. А мне нужно слушать GET запросы и не только отправлять ответ, а допустим при приходе какой то команды отправлять в serial чтолибо.
     
  13. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.278
    Симпатии:
    238
    @Mestniy2496 что вам мешает отправлять? И что такое "приложение"?
    Вы для себя и для помощников хоть схему обрисуйте, а то совсем ничего непонятно что вы говорите.
     
    Mestniy2496 нравится это.
  14. Mestniy2496

    Mestniy2496 Новичок

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

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    • 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"));
    Вот то что я отправлял ранее
     
  16. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.278
    Симпатии:
    238
    @Mestniy2496 так Алексей вам ответил. И место указал. При чем тут ваше приложение?
     
    Mestniy2496 нравится это.
  17. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    А где HttpWorker.getSource есть в прошивке? Оно есть в приложении
     
  18. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    А стоп - мне просто нужно добавить в мой код чтение GET с помощью HttpWorker.getSource
     
  19. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    Но я просто не втыкаю от куда это все береться? Какая библиотека? Как мне добавить чтение и обработку GET ?
    Код (C):
    1. #include <Arduino.h>
    2. #include <ArduinoJson.h>
    3. #ifdef ARDUINO_ARCH_ESP8266
    4. #include <ESP8266WiFi.h>
    5. #include <ESP8266WebServer.h>
    6. #define WebServerImpl ESP8266WebServer
    7. #elif ARDUINO_ARCH_ESP32
    8. #include <WiFi.h>
    9. #include <WebServer.h>
    10. #define WebServerImpl WebServer
    11. #else
    12. #error Unsupported architecture, use ARDUINO_ARCH_ESP8266 or ARDUINO_ARCH_ESP32
    13. #endif
    14. // Это ip адрес по которому будет доступен веб-сервер
    15. IPAddress local_ip(192, 168,   4, 22);
    16. // Это ip адрес шлюза, этот шлюз будут использовать wifi клиенты подключившиеся к точке доступа
    17. IPAddress gateway (192, 168,   4,  9);
    18. // Это маска подсети
    19. IPAddress subnet  (255, 255, 255,  0);
    20. // Экземпляр веб-сервера
    21. WebServerImpl server(80);
    22. // Это обработчик для запроса корневого url
    23. void handle_root() {
    24.   // Отвечаем текстом что выполнен запрос корневого url
    25.   server.send(200, "text/plain", "This is response for root url.");
    26. }
    27. // Это обработчик для url /my-status
    28. void handle_my_status() {
    29.   // Строим документ
    30.   StaticJsonDocument<256> doc;
    31.   // Добавляем строковый элемент с именем "some_text" и значением "bla-bla"
    32.   doc["some_text"] = "bla-bla";
    33.   // Добавляем числовой элемент с именем "my_millis" и значением полученных millis
    34.   doc["my_millis"] = millis();
    35.   String output;
    36.   // Серилизуем в строку
    37.   serializeJson(doc, output);
    38.   // Отправляем ответ клиенту
    39.   server.send(200, "application/json", output);
    40. }
    41. // Это обработчик для всех остальных запросов
    42. void handle_not_found() {
    43.   // Отвечаем запросившему всё что мы о нем думаем
    44.   // и отправляем обратно то, что он прислал в запросе.
    45.   String message = "File Not Found\n\n";
    46.   // Добавляем uri
    47.   message += "URI: ";
    48.   message += server.uri();
    49.   // Добавляем запрошенный метод
    50.   message += "\nMethod: ";
    51.   message += server.method() == HTTP_GET ? "GET" : "POST";
    52.   // Если в строке запроса есть ещё аргументы, добавим их в сообщение
    53.   if (server.args() > 0) {
    54.     message += "\nArguments: ";
    55.     // Указываем сколько было аргументов
    56.     message += server.args();
    57.     message += "\n";
    58.     // Добавляем аргументы 'ключ: значение'
    59.     for (uint8_t i = 0; i < server.args(); i++){
    60.       message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
    61.     }
    62.   }
    63.   // Отправляем ответ
    64.   server.send(404, "text/plain", message);
    65. }
    66. void setup() {
    67.   // Инициализируем wifi
    68.   // Отключаем сохранение параметров во флеш
    69.   WiFi.persistent(false);
    70.   // Выключаем wifi совсем
    71.   WiFi.mode(WIFI_OFF);
    72.   // Зачем-то спим немножко
    73.   delay(100);
    74.   // Устанавливаем параметры ip для интерфейса AP
    75.   WiFi.softAPConfig(local_ip, gateway, subnet);
    76.   // Выбираем режим работы wifi
    77.   WiFi.mode(WIFI_AP);
    78.   // Задаем идентификатор SSID
    79.   WiFi.softAP("MY-ESP");
    80.   // Настраиваем веб-сервер
    81.   // Устанавливаем обработчик корневого url
    82.   server.on("/", HTTP_GET, handle_root);
    83.   // Устанавливаем обработчик для url /my-status
    84.   server.on("/my-status", HTTP_GET, handle_my_status);
    85.   // Устанавливаем обработчик для всего остального не обработанного
    86.   server.onNotFound(handle_not_found);
    87.   // Запускаем сервер
    88.   server.begin();
    89. }
    90. void loop() {
    91.   // Даем серверу обрабатывать запросы
    92.   server.handleClient();
    93. }
    94.  
     
  20. Алексей.

    Алексей. Авторитетный участник сообщества

    Сообщения:
    625
    Симпатии:
    73
    Библиотека веб-сервера та что есть в СДК, заголовочные файлы в примере.
    Внешняя библиотека только ArduinoJson, берется или из менеджера библиотек или клонируется с гитхаба, как удобнее, так и добывается.
    "Чтение" get запроса уже выполнил сервер и вызвал указанный обработчик, читать уже нечего.
    Все необходимые данные запрашиваем у сервера когда выполняется код обработчика.
    У меня слова все кончились...
    Код (C):
    1. #include <Arduino.h>
    2. #include <ArduinoJson.h>
    3. #ifdef ARDUINO_ARCH_ESP8266
    4. #include <ESP8266WiFi.h>
    5. #include <ESP8266WebServer.h>
    6. #define WebServerImpl ESP8266WebServer
    7. #elif ARDUINO_ARCH_ESP32
    8. #include <WiFi.h>
    9. #include <WebServer.h>
    10. #define WebServerImpl WebServer
    11. #else
    12. #error Unsupported architecture, use ARDUINO_ARCH_ESP8266 or ARDUINO_ARCH_ESP32
    13. #endif
    14. // Это ip адрес по которому будет доступен веб-сервер
    15. IPAddress local_ip(192, 168,   4, 22);
    16. // Это ip адрес шлюза, этот шлюз будут использовать wifi клиенты подключившиеся к точке доступа
    17. IPAddress gateway (192, 168,   4,  9);
    18. // Это маска подсети
    19. IPAddress subnet  (255, 255, 255,  0);
    20. // Экземпляр веб-сервера
    21. WebServerImpl server(80);
    22.  
    23. // Статические переменные, отправляемые на каждом get запросе в котором присутствует нужная url
    24. int volume_value = 0;
    25. boolean on_value = false;
    26. long time_value = 0;
    27.  
    28. // Это обработчик для всех запросов GET POST и т.д.
    29. void handle_not_found() {
    30.   // Предварительно установим код ответа
    31.   int response_code = 404;
    32.   // Обрабатываем только GET запросы, на все остальные отвечаем 404-м кодом
    33.   if (server.method() == HTTP_GET) {
    34.     if (server.uri().indexOf("/volume_increase") >= 0) {
    35.       // TODO Вот тут что то делаем, был запрошен /volume_increase
    36.       // Устанавливаем значение volume_value, чтоб как-то проинформировать
    37.       // что обрабатывался запрос /volume_increase
    38.       volume_value = 10;
    39.       // Устанавливаем код ответа
    40.       response_code = 200;
    41.     } else if (server.uri().indexOf("/volume_decrease") >= 0) {
    42.       // TODO
    43.       volume_value = 20;
    44.       response_code = 200;
    45.     } else if (server.uri().indexOf("/device_on") >= 0) {
    46.       // TODO
    47.       volume_value = 30;
    48.       response_code = 200;
    49.     } else if (server.uri().indexOf("/device_off") >= 0) {
    50.       volume_value = 40;
    51.       // TODO
    52.       response_code = 200;
    53.     } else if (server.uri().indexOf("/timer_increase") >= 0) {
    54.       // TODO
    55.       volume_value = 50;
    56.       response_code = 200;
    57.     } else if (server.uri().indexOf("/timer_decrease") >= 0) {
    58.       // TODO
    59.       volume_value = 60;
    60.       response_code = 200;
    61.     } else if (server.uri().indexOf("/state") >= 0) {
    62.       response_code = 200;
    63.     }
    64.   }
    65.   // Код ответа ответа был установлен отличным от 404, значит нужно ответить статусом
    66.   if (response_code != 404) {
    67.     // Строим json документ
    68.     StaticJsonDocument<256> doc;
    69.     // Устанавливаем значение "volume"
    70.     doc["volume"] = volume_value;
    71.     // Устанавливаем значение "on"
    72.     doc["on"] = on_value;
    73.     // Устанавливаем значение "time"
    74.     doc["time"] = time_value;
    75.     // Серилизуем json документ в строку
    76.     String output;
    77.     serializeJson(doc, output);
    78.     // Отправляем ответ
    79.     server.send(response_code, "application/json", output);
    80.   } else {
    81.     // Отправляем ответ
    82.     server.send(response_code, "text/plain", "File Not Found\n\n");
    83.   }
    84. }
    85. void setup() {
    86.   // Инициализируем wifi
    87.   // Отключаем сохранение параметров во флеш
    88.   WiFi.persistent(false);
    89.   // Выключаем wifi совсем
    90.   WiFi.mode(WIFI_OFF);
    91.   // Устанавливаем параметры ip для интерфейса AP
    92.   WiFi.softAPConfig(local_ip, gateway, subnet);
    93.   // Выбираем режим работы wifi
    94.   WiFi.mode(WIFI_AP);
    95.   // Задаем идентификатор SSID
    96.   WiFi.softAP("MY-ESP");
    97.  
    98.   // Настраиваем веб-сервер
    99.   // Устанавливаем обработчик для всех запросов, определять методы и запрошенные url будем в нем
    100.   server.onNotFound(handle_not_found);
    101.   // Запускаем сервер
    102.   server.begin();
    103. }
    104. void loop() {
    105.   // Даем серверу обрабатывать запросы
    106.   server.handleClient();
    107. }
    108.  
    На ПК
    запрашиваю /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
     

Поделиться этой страницей