11 #include <ESP8266WiFi.h>
12 #define SINRICPRO_UDP_LWIP
15 #define SINRICPRO_UDP_ESP32
16#elif defined(ARDUINO_ARCH_RP2040)
18 #define SINRICPRO_UDP_LWIP
22#include "SinricProQueue.h"
23#include "SinricProConfig.h"
24#include "SinricProDebug.h"
26#include "SinricProNamespace.h"
27namespace SINRICPRO_NAMESPACE {
31 void begin(SinricProQueue_t* receiveQueue);
33 void sendMessage(String &message,
const IPAddress& remoteIP, uint16_t remotePort);
38 SinricProQueue_t* receiveQueue;
41void UdpListener::begin(SinricProQueue_t* receiveQueue) {
42 this->receiveQueue = receiveQueue;
47#if defined(SINRICPRO_UDP_LWIP)
48 started = _udp.beginMulticast(WiFi.localIP(), UDP_MULTICAST_IP, UDP_MULTICAST_PORT);
50#elif defined(SINRICPRO_UDP_ESP32)
51 started = _udp.beginMulticast(UDP_MULTICAST_IP, UDP_MULTICAST_PORT);
55 DEBUG_SINRIC(
"[SinricPro:UDP]: listening on port %d\r\n", UDP_MULTICAST_PORT);
57 DEBUG_SINRIC(
"[SinricPro:UDP]: could not listen on port %d, local control unavailable\r\n", UDP_MULTICAST_PORT);
61void UdpListener::handle() {
62 int len = _udp.parsePacket();
65 char* buf = (
char*) malloc(len + 1);
67 memset(buf, 0, len + 1);
69 const IPAddress peerIP = _udp.remoteIP();
70 const uint16_t peerPort = _udp.remotePort();
71 SinricProMessage* request =
new SinricProMessage(IF_UDP, buf, peerIP, peerPort);
72 DEBUG_SINRIC(
"[SinricPro:UDP]: receiving request\r\n%s\r\n", buf);
74 receiveQueue->push(request);
77void UdpListener::sendMessage(String &message,
const IPAddress& remoteIP, uint16_t remotePort) {
79 DEBUG_SINRIC(
"[SinricPro:UDP]: message has no peer to answer, dropping\r\n");
82#if defined(SINRICPRO_UDP_LWIP) || defined(SINRICPRO_UDP_ESP32)
85 const int begun = _udp.beginPacket(remoteIP, remotePort);
87 const int sent = _udp.endPacket();
89 if (!begun || !sent) {
90 DEBUG_SINRIC(
"[SinricPro:UDP]: reply to %s failed (begin=%d send=%d)\r\n",
91 remoteIP.toString().c_str(), begun, sent);
99void UdpListener::stop() {