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

Как назначить IP и МАС контроллеру ESP01

Gercon2

New member
Здравствуйте.

Загрузил скетч с этого урока.

Что надо добавить в этот скетч, чтобы ESP подключился к роутеру с назначенным мной IP-адресом и назначенным мной MAC-адресом?


Скетч в пункте "Загрузка кода ESP8266"


Спасибо.
 

Gercon2

New member
WiFi.config(local_ip, gateway, subnet, dns1, dns2)
Спасибо!

ESP01 успешно подключается именно с тем IP, который прописываю. Успешно пингуется. Но при этом в монитор порта (Arduino - IDE) выводится с перебоями: когда выводится, а когда -нет. Скорость порта настроена.
Это все находится в секции void setup в скетче ниже.

void setup(void)
{
Serial.begin(115200); // такая же скорость и в монитере порта
Serial.println();

Serial.printf("Connecting to %s\n", ssid);
WiFi.config(staticIP, gateway, subnet);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Connected, IP address: ");
Serial.println(WiFi.localIP());
}
 

Gercon2

New member
Мой порграмматор и ESP01

Это вставлено непосредственно в USB-порт компьютера. Программатор при этом находится в режиме UART.

Пока я не затер AT-команды в ESP, отклик на AT-команды был в норме.
 

pvvx

Активный участник сообщества
Есть и варианты с переключателем - тогда, скорее всего, вы путаете переключение переключателя на UART и не сбрасываете ESP ...
 

CodeNameHawk

Moderator
Команда форума
Пока я не затер AT-команды в ESP, отклик на AT-команды был в норме.
Если есп нормально прошивается, но плохо работает после этого, то попробуйте так.
Создайте новый скетч.
Выключите wifi, и просто выведите текст в сериял.
Покажите лог. загрузки скетча и вывода в сериял.
 

Gercon2

New member
#include "ESP8266WiFi.h"
#include "ESP8266WebServer.h"

uint8_t newMACAddress[] = {0xFA, 0xEB, 0xDC, 0xCD, 0xBE, 0xAF};

ESP8266WebServer server(10200);

const char* ssid = "ABRAKADABRA";
const char* password = "19661117";
byte tries = 10; // Попыткок подключения к точке доступа

