Updated esp-knx-ip library with a merged version that allows to select multicast library to use: * WIFI UDP (for esp lib 2.3.0 and up) * AsyncUDP (for esp lib 2.4.0 and up) The selection can be done with a definition key in the file esp-knx-ip.h
131 lines
3.5 KiB
C++
131 lines
3.5 KiB
C++
#ifndef ESPASYNCUDP_H
|
|
#define ESPASYNCUDP_H
|
|
|
|
#include "IPAddress.h"
|
|
#include "Print.h"
|
|
#include <functional>
|
|
#include "lwip/init.h"
|
|
|
|
class AsyncUDP;
|
|
class AsyncUDPPacket;
|
|
class AsyncUDPMessage;
|
|
struct udp_pcb;
|
|
struct pbuf;
|
|
#if LWIP_VERSION_MAJOR == 1
|
|
struct ip_addr;
|
|
typedef struct ip_addr ip_addr_t;
|
|
#else
|
|
struct ip4_addr;
|
|
typedef struct ip4_addr ip_addr_t;
|
|
#endif
|
|
|
|
class AsyncUDPMessage : public Print
|
|
{
|
|
protected:
|
|
uint8_t *_buffer;
|
|
size_t _index;
|
|
size_t _size;
|
|
public:
|
|
AsyncUDPMessage(size_t size=1460);
|
|
virtual ~AsyncUDPMessage();
|
|
size_t write(const uint8_t *data, size_t len);
|
|
size_t write(uint8_t data);
|
|
size_t space();
|
|
uint8_t * data();
|
|
size_t length();
|
|
void flush();
|
|
operator bool()
|
|
{
|
|
return _buffer != NULL;
|
|
}
|
|
};
|
|
|
|
class AsyncUDPPacket : public Print
|
|
{
|
|
protected:
|
|
AsyncUDP *_udp;
|
|
ip_addr_t *_localIp;
|
|
uint16_t _localPort;
|
|
ip_addr_t *_remoteIp;
|
|
uint16_t _remotePort;
|
|
uint8_t *_data;
|
|
size_t _len;
|
|
public:
|
|
AsyncUDPPacket(AsyncUDP *udp, ip_addr_t *localIp, uint16_t localPort, ip_addr_t *remoteIp, uint16_t remotePort, uint8_t *data, size_t len);
|
|
virtual ~AsyncUDPPacket();
|
|
|
|
uint8_t * data();
|
|
size_t length();
|
|
bool isBroadcast();
|
|
bool isMulticast();
|
|
|
|
IPAddress localIP();
|
|
uint16_t localPort();
|
|
IPAddress remoteIP();
|
|
uint16_t remotePort();
|
|
|
|
size_t send(AsyncUDPMessage &message);
|
|
|
|
size_t write(const uint8_t *data, size_t len);
|
|
size_t write(uint8_t data);
|
|
};
|
|
|
|
typedef std::function<void(AsyncUDPPacket& packet)> AuPacketHandlerFunction;
|
|
typedef std::function<void(void * arg, AsyncUDPPacket& packet)> AuPacketHandlerFunctionWithArg;
|
|
|
|
class AsyncUDP : public Print
|
|
{
|
|
protected:
|
|
udp_pcb *_pcb;
|
|
bool _connected;
|
|
AuPacketHandlerFunction _handler;
|
|
|
|
void _recv(udp_pcb *upcb, pbuf *pb, ip_addr_t *addr, uint16_t port);
|
|
#if LWIP_VERSION_MAJOR == 1
|
|
static void _s_recv(void *arg, udp_pcb *upcb, pbuf *p, ip_addr_t *addr, uint16_t port);
|
|
#else
|
|
static void _s_recv(void *arg, udp_pcb *upcb, pbuf *p, const ip_addr_t *addr, uint16_t port);
|
|
#endif
|
|
|
|
public:
|
|
AsyncUDP();
|
|
virtual ~AsyncUDP();
|
|
|
|
void onPacket(AuPacketHandlerFunctionWithArg cb, void * arg=NULL);
|
|
void onPacket(AuPacketHandlerFunction cb);
|
|
|
|
bool listen(ip_addr_t *addr, uint16_t port);
|
|
bool listen(const IPAddress addr, uint16_t port);
|
|
bool listen(uint16_t port);
|
|
|
|
bool listenMulticast(ip_addr_t *addr, uint16_t port, uint8_t ttl=1);
|
|
bool listenMulticast(const IPAddress addr, uint16_t port, uint8_t ttl=1);
|
|
|
|
bool connect(ip_addr_t *addr, uint16_t port);
|
|
bool connect(const IPAddress addr, uint16_t port);
|
|
|
|
void close();
|
|
|
|
size_t writeTo(const uint8_t *data, size_t len, ip_addr_t *addr, uint16_t port);
|
|
size_t writeTo(const uint8_t *data, size_t len, const IPAddress addr, uint16_t port);
|
|
size_t write(const uint8_t *data, size_t len);
|
|
size_t write(uint8_t data);
|
|
|
|
size_t broadcastTo(uint8_t *data, size_t len, uint16_t port);
|
|
size_t broadcastTo(const char * data, uint16_t port);
|
|
size_t broadcast(uint8_t *data, size_t len);
|
|
size_t broadcast(const char * data);
|
|
|
|
size_t sendTo(AsyncUDPMessage &message, ip_addr_t *addr, uint16_t port);
|
|
size_t sendTo(AsyncUDPMessage &message, const IPAddress addr, uint16_t port);
|
|
size_t send(AsyncUDPMessage &message);
|
|
|
|
size_t broadcastTo(AsyncUDPMessage &message, uint16_t port);
|
|
size_t broadcast(AsyncUDPMessage &message);
|
|
|
|
bool connected();
|
|
operator bool();
|
|
};
|
|
|
|
#endif
|