@@ -39,144 +39,210 @@ License (MIT license):
39
39
#endif
40
40
41
41
#include " ESPmDNS.h"
42
+ #include " WiFi.h"
42
43
#include < functional>
43
44
#include " esp_wifi.h"
44
45
45
- MDNSResponder::MDNSResponder () : mdns(NULL ), _if(TCPIP_ADAPTER_IF_STA) {}
46
+ static void _on_sys_event (system_event_t *event){
47
+ mdns_handle_system_event (NULL , event);
48
+ }
49
+
50
+ MDNSResponder::MDNSResponder () :results(NULL ) {}
46
51
MDNSResponder::~MDNSResponder () {
47
52
end ();
48
53
}
49
54
50
- bool MDNSResponder::begin (const char * hostName, tcpip_adapter_if_t tcpip_if, uint32_t ttl){
51
- _if = tcpip_if;
52
- if (!mdns && mdns_init (_if, &mdns)){
55
+ bool MDNSResponder::begin (const char * hostName){
56
+ if (mdns_init ()){
53
57
log_e (" Failed starting MDNS" );
54
58
return false ;
55
59
}
60
+ WiFi.onEvent (_on_sys_event);
56
61
_hostname = hostName;
57
- if (mdns_set_hostname (mdns, hostName)) {
62
+ if (mdns_hostname_set ( hostName)) {
58
63
log_e (" Failed setting MDNS hostname" );
59
64
return false ;
60
65
}
61
66
return true ;
62
67
}
63
68
64
69
void MDNSResponder::end () {
65
- if (!mdns){
66
- return ;
67
- }
68
- mdns_free (mdns);
69
- mdns = NULL ;
70
+ mdns_free ();
70
71
}
71
72
72
73
void MDNSResponder::setInstanceName (String name) {
73
74
if (name.length () > 63 ) return ;
74
- if (mdns_set_instance (mdns, name.c_str ())){
75
+ if (mdns_instance_name_set ( name.c_str ())){
75
76
log_e (" Failed setting MDNS instance" );
76
77
return ;
77
78
}
78
79
}
79
80
81
+
80
82
void MDNSResponder::enableArduino (uint16_t port, bool auth){
81
- const char * arduTxtData[4 ] = {
82
- " board= " ARDUINO_BOARD ,
83
- " tcp_check= no" ,
84
- " ssh_upload= no" ,
85
- " auth_upload= no"
83
+ mdns_txt_item_t arduTxtData[4 ] = {
84
+ {( char *) " board " ,( char *)ARDUINO_VARIANT} ,
85
+ {( char *) " tcp_check " ,( char *) " no" } ,
86
+ {( char *) " ssh_upload " ,( char *) " no" } ,
87
+ {( char *) " auth_upload " ,( char *) " no" }
86
88
};
87
- if (auth){
88
- arduTxtData[3 ] = " auth_upload=yes" ;
89
- }
90
89
91
- if (mdns_service_add (mdns , " _arduino" , " _tcp" , port)) {
90
+ if (mdns_service_add (NULL , " _arduino" , " _tcp" , port, arduTxtData, 4 )) {
92
91
log_e (" Failed adding Arduino service" );
93
- } else if (mdns_service_txt_set (mdns, " _arduino" , " _tcp" , 4 , arduTxtData)) {
94
- log_e (" Failed setting Arduino service TXT" );
92
+ }
93
+
94
+ if (auth && mdns_service_txt_item_set (" _arduino" , " _tcp" , " auth_upload" , " yes" )){
95
+ log_e (" Failed setting Arduino txt item" );
95
96
}
96
97
}
97
98
98
99
void MDNSResponder::disableArduino (){
99
- if (mdns_service_remove (mdns, " _arduino" , " _tcp" )) {
100
+ if (mdns_service_remove (" _arduino" , " _tcp" )) {
100
101
log_w (" Failed removing Arduino service" );
101
102
}
102
103
}
103
104
104
- void MDNSResponder::enableWorkstation (){
105
+ void MDNSResponder::enableWorkstation (wifi_interface_t interface ){
105
106
char winstance[21 +_hostname.length ()];
106
107
uint8_t mac[6 ];
107
- esp_wifi_get_mac (( wifi_interface_t )_if , mac);
108
+ esp_wifi_get_mac (interface , mac);
108
109
sprintf (winstance, " %s [%02x:%02x:%02x:%02x:%02x:%02x]" , _hostname.c_str (), mac[0 ], mac[1 ], mac[2 ], mac[3 ], mac[4 ], mac[5 ]);
109
110
110
- if (mdns_service_add (mdns , " _workstation" , " _tcp" , 9 )) {
111
+ if (mdns_service_add (NULL , " _workstation" , " _tcp" , 9 , NULL , 0 )) {
111
112
log_e (" Failed adding Workstation service" );
112
- } else if (mdns_service_instance_set (mdns, " _workstation" , " _tcp" , winstance)) {
113
+ } else if (mdns_service_instance_name_set ( " _workstation" , " _tcp" , winstance)) {
113
114
log_e (" Failed setting Workstation service instance name" );
114
115
}
115
116
}
116
117
117
118
void MDNSResponder::disableWorkstation (){
118
- if (mdns_service_remove (mdns, " _workstation" , " _tcp" )) {
119
+ if (mdns_service_remove (" _workstation" , " _tcp" )) {
119
120
log_w (" Failed removing Workstation service" );
120
121
}
121
122
}
122
123
123
124
void MDNSResponder::addService (char *name, char *proto, uint16_t port){
124
- if (mdns_service_add (mdns , name, proto, port)) {
125
+ if (mdns_service_add (NULL , name, proto, port, NULL , 0 )) {
125
126
log_e (" Failed adding service %s.%s.\n " , name, proto);
126
127
}
127
128
}
128
129
129
130
bool MDNSResponder::addServiceTxt (char *name, char *proto, char *key, char *value){
130
- // ToDo: implement it in IDF. This will set the TXT to one record currently
131
- String txt = String (key) + " =" + String (value);
132
- const char * txt_chr[1 ] = {txt.c_str ()};
133
- if (mdns_service_txt_set (mdns, name, proto, 1 , txt_chr)) {
131
+ if (mdns_service_txt_item_set (name, proto, key, value)) {
134
132
log_e (" Failed setting service TXT" );
135
133
return false ;
136
134
}
137
135
return true ;
138
136
}
139
137
140
- int MDNSResponder::queryService (char *service, char *proto) {
141
- mdns_result_free (mdns);
142
- if (proto){
143
- char srv[strlen (service)+2 ];
144
- char prt[strlen (proto)+2 ];
145
- sprintf (srv, " _%s" , service);
146
- sprintf (prt, " _%s" , proto);
147
- return mdns_query (mdns, srv, prt, 2000 );
138
+ IPAddress MDNSResponder::queryHost (char *host, uint32_t timeout){
139
+ struct ip4_addr addr;
140
+ addr.addr = 0 ;
141
+
142
+ esp_err_t err = mdns_query_a (host, timeout, &addr);
143
+ if (err){
144
+ if (err == ESP_ERR_NOT_FOUND){
145
+ log_w (" Host was not found!" );
146
+ return IPAddress ();
147
+ }
148
+ log_e (" Query Failed" );
149
+ return IPAddress ();
148
150
}
149
- return mdns_query (mdns, service, NULL , 2000 );
151
+ return IPAddress (addr. addr );
150
152
}
151
153
152
- IPAddress MDNSResponder::queryHost (char *host){
153
- mdns_result_free (mdns);
154
- if (!mdns_query (mdns, host, NULL , 2000 )){
155
- return IPAddress ();
154
+
155
+ int MDNSResponder::queryService (char *service, char *proto) {
156
+ if (!service || !service[0 ] || !proto || !proto[0 ]){
157
+ log_e (" Bad Parameters" );
158
+ return 0 ;
159
+ }
160
+
161
+ if (results){
162
+ mdns_query_results_free (results);
163
+ results = NULL ;
156
164
}
157
- return IP (0 );
165
+
166
+ char srv[strlen (service)+2 ];
167
+ char prt[strlen (proto)+2 ];
168
+ sprintf (srv, " _%s" , service);
169
+ sprintf (prt, " _%s" , proto);
170
+
171
+ esp_err_t err = mdns_query_ptr (srv, prt, 3000 , 20 , &results);
172
+ if (err){
173
+ log_e (" Query Failed" );
174
+ return 0 ;
175
+ }
176
+ if (!results){
177
+ log_w (" No results found!" );
178
+ return 0 ;
179
+ }
180
+
181
+ mdns_result_t * r = results;
182
+ int i = 0 ;
183
+ while (r){
184
+ i++;
185
+ r = r->next ;
186
+ }
187
+ return i;
188
+ }
189
+
190
+ mdns_result_t * MDNSResponder::_getResult (int idx){
191
+ mdns_result_t * result = results;
192
+ int i = 0 ;
193
+ while (result){
194
+ if (i == idx){
195
+ break ;
196
+ }
197
+ i++;
198
+ result = result->next ;
199
+ }
200
+ return result;
158
201
}
159
202
160
203
String MDNSResponder::hostname (int idx) {
161
- const mdns_result_t * result = mdns_result_get (mdns, idx);
204
+ mdns_result_t * result = _getResult ( idx);
162
205
if (!result){
163
206
log_e (" Result %d not found" , idx);
164
207
return String ();
165
208
}
166
- return String (result->host );
209
+ return String (result->hostname );
167
210
}
168
211
169
212
IPAddress MDNSResponder::IP (int idx) {
170
- const mdns_result_t * result = mdns_result_get (mdns, idx);
213
+ mdns_result_t * result = _getResult ( idx);
171
214
if (!result){
172
215
log_e (" Result %d not found" , idx);
173
216
return IPAddress ();
174
217
}
175
- return IPAddress (result->addr .addr );
218
+ mdns_ip_addr_t * addr = result->addr ;
219
+ while (addr){
220
+ if (addr->addr .type == MDNS_IP_PROTOCOL_V4){
221
+ return IPAddress (addr->addr .u_addr .ip4 .addr );
222
+ }
223
+ addr = addr->next ;
224
+ }
225
+ return IPAddress ();
226
+ }
227
+
228
+ IPv6Address MDNSResponder::IPv6 (int idx) {
229
+ mdns_result_t * result = _getResult (idx);
230
+ if (!result){
231
+ log_e (" Result %d not found" , idx);
232
+ return IPv6Address ();
233
+ }
234
+ mdns_ip_addr_t * addr = result->addr ;
235
+ while (addr){
236
+ if (addr->addr .type == MDNS_IP_PROTOCOL_V6){
237
+ return IPv6Address (addr->addr .u_addr .ip6 .addr );
238
+ }
239
+ addr = addr->next ;
240
+ }
241
+ return IPv6Address ();
176
242
}
177
243
178
244
uint16_t MDNSResponder::port (int idx) {
179
- const mdns_result_t * result = mdns_result_get (mdns, idx);
245
+ mdns_result_t * result = _getResult ( idx);
180
246
if (!result){
181
247
log_e (" Result %d not found" , idx);
182
248
return 0 ;
0 commit comments