void setup()
{

Serial.begin(9600);
WiFi.begin(ssid, password);

WiFi.mode(WIFI_STA);

Serial.print("[OLD] ESP8266 Board MAC Address: ");
Serial.println(WiFi.macAddress());

wifi_set_macaddr(STATION_IF, &newMACAddress[0]);
Serial.print("[NEW] ESP8266 Board MAC Address: ");
Serial.println(WiFi.macAddress());

while (--tries && WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}

if (WiFi.status() != WL_CONNECTED)
{
Serial.println("Non Connecting to WiFi..");
}
else
{
// Иначе удалось подключиться отправляем сообщение
// о подключении и выводим адрес IP
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

server.on("/other", []() //Определите функцию обработки для пути
{

server.send(200, "text / plain", "Additional page");

});

server.on("/", handleRootPath); //Свяжем функцию обработчика с путем
server.begin(); //Запускаем сервер
Serial.println("Server listening");
}

void loop()
{

server.handleClient(); //Обработка входящих запросов

}

void handleRootPath() //Обработчик для корневого пути
{


server.send(200, "text/plain", "Greetings from the site arduino-tex.ru");

}

В интернете это работает 100%.
Буду пробовать отключать Wi-Fi.
 

Gercon2

New member
В дополнение к #10. Проверялось за 2100 километров. Дальше не пробовал.
 

Gercon2

New member
⸮Ams⸮:zR⸮EE⸮AG⸮B⸮1⸮.......
WiFi connected
IP address:
192.168.0.62
Server listening

. Variables and constants in RAM (global, static), used 28868 / 80192 bytes (35%)
║ SEGMENT BYTES DESCRIPTION
╠══ DATA 1520 initialized variables
╠══ RODATA 1276 constants
╚══ BSS 26072 zeroed variables
. Instruction RAM (IRAM_ATTR, ICACHE_RAM_ATTR), used 59855 / 65536 bytes (91%)
║ SEGMENT BYTES DESCRIPTION
╠══ ICACHE 32768 reserved space for flash instruction cache
╚══ IRAM 27087 code in IRAM
. Code in flash (default, ICACHE_FLASH_ATTR), used 314092 / 1048576 bytes (29%)
║ SEGMENT BYTES DESCRIPTION
╚══ IROM 314092 code in flash
esptool.py v3.0
Serial port COM8
Connecting....
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 4c:11:ae:14:89:20
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 1MB
Erasing flash (this may take a while)...
Chip erase completed successfully in 3.9s
Compressed 348128 bytes to 238699...
Writing at 0x00000000... (6 %)
Writing at 0x00004000... (13 %)
Writing at 0x00008000... (20 %)
Writing at 0x0000c000... (26 %)
Writing at 0x00010000... (33 %)
Writing at 0x00014000... (40 %)
Writing at 0x00018000... (46 %)
Writing at 0x0001c000... (53 %)
Writing at 0x00020000... (60 %)
Writing at 0x00024000... (66 %)
Writing at 0x00028000... (73 %)
Writing at 0x0002c000... (80 %)
Writing at 0x00030000... (86 %)
Writing at 0x00034000... (93 %)
Writing at 0x00038000... (100 %)
Wrote 348128 bytes (238699 compressed) at 0x00000000 in 21.3 seconds (effective 130.7 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
 

Gercon2

New member
Есть и варианты с переключателем - тогда, скорее всего, вы путаете переключение переключателя на UART и не сбрасываете ESP ...
Нет, если путать UART-PROG, то и пинговаьтся не будет. А вместо сброса я выдергиваю его из USB, а затем переключаю режим.
 

pvvx

Активный участник сообщества
В дополнение к #10. Проверялось за 2100 километров. Дальше не пробовал.
Если на ESP настроен Web сервер, то можно проверить удаленную работу через любой бесплатный прокси.
Как раз будет доп. проверка правильности протокола TCP/IP, т.к. многие прокси работают не по стандарту, чтобы избежать у себя накопления TIME_WAIT, передав это на внешних участников :)

TIME_WAIT - одно из стандартных состояний TCP соединения, в который переходит сторона осуществляющая активное закрытие соединения.
Обойти TIME_WAIT возможно только нарушая RFC - стандарт TCP/IP.
 

pvvx

Активный участник сообщества
TIME_WAIT
Суть в том, что TCP пакеты могут путешествовать по сети через разные пути и приходить с разными задержками. Тот, кто первым закрывает TCP соединение должен ожидать 120 секунд на получение затерявшегося пакета с адресами и портами ранее закрытого соединения и отсылать на него повторный закрывающий соединение пакет (типа BREAK обычно). Т.е. после закрытия соединения новая связь задействованных ранее IP и портов в TCP невозможна в течении 120…180 секунд. Это так же указывает всяким роутера, шлюзам, что через данный период после закрытия можно убирать данное соединение из таблицы обслуживания.
Это может перегружать любой мощный сервер, если TCP (TIME_WAIT) описан не полностью – например, не учитывается сторонний IP : port, а берется только свой port, которых всего 65535 шт. Тогда за 120 секунд это кол-во портов может быть использовано и не останется на другие соединения. Lwip, используемый в ESP именно так и работает – не учитывает внешний IP : port в TIME_WAIT. Но у ESP с LWIP и так нет памяти для содержания 65535 шт структур описаний TCP соединений (более 100 байт на шт) и опроса 65535 таймеров . По этому в TCP у ESP всё вырезано и не соответствует никаким стандартам.
От этого бывают приколы - ESP долбится по своему-же ранее закрытому соединению и так и висит, создавая сотни красных полосок в Wireshark... :)
Когда пойдет связь с космическими фигнями всё будут усиленно чинить это.
 

pvvx

Активный участник сообщества
Прокси часто просто удаляют (не передают) TCP пакет закрытия соединения и удаляют внутреннее соединение, тем самым ожидая, что соединение закроет другая сторона и она будет заботиться об данном TIME_WAIT по всему интернет… А там ESP :)
 

pvvx

Активный участник сообщества
Не поддержка TIME_WAIT кроме дополнительной нагрузки на сеть так-же приводит к нарушению защиты любых TCP соединений. Позволяет без проблем вклиниться в “закрытое” соединение, т.е. продолжить его с уже переданными сертификатами, паролями и т.д..
 

Gercon2

New member
Сейчас для меня самое "страшное" - как в ESP отловить слово "privet", стоящее после вопросительного знака в адресной строке браузера, если в адресную строку браузера ввести что-то типа:
http://<статический IP-адрес>:10200?privet
 
Сверху Снизу