• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Udp + http запросы

kvs

New member
Несколько блоков на ESP8266 esp-12e соединил через протокол UDP. Вся информация с них собирается в один блок (сервер).

Всю информацию мне нужно передавать на смартфон через http запросы. Перевел (сервер) в режим АР, подключился к роутеру, дал свой IP, не работает.

Подскажите где ошибка. Что я делаю не так?

WiFi.mode(WIFI_AP);
WiFi.begin(ssid1, password1);
WiFi.config(IPAddress(192,168,0,100),IPAddress(192,168,0,1),IPAddress(255,255,255,0));
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
--------------------------------------------------------------------------------------------
WiFi.softAP(ssid2, password2);
WiFi.softAPConfig(IPAddress(192,168,0,200),IPAddress(192,168,0,1),IPAddress(255,255,255,0));
Udp.begin(localUdpPort);
 

kvs

New member
А что должно работать и как? Где обработчики запросов http?
Инициализация, прием запроса и ответ:
void HTTP_init()
{
HTTP.onNotFound(handleNotFound); // Сообщение если нет страницы
HTTP.on("/led4", Led4); // Ответ при коннекте (спаривании)вида
HTTP.begin(); // Запускаем HTTP сервер
}
void Led4()
{
//обработка запроса
HTTP.send(200, "text/plain", "ok"); // ответ
}
 
Последнее редактирование:

Алексей.

Active member
wl_connected когда установлен режим sta и есп подключилась к роутеру, у вас вечный цикл получился
 

kvs

New member
wl_connected когда установлен режим sta и есп подключилась к роутеру, у вас вечный цикл получился
void setup()
{
WiFi.mode(WIFI_AP);
WiFi.begin(ssid1, password1);
WiFi.config(IPAddress(192,168,0,100),IPAddress(192,168,0,1),IPAddress(255,255,255,0));
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}

WiFi.softAP(ssid2, password2);
WiFi.softAPConfig(IPAddress(192,168,0,200),IPAddress(192,168,0,1),IPAddress(255,255,255,0));
Udp.begin(localUdpPort);
HTTP_init();
}
void loop()
{
HTTP.handleClient();
// основная программа
}


void HTTP_init()
{
HTTP.onNotFound(handleNotFound); // Сообщение если нет страницы
HTTP.on("/led4", Led4); // Ответ при коннекте (спаривании)вида
HTTP.begin(); // Запускаем HTTP сервер
}
void Led4()
{
//обработка запроса
HTTP.send(200, "text/plain", "ok");
}
 

Алексей.

Active member
kvs,
Вы устанавливаете режим AP
WiFi.mode(WIFI_AP)
затем в цикле while (WiFi.status() != WL_CONNECTED) проверяете условие которое всегда срабатывает
смотрим прототип ESP8266WiFi.h
Код:
class ESP8266WiFiClass : public ESP8266WiFiGenericClass, public ESP8266WiFiSTAClass, public ESP8266WiFiScanClass, public ESP8266WiFiAPClass 
...
extern ESP8266WiFiClass WiFi;
Тот самый WiFi - экземпляр класса ESP8266WiFiClass который наследует ESP8266WiFiSTAClass, именно в нем реализован метод status
смотрим исходник ESP8266WiFiSTA.cpp
Код:
wl_status_t ESP8266WiFiSTAClass::status() {
    station_status_t status = wifi_station_get_connect_status();

    switch(status) {
        case STATION_GOT_IP:
            return WL_CONNECTED;
        case STATION_NO_AP_FOUND:
            return WL_NO_SSID_AVAIL;
        case STATION_CONNECT_FAIL:
        case STATION_WRONG_PASSWORD:
            return WL_CONNECT_FAILED;
        case STATION_IDLE:
            return WL_IDLE_STATUS;
        default:
            return WL_DISCONNECTED;
    }
}
wifi_station_get_connect_status
Function: get the connection status between wifi station and AP
Если у вас был бы режим WIFI_STA или WIFI_AP_STA то могли получить WiFi.status() == WL_CONNECTED
 

kvs

New member
kvs,
Вы устанавливаете режим AP
WiFi.mode(WIFI_AP)
затем в цикле while (WiFi.status() != WL_CONNECTED) проверяете условие которое всегда срабатывает
смотрим прототип ESP8266WiFi.h
Код:
class ESP8266WiFiClass : public ESP8266WiFiGenericClass, public ESP8266WiFiSTAClass, public ESP8266WiFiScanClass, public ESP8266WiFiAPClass
...
extern ESP8266WiFiClass WiFi;
Тот самый WiFi - экземпляр класса ESP8266WiFiClass который наследует ESP8266WiFiSTAClass, именно в нем реализован метод status
смотрим исходник ESP8266WiFiSTA.cpp
Код:
wl_status_t ESP8266WiFiSTAClass::status() {
    station_status_t status = wifi_station_get_connect_status();

    switch(status) {
        case STATION_GOT_IP:
            return WL_CONNECTED;
        case STATION_NO_AP_FOUND:
            return WL_NO_SSID_AVAIL;
        case STATION_CONNECT_FAIL:
        case STATION_WRONG_PASSWORD:
            return WL_CONNECT_FAILED;
        case STATION_IDLE:
            return WL_IDLE_STATUS;
        default:
            return WL_DISCONNECTED;
    }
}
wifi_station_get_connect_status
Function: get the connection status between wifi station and AP
Если у вас был бы режим WIFI_STA или WIFI_AP_STA то могли получить WiFi.status() == WL_CONNECTED
Но в режиме WIFI_AP_STA тоже не работает, я пробовал. Я в этих тонкостях плохо разбираюсь! Подскажите как и что в данном случае можно сделать.
 

