ESP8266 UDP multicast не принимает пакеты

В настоящее время я работаю над ESP8266 с Arduino IDE. Я пытаюсь реализовать ESP8266 в режиме STA в качестве приемника многоадресной рассылки. Я писал свой код с помощью этой документации. Особенно следующая часть:

Класс WiFiUDP поддерживает отправку и прием многоадресных пакетов по интерфейсу STA. При отправке многоадресного пакета замените udp.beginPacket(addr, port) на udp.beginPacketMulticast(addr, port, WiFi.localIP()). При прослушивании многоадресных пакетов замените udp.begin(port) на udp.beginMulticast(WiFi.localIP(), multicast_ip_addr, port). Вы можете использовать udp.destinationIP (), чтобы определить, был ли полученный пакет отправлен на многоадресный или одноадресный адрес.

Отправка в группу многоадресной рассылки с помощью udp.beginPacketMulticast(addr, port, WiFi.localIP()) и udp.write(message, messageLength)работает безупречно.

Принимающая часть моего кода выглядит следующим образом:

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

#define BUFFER_LENGTH 256

const char* ssid = "xxxxxx";
const char* password = "xxxxxx";

WiFiUDP Udp;
IPAddress multicastAddress(226,1,1,1);
unsigned int multicastPort = 4096;

char incomingPacket[BUFFER_LENGTH]; 

void setup(){
    WiFi.mode(WIFI_STA); //станция 
    WiFi.setOutputPower(0);
    while (WiFi.status() != WL_CONNECTED)
    {
        WiFi.begin(ssid, password);
        delay(500);
    }
    Udp.beginMulticast(WiFi.localIP(), multicastAddress, multicastPort);
}

void loop(){
    int packetLength = Udp.parsePacket(); 
    if(packetLength){
        int len = Udp.read(incomingPacket, BUFFER_LENGTH);
        if (len > 0){
            incomingPacket[len] = 0;
            Serial.printf("%s\n", incomingPacket);
        }
    }
}

При отправке пакета с помощью простого отправителя многоадресной рассылки (с соответствующим IP-адресом и портом) мой приемник многоадресной рассылки на ноутбуке Linux получает пакет, а ESP8266-нет.

Может быть, кто-то из вас испытал подобное поведение и способен дать мне какие-то подсказки, где я могу ошибаться.

Редактировать: С тех пор, как я задал этот вопрос, я полностью исключил ошибку отправителя на машине Linux, используя проверенного, 100% рабочего отправителя. ESP8266 по-прежнему не получает никаких многоадресных дейтаграмм.

, 👍3

Обсуждение

Находятся ли ноутбук и ESP8266 в одной сети? Если нет, то вам нужно настроить TTL для простого отправителя многоадресной рассылки. Значение по умолчанию-1., @jogco

да, они оба находятся на моем домашнем Wi-Fi, @AronC

это все еще не работает, и обходной путь выше не помогает. См. также https://www.esp8266.com/viewtopic.php?f=8&t=15467, @Nikolay


1 ответ


Лучший ответ:

5

Недавно у меня была такая же проблема.

Однозначный ответ заключается в том, что существует оптимизация мощности (внутренняя по Espressif) для экономии энергии, я думаю, и это действительно создает хаос в многоадресном приеме UDP. Почему? Понятия не имею. Та же проблема с ESP32 и ESP8266.

Решение:

#include "user_interface.h"

а после:

WiFi.mode(WIFI_STA);
// нижеприведенные инструкции и теперь вы получите.
wifi_set_sleep_type(NONE_SLEEP_T); //LIGHT_SLEEP_T and MODE_SLEEP_T
,

Большое вам спасибо за ответ. Это действительно труднодоступное решение., @AronC