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

Нужна помощь Не могу наладить обмен UDP сообщениями между двумя ESP8266

Тема в разделе "Общие вопросы по esp8266", создана пользователем Yasha, 6 мар 2019.

  1. Yasha

    Yasha Новичок

    Сообщения:
    12
    Симпатии:
    0
    Здравствуйте! В наличии 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:
    Код (C):
    1. #include <ESP8266WiFi.h>
    2. #include <WiFiUdp.h>
    3. #include <SoftwareSerial.h>
    4.  
    5. #define localPort   500
    6.  
    7. SoftwareSerial mySerial(2,3);       // RX, TX
    8.  
    9. uint8_t count, key = 0, timeAnswer = 0;
    10. char ssid1[] = "STOP";
    11. char ssid2[] = "BOBER-FM";
    12. char pass1[] = "06640664";
    13. char pass2[] = "99999999";
    14. char Buffer[4] = {'0'};
    15. char Packet[9][5];
    16. char State_of_loom[9][5] = {{'1','7','1','0','\0'},   //Состояние станков
    17.                         {'1','6','0','0','\0'},
    18.                         {'1','5','1','0','\0'},                
    19.                         {'0','1','0','0','\0'},
    20.                         {'0','2','0','0','\0'},
    21.                         {'0','3','0','0','\0'},
    22.                         {'0','4','0','0','\0'},
    23.                         {'0','5','0','0','\0'},
    24.                         {'0','6','1','0','\0'}};
    25.  
    26. WiFiUDP Udp;
    27.  
    28. void Connect()
    29. {
    30.   while (WiFi.status()!= WL_CONNECTED)
    31.   {
    32.     WiFi.begin(ssid1, pass1);
    33.     delay(5000);
    34.     if (WiFi.status() != WL_CONNECTED)
    35.     {
    36.       WiFi.begin(ssid2, pass2);
    37.       delay(5000);
    38.       if (WiFi.status() != WL_CONNECTED)
    39.         delay(30000);
    40.     }
    41.   }
    42.   Serial.println(WiFi.SSID());
    43.   Serial.println(WiFi.localIP());
    44. }
    45.  
    46. void Send(char *str)
    47. {
    48.   Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    49.   Udp.write(str, sizeof(str));
    50.   Udp.endPacket();
    51. }
    52.  
    53. void UDP_Request()
    54. {
    55.   int packetSize = Udp.parsePacket();
    56.   if (packetSize == 1)                        //если пришел один байт (запрос), отправить первую строку и ждать ответа
    57.   {
    58.     count = 0;
    59.     Udp.read();
    60.     Serial.println("Request from ESP-12E");
    61.     Send(State_of_loom[count]);
    62.     Serial.println(State_of_loom[count]);
    63.     key = 1;
    64.   }
    65.   else if (packetSize > 1)                    //если пришло больше одного байта, то отправить следующую строку
    66.   {                                           //или очистить Buffer
    67.     Udp.read();
    68.     Serial.println("Answer from ESP-12E");
    69.     if (Buffer[0] != '0')
    70.       memset(Buffer,'0',4);
    71.     else if (count < 8)
    72.     {
    73.       count++;
    74.       Send(State_of_loom[count]);
    75.       Serial.println(State_of_loom[count]);
    76.       timeAnswer = 0;
    77.     }
    78.     key = 0;
    79.   }
    80.   else if (key > 0)
    81.   {
    82.     timeAnswer++;
    83.     if (timeAnswer > 50)                    //после 50 циклов ожидания ответа отправляем сообщение снова
    84.     {
    85.       timeAnswer = 0;
    86.       key++;
    87.       Serial.print("key: ");
    88.       Serial.println(key);
    89.       if (Buffer[0] != '0')
    90.         Send(Buffer);
    91.       else
    92.       {
    93.         Send(State_of_loom[count]);
    94.         Serial.println(State_of_loom[count]);
    95.       }
    96.       if (key == 4)                          //максимум 3 раза отправляем, если нет ответа
    97.         key = 0;
    98.     }
    99.   }
    100. }
    101.  
    102. void setup()
    103. {
    104.   //mySerial.begin(57600);            // открываем программный серийный порт
    105.   Serial.begin(115200);
    106.   Connect();
    107.  
    108.   Udp.begin(localPort);             // Начинаем «слушать» клиентов:
    109. }
    110. void loop()
    111. {
    112.   if (WiFi.status() == WL_CONNECTED)
    113.   {
    114.     UDP_Request();
    115.  
    116.   /*
    117.     if (mySerial.available())
    118.     {
    119.       for (uint8_t i = 0; i < 4; i++)  //Считываем оповещение
    120.         Buffer[i] = mySerial.read();                
    121.       Send(Buffer);                    //отправляем оповещение с ожиданием ответа
    122.       timeAnswer = 0;
    123.       key = 1;
    124.     }
    125.     */
    126.   }
    127.   else
    128.     Connect();
    129.   delay(100);
    130. }
     
  2. Yasha

    Yasha Новичок

    Сообщения:
    12
    Симпатии:
    0
    Скетч ESP-12E:
    Код (C):
    1. #include <ESP8266WiFi.h>
    2. #include <WiFiUdp.h>
    3. #include "SH1106.h"
    4. #include "Frame.h"
    5.  
    6. #define OLED_RESET  5   // RESET
    7. #define OLED_DC     4   // Data/Command
    8. #define OLED_CS     15  // Chip select
    9. #define ReplyBuffer "OK"
    10. #define localPort   5445
    11. #define interruptPin 2
    12. #define ASK         '?'
    13. #define ESP01_port  500
    14. #define sizeBuffer  9
    15.  
    16. SH1106 display(true, OLED_RESET, OLED_DC, OLED_CS);
    17.  
    18. IPAddress IP_ESP01(192,168,0,105);
    19. char ssid1[] = "STOP";
    20. char ssid2[] = "BOBER-FM";
    21. char pass1[] = "06640664";
    22. char pass2[] = "99999999";
    23.  
    24. char Buffer[5] = {'0'};
    25. //char Messege[50];
    26. char packetBuffer[9][5]; //buffer to hold incoming packet
    27.  
    28. WiFiUDP Udp;
    29.  
    30. uint8_t i = 1, timeON = 0, Reply = 0;     //счётчик обычный, счётчик работы дисплея включенным
    31. uint16_t time1 = 0;            //счётчик до оповещенния разряда аккумулятора
    32. long vcc = 0, rssi, averageVCC;
    33. volatile byte ON = 0;          //переменная прерываний
    34. bool On = true;               //переменная обычного цикла
    35. bool FirstRequest = false;
    36.  
    37.  
    38. void Draw()                                                                 //функция отрисовки таблицы
    39. {
    40.   display.drawXbm(0,14,Frame_width,Frame_height,(const char*)Frame_bits);
    41.   for (uint8_t j = 0, k1 = 0; j < sizeBuffer; j++, k1 = 0)
    42.   {
    43.     if (j!=0)
    44.     {
    45.       if ((j%2 == 0)&&(j!=0))
    46.         k1=1;
    47.       display.drawString(((j+1)/2)*26, 15+(k1*25), String(packetBuffer[j]));
    48.     }
    49.     else
    50.     {
    51.       display.drawString(1, 15, String(packetBuffer[0]));
    52.     }
    53.     display.display();
    54.   }
    55. }
    56.  
    57. void Signal(long rssi_1 = rssi)                //функция отрисовки батарейки
    58. {
    59.   display.setColor(BLACK);
    60.   display.drawRect(115, 2, 10, 8);
    61.   display.fillRect(115, 2, 10, 8);
    62.   display.setColor(WHITE);
    63.   Serial.println(rssi_1);
    64.   if (rssi_1 < (-70))
    65.       display.drawXbm(115, 2, W2_width,W2_height,(const char*)W2_bits);
    66.     else if ((rssi_1 >= (-70)) && (rssi_1 < (-60)))
    67.       display.drawXbm(115, 2, W3_width,W3_height,(const char*)W3_bits);
    68.       else if ((rssi_1 >= (-60)) && (rssi_1 < (-50)))
    69.         display.drawXbm(115, 2, W4_width,W4_height,(const char*)W4_bits);
    70.         else if (rssi_1 >= (-50))
    71.           display.drawXbm(115, 2, W5_width,W5_height,(const char*)W5_bits);
    72.   display.display();
    73. }
    74.  
    75. void Battery(long vcc_1 = averageVCC)                       //функция отрисовки уровня сигнала Wi-Fi
    76. {
    77.   Serial.println(vcc_1);
    78.   if (On)
    79.   {
    80.     display.setColor(BLACK);
    81.     display.drawRect(0, 2, 16, 8);
    82.     display.fillRect(0, 2, 16, 8);
    83.     display.setColor(WHITE);
    84.     if (vcc_1 >= 800)
    85.       display.drawXbm(0, 2, Img_Battery_3_width, Img_Battery_3_height, (const char*)Img_Battery_3);
    86.       else if ((vcc_1 >= 600) && (vcc_1 < 800))
    87.         display.drawXbm(0, 2, Img_Battery_2_width, Img_Battery_2_height, (const char*)Img_Battery_2);
    88.         else if ((vcc_1 >= 400) && (vcc_1 < 600))
    89.           display.drawXbm(0, 2, Img_Battery_1_width, Img_Battery_1_height, (const char*)Img_Battery_1);
    90.           else if (vcc_1 < 400)
    91.             display.drawXbm(0, 2, Img_Battery_0_width, Img_Battery_0_height, (const char*)Img_Battery_0);        
    92.     display.display();
    93.   }
    94.   else if (vcc_1 < 400)
    95.   {
    96.     time1++;
    97.     if (time1 == 60000)
    98.     {
    99.       time1 = 0;
    100.       display.clear();
    101.       display.displayOn();
    102.       display.drawXbm(20, 20, Img_BigBattery_low_width, Img_BigBattery_low_height, (const char*)Img_BigBattery_low);
    103.       display.display();
    104.       delay(2000);
    105.       display.displayOff();
    106.      }    
    107.   }
    108.   i = 1;
    109. }
    110.  
    111. void UDP_chat()
    112. {
    113.   int packetSize = Udp.parsePacket();
    114.   if (packetSize > 0)
    115.   {
    116.     Serial.println(packetSize);
    117.     int len = Udp.read(Buffer, 4);         //считывание пакета в Buffer
    118.  
    119.     if (len > 0)
    120.     {
    121.       Serial.println(len);
    122.       Buffer[len] = '0';
    123.     }
    124.  
    125.     Buffer[4] = '\0';           // записываем в конец признак конца строки для удобной работы с массивом как со строкой
    126.     Udp.read();
    127.     Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); //Отправляем ответ на IP и порт отправителя
    128.     Udp.write(ReplyBuffer);
    129.     Udp.endPacket();
    130.     Serial.print("Contents: ");
    131.     Serial.println(Buffer);
    132.     if (!On)
    133.     {
    134.       display.displayOn();
    135.       On = true;
    136.       Serial.println("ON");
    137.     }
    138.     timeON = 0;
    139.     if (!FirstRequest)                          // если был отправлен запрос на получение данных, то не выводить на дисплей
    140.     {
    141.       display.clear();
    142.       display.setFont(ArialMT_Plain_24);
    143.       display.drawString(30, 20, String(Buffer));
    144.       display.display();
    145.       delay(2000);
    146.       display.clear();
    147.     }
    148.     else
    149.     {
    150.       Reply++;                                   //счётчик для запроса
    151.       if (Reply == 9)                            // если считалось последнее запрошеное сообщение
    152.       {
    153.         Reply == 0;
    154.         FirstRequest = false;
    155.       }
    156.     }
    157.     Signal();
    158.     Battery();
    159.   }
    160. }
    161.  
    162. void Attach()
    163. {
    164.   static unsigned long millis_prev;
    165.   if (millis() - 100 > millis_prev)              
    166.       ON = 1;                        // меняем значение на противоположное
    167.   millis_prev = millis();
    168.   Serial.println (ON);
    169. }
    170.  
    171. void Connect()
    172. {
    173.    do
    174.   {
    175.     WiFi.begin(ssid1, pass1);
    176.     delay(10000);
    177.     if (WiFi.status() == WL_CONNECTED)
    178.     {
    179.       display.clear();
    180.       display.drawString(0, 25, "Connect to \"" + String(ssid1) + "\"");
    181.     }
    182.     else
    183.     {
    184.       WiFi.begin(ssid2, pass2);
    185.       delay(10000);
    186.       if (WiFi.status() == WL_CONNECTED)
    187.       {
    188.          display.clear();
    189.          display.drawString(0, 25, "Connect to \"" + String(ssid2) + "\"");
    190.          break;
    191.       }
    192.       display.clear();
    193.       display.drawString(20, 25, "No connection");
    194.       display.display();
    195.       Serial.println("No connection");
    196.       delay(30000);
    197.     }
    198.   }
    199.   while (WiFi.status()!= WL_CONNECTED);
    200.   display.display();
    201.   Request();
    202. }
    203.  
    204. void Request()
    205. {
    206.   Udp.beginPacket(IP_ESP01, ESP01_port);
    207.   Udp.write(ASK);
    208.   Udp.endPacket();
    209.   FirstRequest = true;
    210. }
    211.  
    212. void setup()
    213. {
    214.   Serial.begin(115200);
    215.   pinMode(interruptPin, INPUT_PULLUP);
    216.   attachInterrupt(digitalPinToInterrupt(interruptPin), Attach, FALLING);
    217.   Serial.println("");
    218.   display.init();
    219.   display.clear();
    220.   display.setFont(ArialMT_Plain_24);
    221.   display.drawString(17, 20, "SERVER");
    222.   display.display();
    223.  
    224.   display.setFont(ArialMT_Plain_10);
    225.   Connect();
    226.  
    227.   Serial.println(WiFi.SSID());
    228.   Serial.println(WiFi.localIP());
    229.   delay(2000);
    230.   display.clear();
    231.   Draw();
    232.   Battery();
    233.   Signal();
    234.  
    235.   Udp.begin(localPort); // Начинаем «слушать» клиентов:
    236. }
    237.  
    238. void loop()
    239. {
    240.   if (WiFi.status() == WL_CONNECTED)
    241.   {
    242.     if (ON == 1)
    243.     {
    244.       if (On)
    245.       {
    246.         Serial.println("OFF");
    247.         display.displayOff();
    248.         On = false;
    249.       }
    250.       else
    251.       {
    252.         Serial.println("ON");
    253.         display.displayOn();
    254.         On = true;
    255.       }
    256.       ON = 0;
    257.       timeON = 0;
    258.     }
    259.  
    260.     UDP_chat();
    261.  
    262.     i++;
    263.     vcc += analogRead(A0);             //считывание напряжения аккумулятора
    264.     if (i%20==0)
    265.     {
    266.       averageVCC = vcc/20;
    267.       Battery();
    268.       vcc = 0;
    269.     }
    270.     if (On)
    271.     {
    272.       timeON++;
    273.       if (i%19 == 0)
    274.       {
    275.         rssi = WiFi.RSSI();
    276.         Signal();
    277.       }
    278.       if (Buffer[1] != '0')               //если буфер не пуст, то скопировать его содержимое в массив по первой цифре
    279.       {
    280.         int number = atoi(Buffer);
    281.         switch (number/100)
    282.         {
    283.           case 17:
    284.           {
    285.             strcpy(packetBuffer[0],Buffer);
    286.             break;
    287.           }
    288.           case 16:
    289.           {
    290.             strcpy(packetBuffer[1],Buffer);
    291.             break;
    292.           }
    293.           case 15:
    294.           {
    295.             strcpy(packetBuffer[2],Buffer);
    296.             break;
    297.           }
    298.           default:
    299.           {
    300.          
    301.             strcpy(packetBuffer[number+2],Buffer);
    302.           }
    303.         }
    304.         memset(Buffer, '0', 4);
    305.         display.setFont(ArialMT_Plain_10);
    306.         Draw();                                    //вызов функции рисования таблицы и содержимого массива
    307.       }
    308.       if (timeON >= 150)                           //отключение дисплея после 150 циклов loop()
    309.       {
    310.         Serial.println("OFF");
    311.         On = false;
    312.         display.displayOff();  
    313.       }
    314.     }
    315.   }
    316.   else
    317.   {
    318.     Connect();
    319.   }
    320.   delay(50);
    321. }
     

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