kvs

New member
Скажите зачем вам sta? Для каких целей? К какой точке доступа (к какому роутеру) подключаться собираетесь?
Мне режим STA не нужен, мне нуден режим AP (сервера). И в программе у меня указан режим AP, а режим WIFI_AP_STA я просто пробовал.
 

Алексей.

Active member

Алексей.

Active member
и значит что вы всегда будите получать статус не равный wl_connected
Мне режим STA не нужен
Если не нужен, то зачем ждать пока статус станет wl_connected?
я же в первом ответе говорил что только для режима sta при подключении к точке доступа/роутеру вы получите wl_connected, для установленного вами режима ap вы не дождетесь этого статуса.
 

CodeNameHawk

Moderator
Команда форума
Перевел (сервер) в режим АР, подключился к роутеру,
Если подключаетесь к роутеру, то почему не режим STA ?

Попробуйте так
Код:
WiFi.mode(WIFI_STA);
WiFi.config(IPAddress(192,168,0,100),IPAddress(192,168,0,1),IPAddress(255,255,255,0));
WiFi.begin(ssid1, password1);
У вас получается, что сперва вы соединяетесь, а потом пробуете поменять параметры.
 

kvs

New member
и значит что вы всегда будите получать статус не равный wl_connected

Если не нужен, то зачем ждать пока статус станет wl_connected?
я же в первом ответе говорил что только для режима sta при подключении к точке доступа/роутеру вы получите wl_connected, для установленного вами режима ap вы не дождетесь этого статуса.
В режиме WIFI_STA
и значит что вы всегда будите получать статус не равный wl_connected

Если не нужен, то зачем ждать пока статус станет wl_connected?
я же в первом ответе говорил что только для режима sta при подключении к точке доступа/роутеру вы получите wl_connected, для установленного вами режима ap вы не дождетесь этого статуса.
и значит что вы всегда будите получать статус не равный wl_connected

Если не нужен, то зачем ждать пока статус станет wl_connected?
я же в первом ответе говорил что только для режима sta при подключении к точке доступа/роутеру вы получите wl_connected, для установленного вами режима ap вы не дождетесь этого статуса.
Почему не дождусь? В режиме АР у меня есть connected с роутером. Я проверил через программу LAN Scan. Он встает как в программе с IP 192,168,0,119, но при запросе запрос не получает.
 

Алексей.

Active member
я уж и не знаю какими словами ответить, как вам объяснить, что wl_connected это когда STA подключилась к AP а не AP подключилась куда то, AP не подключается, к ней подключаются.
Аналог
AP - wifi роутер
STA - смартфон, планшет, ПК и т.п.
роутер не подключается к клиентам, клиенты подключаются к роутеру
 

kvs

New member
я уж и не знаю какими словами ответить, как вам объяснить, что wl_connected это когда STA подключилась к AP а не AP подключилась куда то, AP не подключается, к ней подключаются.
Аналог
AP - wifi роутер
STA - смартфон, планшет, ПК и т.п.
роутер не подключается к клиентам, клиенты подключаются к роутеру
У меня получается так, если только:
WiFi.mode(WIFI_STA);
WiFi.begin(ssid1, password1);
WiFi.config(IPAddress(192,168,0,100),IPAddress 192,168,0,1),IPAddress(255,255,255,0));
то работают http запросы. Добавляю:
WiFi.softAP(ssid2, password2);
WiFi.softAPConfig(IPAddress(192,168,0,200),IPAddress(192,168,0,1),IPAddress(255,255,255,0));
Udp.begin(localUdpPort);
работает только протокол Udp, а http нет!
 

Алексей.

Active member
WiFi.config(IPAddress(192,168,0,100),IPAddress 192,168,0,1),IPAddress(255,255,255,0));
WiFi.softAPConfig(IPAddress(192,168,0,200),IPAddress(192,168,0,1),IPAddress(255,255,255,0));
Вы сами то представляете что делаете?
Для двух сетевых интерфейсов вы устанавливаете один и тот же шлюз и маску подсети, куда пакеты например для адреса 192.168.0.150 должны отправляться в первый сетевой интерфейс или во второй?
 

kvs

New member
WiFi.config(IPAddress(192,168,0,100),IPAddress 192,168,0,1),IPAddress(255,255,255,0));
WiFi.softAPConfig(IPAddress(192,168,0,200),IPAddress(192,168,0,1),IPAddress(255,255,255,0));
Вы сами то представляете что делаете?
Для двух сетевых интерфейсов вы устанавливаете один и тот же шлюз и маску подсети, куда пакеты например для адреса 192.168.0.150 должны отправляться в первый сетевой интерфейс или во второй?
Все понятно. Спасибо!
 
Сверху Снизу