From d15767d26ea4e941f0e8858d31709771f3cdfebe Mon Sep 17 00:00:00 2001 From: Luciano Martorella Date: Sat, 5 Aug 2023 16:43:08 +0200 Subject: [PATCH 1/2] - Same UDP API of ESP32 core --- cores/esp8266/Udp.h | 1 + doc/esp8266wifi/udp-class.rst | 4 ++-- libraries/ESP8266WiFi/src/WiFiUdp.cpp | 11 +++++++++++ libraries/ESP8266WiFi/src/WiFiUdp.h | 4 +++- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/cores/esp8266/Udp.h b/cores/esp8266/Udp.h index 6c8ee4b385..37f2fb922b 100644 --- a/cores/esp8266/Udp.h +++ b/cores/esp8266/Udp.h @@ -43,6 +43,7 @@ class UDP: public Stream { public: virtual ~UDP() {}; virtual uint8_t begin(uint16_t) =0; // initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use + virtual uint8_t beginMulticast(IPAddress, uint16_t) { return 0; } // initialize, start listening on specified multicast IP address and port. Returns 1 if successful, 0 on failure virtual void stop() =0; // Finish with the UDP socket // Sending UDP packets diff --git a/doc/esp8266wifi/udp-class.rst b/doc/esp8266wifi/udp-class.rst index 5e02f7b3da..73a9086021 100644 --- a/doc/esp8266wifi/udp-class.rst +++ b/doc/esp8266wifi/udp-class.rst @@ -26,11 +26,11 @@ Multicast UDP .. code:: cpp - uint8_t beginMulticast (IPAddress interfaceAddr, IPAddress multicast, uint16_t port) + uint8_t beginMulticast (IPAddress multicast, uint16_t port) virtual int beginPacketMulticast (IPAddress multicastAddress, uint16_t port, IPAddress interfaceAddress, int ttl=1) IPAddress destinationIP () uint16_t localPort () -The ``WiFiUDP`` class supports sending and receiving multicast packets on STA interface. When sending a multicast packet, replace ``udp.beginPacket(addr, port)`` with ``udp.beginPacketMulticast(addr, port, WiFi.localIP())``. When listening to multicast packets, replace ``udp.begin(port)`` with ``udp.beginMulticast(WiFi.localIP(), multicast_ip_addr, port)``. You can use ``udp.destinationIP()`` to tell whether the packet received was sent to the multicast or unicast address. +The ``WiFiUDP`` class supports sending and receiving multicast packets on STA interface. When sending a multicast packet, replace ``udp.beginPacket(addr, port)`` with ``udp.beginPacketMulticast(addr, port, WiFi.localIP())``. When listening to multicast packets, replace ``udp.begin(port)`` with ``udp.beginMulticast(multicast_ip_addr, port)``. You can use ``udp.destinationIP()`` to tell whether the packet received was sent to the multicast or unicast address. For code samples please refer to separate section with `examples `__ dedicated specifically to the UDP Class. diff --git a/libraries/ESP8266WiFi/src/WiFiUdp.cpp b/libraries/ESP8266WiFi/src/WiFiUdp.cpp index a45659d844..e717746f25 100644 --- a/libraries/ESP8266WiFi/src/WiFiUdp.cpp +++ b/libraries/ESP8266WiFi/src/WiFiUdp.cpp @@ -84,7 +84,18 @@ uint8_t WiFiUDP::begin(uint16_t port) return (_ctx->listen(IPAddress(), port)) ? 1 : 0; } +uint8_t WiFiUDP::beginMulticast(IPAddress multicast, uint16_t port) +{ + IPAddress local = WiFi.localIP(); + return _beginMulticast(local, multicast, port); +} + uint8_t WiFiUDP::beginMulticast(IPAddress interfaceAddr, IPAddress multicast, uint16_t port) +{ + return _beginMulticast(interfaceAddr, multicast, port); +} + +uint8_t WiFiUDP::_beginMulticast(IPAddress interfaceAddr, IPAddress multicast, uint16_t port) { if (_ctx) { _ctx->unref(); diff --git a/libraries/ESP8266WiFi/src/WiFiUdp.h b/libraries/ESP8266WiFi/src/WiFiUdp.h index d8fbcbe221..4164e9ff70 100644 --- a/libraries/ESP8266WiFi/src/WiFiUdp.h +++ b/libraries/ESP8266WiFi/src/WiFiUdp.h @@ -32,6 +32,7 @@ class UdpContext; class WiFiUDP : public UDP, public SList { private: UdpContext* _ctx; + uint8_t _beginMulticast(IPAddress interfaceAddr, IPAddress multicast, uint16_t port); public: WiFiUDP(); // Constructor @@ -47,7 +48,8 @@ class WiFiUDP : public UDP, public SList { // Finish with the UDP connection void stop() override; // join a multicast group and listen on the given port - uint8_t beginMulticast(IPAddress interfaceAddr, IPAddress multicast, uint16_t port); + virtual uint8_t beginMulticast(IPAddress interfaceAddr, uint16_t port); + uint8_t beginMulticast(IPAddress interfaceAddr, IPAddress multicast, uint16_t port) __attribute__((deprecated)); // Sending UDP packets From 082ec57e6605d6fa5411f15419da29fbc96fc5bf Mon Sep 17 00:00:00 2001 From: Luciano Martorella Date: Mon, 7 Aug 2023 22:52:27 +0200 Subject: [PATCH 2/2] - PR review --- libraries/ESP8266WiFi/src/WiFiUdp.cpp | 8 +------- libraries/ESP8266WiFi/src/WiFiUdp.h | 4 ++-- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/libraries/ESP8266WiFi/src/WiFiUdp.cpp b/libraries/ESP8266WiFi/src/WiFiUdp.cpp index e717746f25..cf22e3cd2a 100644 --- a/libraries/ESP8266WiFi/src/WiFiUdp.cpp +++ b/libraries/ESP8266WiFi/src/WiFiUdp.cpp @@ -86,16 +86,10 @@ uint8_t WiFiUDP::begin(uint16_t port) uint8_t WiFiUDP::beginMulticast(IPAddress multicast, uint16_t port) { - IPAddress local = WiFi.localIP(); - return _beginMulticast(local, multicast, port); + return beginMulticast(IP_ADDR_ANY, multicast, port); } uint8_t WiFiUDP::beginMulticast(IPAddress interfaceAddr, IPAddress multicast, uint16_t port) -{ - return _beginMulticast(interfaceAddr, multicast, port); -} - -uint8_t WiFiUDP::_beginMulticast(IPAddress interfaceAddr, IPAddress multicast, uint16_t port) { if (_ctx) { _ctx->unref(); diff --git a/libraries/ESP8266WiFi/src/WiFiUdp.h b/libraries/ESP8266WiFi/src/WiFiUdp.h index 4164e9ff70..fdf82217bc 100644 --- a/libraries/ESP8266WiFi/src/WiFiUdp.h +++ b/libraries/ESP8266WiFi/src/WiFiUdp.h @@ -32,7 +32,6 @@ class UdpContext; class WiFiUDP : public UDP, public SList { private: UdpContext* _ctx; - uint8_t _beginMulticast(IPAddress interfaceAddr, IPAddress multicast, uint16_t port); public: WiFiUDP(); // Constructor @@ -49,7 +48,8 @@ class WiFiUDP : public UDP, public SList { void stop() override; // join a multicast group and listen on the given port virtual uint8_t beginMulticast(IPAddress interfaceAddr, uint16_t port); - uint8_t beginMulticast(IPAddress interfaceAddr, IPAddress multicast, uint16_t port) __attribute__((deprecated)); + // join a multicast group and listen on the given port, using a specific interface address + uint8_t beginMulticast(IPAddress interfaceAddr, IPAddress multicast, uint16_t port); // Sending UDP packets