Здравствуйте! В наличии ESP-12E и ESP-01S, как первый так и второй модуль должны как принимать так и отправлять UDP сообщения. ESP-01S постоянно подключен к общей точке доступа и имеет личный статически IP-адрес. ESP-12E не всегда может быть включен, так как питается от батарейки, которая садится время от времени. При каждом включении или переподключении к общей точке доступа ESP-12E отправляет UDP-сообщение длиной в 1 байт на ESP-01S, в свою очередь тот считывает сообщение и отправляет ответ в виде строки, записанной в символьном массиве, и ждёт ответа от ESP-12E. ESP-12E постоянно прослушивает порт и при каждом входящем сообщении считывает его. Таких сообщений всего должно быть 9. Если ESP-01S не дождался ответа в течении определенного периода, то отправляет повторно сообщение. Таких попыток всего 3.
Запрос размером в 1 байт ESP-01S считывает, отправляет ответ в виде строки на ESP-12E, но тот в свою очередь вообще не видит этого сообщения. Пробовал менять порты, IP-адреса, способ отправки ответа, создавал отдельный экземпляр типа WiFiUDP, но ничего не помогло. С помощью Packet Sender отправлял пакеты, ответы от обоих модулей приходили мгновенно. Для написания кода использовал Arduino IDE.
Скетч ESP-01S:
Запрос размером в 1 байт ESP-01S считывает, отправляет ответ в виде строки на ESP-12E, но тот в свою очередь вообще не видит этого сообщения. Пробовал менять порты, IP-адреса, способ отправки ответа, создавал отдельный экземпляр типа WiFiUDP, но ничего не помогло. С помощью Packet Sender отправлял пакеты, ответы от обоих модулей приходили мгновенно. Для написания кода использовал Arduino IDE.
Скетч ESP-01S:
Код:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <SoftwareSerial.h>
#define localPort 500
SoftwareSerial mySerial(2,3); // RX, TX
uint8_t count, key = 0, timeAnswer = 0;
char ssid1[] = "STOP";
char ssid2[] = "BOBER-FM";
char pass1[] = "06640664";
char pass2[] = "99999999";
char Buffer[4] = {'0'};
char Packet[9][5];
char State_of_loom[9][5] = {{'1','7','1','0','\0'}, //Состояние станков
{'1','6','0','0','\0'},
{'1','5','1','0','\0'},
{'0','1','0','0','\0'},
{'0','2','0','0','\0'},
{'0','3','0','0','\0'},
{'0','4','0','0','\0'},
{'0','5','0','0','\0'},
{'0','6','1','0','\0'}};
WiFiUDP Udp;
void Connect()
{
while (WiFi.status()!= WL_CONNECTED)
{
WiFi.begin(ssid1, pass1);
delay(5000);
if (WiFi.status() != WL_CONNECTED)
{
WiFi.begin(ssid2, pass2);
delay(5000);
if (WiFi.status() != WL_CONNECTED)
delay(30000);
}
}
Serial.println(WiFi.SSID());
Serial.println(WiFi.localIP());
}
void Send(char *str)
{
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write(str, sizeof(str));
Udp.endPacket();
}
void UDP_Request()
{
int packetSize = Udp.parsePacket();
if (packetSize == 1) //если пришел один байт (запрос), отправить первую строку и ждать ответа
{
count = 0;
Udp.read();
Serial.println("Request from ESP-12E");
Send(State_of_loom[count]);
Serial.println(State_of_loom[count]);
key = 1;
}
else if (packetSize > 1) //если пришло больше одного байта, то отправить следующую строку
{ //или очистить Buffer
Udp.read();
Serial.println("Answer from ESP-12E");
if (Buffer[0] != '0')
memset(Buffer,'0',4);
else if (count < 8)
{
count++;
Send(State_of_loom[count]);
Serial.println(State_of_loom[count]);
timeAnswer = 0;
}
key = 0;
}
else if (key > 0)
{
timeAnswer++;
if (timeAnswer > 50) //после 50 циклов ожидания ответа отправляем сообщение снова
{
timeAnswer = 0;
key++;
Serial.print("key: ");
Serial.println(key);
if (Buffer[0] != '0')
Send(Buffer);
else
{
Send(State_of_loom[count]);
Serial.println(State_of_loom[count]);
}
if (key == 4) //максимум 3 раза отправляем, если нет ответа
key = 0;
}
}
}
void setup()
{
//mySerial.begin(57600); // открываем программный серийный порт
Serial.begin(115200);
Connect();
Udp.begin(localPort); // Начинаем «слушать» клиентов:
}
void loop()
{
if (WiFi.status() == WL_CONNECTED)
{
UDP_Request();
/*
if (mySerial.available())
{
for (uint8_t i = 0; i < 4; i++) //Считываем оповещение
Buffer[i] = mySerial.read();
Send(Buffer); //отправляем оповещение с ожиданием ответа
timeAnswer = 0;
key = 1;
}
*/
}
else
Connect();
delay(100);
}