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

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

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

  1. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    Друзья Есть у кого примеры как можно реализовать подобную систему?
    Имеется приложение на андроид:
    Fireplace.zip
    Мне вот что нужно:
    • Это нужно реализовать в МК.
    • 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"));
    Интересует именно реализация ESp в качестве точки доступа. Без прохода через роутера. Именно Android и ESP. Заранее Спасибо
     
  2. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    Код (C):
    1. #include <ESP8266WiFi.h>
    2. void setup()
    3. {
    4.   Serial.begin(115200);
    5.   Serial.println();
    6.   Serial.print("Setting soft-AP ... ");
    7.            //  "Настройка программной точки доступа ... "
    8.   Serial.println(WiFi.softAP("Fireplace", "Fireplace") ? "Ready" : "Failed!");
    9. }
    10. void loop()
    11. {
    12. }
    Вот создание точки доступа в arduino IDE. как принять данные по HTTP от устройства, подключенного к этой ТД? И отправлять JSON? Я так понимаю нужна библиотека Arduinojson 6. Кто еще знаете что?
     
  3. enjoynering

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

    Сообщения:
    610
    Симпатии:
    61
    для 2019 года - это типовая задача на ESP (примеров куча)

    - Arduinojson
    - файловая система spiffs
    - и асинхронный webserver - ESPAsyncWebServer (хоть в режиме STA, хоть в AP)

    ограничение - 4 клиента.
     
    Mestniy2496 нравится это.
  4. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    Очень благодарен. Есть ссылки с примерами? Если не трудно...
     
  5. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    А и еще вопрос возник: При чем тут SPIFFS? Мне нужно принимать пакеты данных HTTP. Обрабатывать их и отправлять ответ по JSON.
     
  6. enjoynering

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

    Сообщения:
    610
    Симпатии:
    61
    я так понял вы из поклонения родившихся поле 80-х. только они имея под рукой гугл, яндекс и КЛЮЧЕВЫЕ слова для поиска все равно требуют ссылок. и лучше чтоб это был ютубчик, а не текст (читать щас не модно). молодеж. раньше чтобы достать информацию приходилось 2 часа на автобусе трястись до библиотеке, потом в картотеке рыться и ждать час пока книги принесут. а вам лень открыть новую вкладку, набрать ключевые слова и опа первая же ссылка ведет куда надо.

    если только принимать пакеты данных HTTP, обрабатывать их и отправлять ответ по JSON, то да SPIFFS не нужен.
     
    lookingooder и Mestniy2496 нравится это.
  7. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.743
    Симпатии:
    186
    Так все еще проще, вместе с библиотеками идут примеры.
     
  8. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    Ничего не получается =(((
    Не совместимы некотореы строки с ESP8266WebServer.
    Код (C):
    1. #include <ESP8266WiFi.h>
    2. #include <WiFiClient.h>
    3. #include <ESP8266WebServer.h>
    4. #include <ESP8266mDNS.h>
    5.  
    6. const char* ssid = "........";
    7. const char* password = "........";
    8.  
    9. ESP8266WebServer server(80);
    10. int volume_sound = 0;
    11. bool device;
    12. int volume_timer = 0;
    13. int state = 0;
    14. void handleRoot() {
    15.   server.send(200, "text/plain", "hello from esp8266!");
    16. }
    17.  
    18. void handleNotFound(){
    19.  
    20.   String message = "File Not Found\n\n";
    21.   message += "URI: ";
    22.   message += server.uri();
    23.   message += "\nMethod: ";
    24.   message += (server.method() == HTTP_GET)?"GET":"POST";
    25.   message += "\nArguments: ";
    26.   message += server.args();
    27.   message += "\n";
    28.   for (uint8_t i=0; i<server.args(); i++){
    29.     message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
    30.   }
    31.   server.send(404, "text/plain", message);
    32.  
    33. }
    34.  
    35. void setup(void){
    36.  
    37.   Serial.begin(115200);
    38.   WiFi.begin(ssid, password);
    39.   Serial.println("");
    40.  
    41.   // Wait for connection
    42.   while (WiFi.status() != WL_CONNECTED) {
    43.     delay(500);
    44.     Serial.print(".");
    45.   }
    46.   Serial.println("");
    47.   Serial.print("Connected to ");
    48.   Serial.println(ssid);
    49.   Serial.print("IP address: ");
    50.   Serial.println(WiFi.localIP());
    51.  
    52.   if (MDNS.begin("esp8266")) {
    53.     Serial.println("MDNS responder started");
    54.   }
    55.  
    56.   server.on("/", handleRoot);
    57.  
    58. server.on("/inline", HTTP_GET, [](){
    59.   server.send(200, "text/plain", "this works as well");
    60. });
    61.  
    62.   server.onNotFound(handleNotFound);
    63.  
    64.   server.begin();
    65.   Serial.println("HTTP server started");
    66. }
    67.  
    68. void loop(void){
    69.   server.handleClient();
    70. // проверяем, подключен ли клиент:
    71.   WiFiClient client = server.available();
    72.   if (!client) {
    73.     return;
    74.   }
    75.  
    76.   // ждем, когда клиент отправит какие-нибудь данные:
    77.   Serial.println("new client");  //  "новый клиент"
    78.   while(!client.available()){
    79.     delay(1);
    80.   }
    81.  
    82.   // считываем первую строчку запроса:
    83.   String request = client.readStringUntil('\r');
    84.   Serial.println(request);
    85.   client.flush();
    86.  
    87.    // обрабатываем запрос:
    88.   if (request.indexOf("/volume_increase") != -1) {
    89.     if (volume_sound < 10)
    90.     {
    91.     volume_sound = volume_sound+1;
    92.     Serial.println("volume_sound"+('0'+volume_sound))
    93.     }
    94.   }
    95.   delay(1);
    96.  
    97.   if (request.indexOf("/volume_decrease") != -1){
    98.     if (volume_sound > 0)
    99.     {
    100.     volume_sound = volume_sound - 1;
    101.     Serial.println('0'+volume_sound)
    102.     }
    103.   }
    104.   delay(1);
    105.  
    106.     if (request.indexOf("/timer_increase") != -1){
    107.     if (volume_sound < 90)
    108.     {
    109.     volume_sound = volume_sound + 10;
    110.     }
    111.   }
    112.   delay(1);
    113.  
    114.     if (request.indexOf("/timer_decrease") != -1){
    115.     if (volume_sound > 0)
    116.     {
    117.     volume_sound = volume_sound - 10;
    118.     }
    119.   }
    120.   delay(1);
    121.  
    122.     if (request.indexOf("/device_on") != -1){
    123.     device = true;
    124.   }
    125.  
    126.   delay(1);
    127.       if (request.indexOf("/device_off") != -1){
    128.     device = false;
    129.   }
    130.   delay(1);
    131.  
    132. }
    133. }
    Вот строка ошибки
    Код (C):
    1. WiFiClient client = server.available();
    А вот сама ошибка:
    Код (Text):
    1.  
    2. exit status 1
    3. 'using ESP8266WebServer = class esp8266webserver::ESP8266WebServerTemplate<WiFiServer>' has no member named 'available'
    4.  
    5. Этот отчёт будет иметь больше информации с
    6. включенной опцией Файл -> Настройки ->
    7. "Показать подробный вывод во время компиляции"
    8.  
     
  9. Алексей.

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

    Сообщения:
    625
    Симпатии:
    73
    Вы путаете кислое с зеленым, у сервера ESP8266WebServer вызываете метод, которого там нет. Этот метод есть у другого сервера WiFiServer.
     
  10. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    :(:(:(:(:( тогда я не понимаю как искать строки в этом методе с ESP8266WebServer.
     
  11. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    Я снова пришел насиловать ваши мозги. Не могу я посмотреть на входящие GET с помощью данной библиотеки. Хоть убейте.
     
  12. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    Можете мне обьяснить по строкам - как обработать get запрос и создать для него условие и обозначить IP?
     
  13. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    • "volume_increase";volume_decrease"; "device_on";"device_off"; "timer_increase";"timer_decrease";"state"; Вот что мне отправляет приложение по IP и порту, который я хотел бы указать в arduino. Оно приходит в ESP, мне нужно перенаправлять эти показатели по serial в ардуино. А в Arduino обрабатывать и отправлять ответ ESP а та в свою очередь отправляла бы JSON ответ подключенному устройству.
     
  14. Алексей.

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

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

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    Да этот пример я видел... Я не вижу где здесь обрабатывается get запрос? И как этот запрос отправить в Serial=(((((((
     
  16. Алексей.

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

    Сообщения:
    625
    Симпатии:
    73
    Если выполняется код в handle_root handle_my_status и handle_not_found - это как раз и есть то самое место где обрабатывается запрос.
    Основное назначение обработки запроса это выполнить какие-то действия и дать клиенту, отравившему его, адекватный ответ.
    Обработчики запроса для этого и предназначены. Выполните запрос и получите ответ.
    Как вы думаете, если запрос отправлять в сериал, то как из сериала получить ответ на запрос и передать его клиенту?
     
  17. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    Но ведь код загружается в есп? А на арде висят релюшки и т.д.. Дело в том что мне нужно что то отправлять в саму арудино, чтобы управлять компонентами. Я про это и говорил.
     
  18. Алексей.

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

    Сообщения:
    625
    Симпатии:
    73
    Вы спрашивали как настроить esp в режиме точки доступа и как задать её ip адрес, я это показал.
    Вы спрашивали как обрабатывать get запросы на веб-сервере, я показал как задать обработчики для конкретных методов и заданных url (в вашем случае должны быть /volume_increase /volume_decrease и т.д) .
    Более того, показал в обработчике handle_not_found как узнать какой метод и url был запрошен и какие аргументы были в строке запроса (если они были). Можете не задавать отдельно обработчики по url-ам и всё обрабатывать в handle_not_found, вылавливать ваши url в строке получаемой из server.uri()
    Про реле пожалуйста дайте ссылку на пост, я пока не нашел её.
    Если речь идет о get запросах (не post а именно get) и get используется для управления реле, то логика переворачивается с ног на голову однако. get-ом мы уже не спрашиваем про что-то, а выполняя get говорим включи/выключи реле.
    пичалька...
     
  19. Mestniy2496

    Mestniy2496 Новичок

    Сообщения:
    46
    Симпатии:
    0
    Спасибо вам за все это. Я не говрю что нужно get управлять реле - я хочу просто при получении допустим:
    "/ON" = отправлять в сериал к арде "ON". Обработку сериала я найду.
     
  20. Алексей.

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

    Сообщения:
    625
    Симпатии:
    73
    Так чтож вам мешает в обработчике not found вылавливать нужные url-ы отправлять в сериал что требуется, а клиенту отвечать двухсотым кодом, а если урло незнакомое отвечать 404-м.
     

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