@@ -42,13 +42,18 @@ License (MIT license):
42
42
#define TTL_OFFSET 4
43
43
#define IP_OFFSET 10
44
44
45
+ static const IPAddress MDNS_MULTICAST_ADDR (224 , 0 , 0 , 251 );
46
+ static const int MDNS_MULTICAST_TTL = 1 ;
47
+ static const int MDNS_PORT = 5353 ;
48
+
45
49
46
50
MDNSResponder::MDNSResponder ()
47
51
: _expected(NULL )
48
52
, _expectedLen(0 )
49
53
, _response(NULL )
50
54
, _responseLen(0 )
51
55
, _index(0 )
56
+ , _conn(0 )
52
57
{ }
53
58
54
59
MDNSResponder::~MDNSResponder () {
@@ -149,21 +154,37 @@ bool MDNSResponder::begin(const char* domain, IPAddress addr, uint32_t ttlSecond
149
154
records[IP_OFFSET + 0 ] = (uint8_t ) ipAddress;
150
155
151
156
// Open the MDNS socket if it isn't already open.
152
- if (!_mdnsConn) {
153
- if (!_mdnsConn.beginMulticast (addr, IPAddress (224 , 0 , 0 , 251 ), 5353 )) {
157
+ if (!_conn) {
158
+ ip_addr_t ifaddr;
159
+ ifaddr.addr = (uint32_t ) addr;
160
+ ip_addr_t multicast_addr;
161
+ multicast_addr.addr = (uint32_t ) MDNS_MULTICAST_ADDR;
162
+
163
+ if (igmp_joingroup (&ifaddr, &multicast_addr)!= ERR_OK) {
154
164
return false ;
155
165
}
156
- }
157
166
167
+ _conn = new UdpContext;
168
+ _conn->ref ();
169
+
170
+ if (!_conn->listen (*IP_ADDR_ANY, MDNS_PORT)) {
171
+ return false ;
172
+ }
173
+ _conn->setMulticastInterface (ifaddr);
174
+ _conn->setMulticastTTL (MDNS_MULTICAST_TTL);
175
+ _conn->onRx (std::bind (&MDNSResponder::update, this ));
176
+ _conn->connect (multicast_addr, MDNS_PORT);
177
+ }
158
178
return true ;
159
179
}
160
180
161
181
void MDNSResponder::update () {
162
- if (!_mdnsConn.parsePacket ())
163
- return ;
182
+ if (!_conn->next ()) {
183
+ return ;
184
+ }
164
185
165
186
// Read available data.
166
- int n = _mdnsConn. available ();
187
+ int n = _conn-> getSize ();
167
188
168
189
_index = 0 ;
169
190
@@ -172,7 +193,7 @@ void MDNSResponder::update() {
172
193
#endif
173
194
// Look for domain name in request and respond with canned response if found.
174
195
for (int i = 0 ; i < n; ++i) {
175
- uint8_t ch = tolower (_mdnsConn. read ());
196
+ uint8_t ch = tolower (_conn-> read ());
176
197
177
198
#ifdef MDNS_DEBUG
178
199
String str (ch, 16 );
@@ -191,9 +212,12 @@ void MDNSResponder::update() {
191
212
Serial.print (" responding, i=" );
192
213
Serial.println (i);
193
214
#endif
194
- _mdnsConn.beginPacketMulticast (IPAddress (224 , 0 , 0 , 251 ), 5353 , _localAddr);
195
- _mdnsConn.write (_response, _responseLen);
196
- _mdnsConn.endPacket ();
215
+ ip_addr_t multicast_addr;
216
+ multicast_addr.addr = (uint32_t ) MDNS_MULTICAST_ADDR;
217
+
218
+ _conn->append (reinterpret_cast <const char *>(_response), _responseLen);
219
+ _conn->send ();
220
+
197
221
_index = 0 ;
198
222
}
199
223
}
0 commit comments