• Система автоматизации с открытым исходным кодом на базе 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 должны отправляться в первый сетевой интерфейс или во второй?
Все понятно. Спасибо!
 
Сверху Снизу