34
34
35
35
#include < ESP8266WiFi.h>
36
36
#include < WiFiClient.h>
37
+ #include < ESP8266WebServer.h>
37
38
#include < time.h>
38
39
39
40
/*
@@ -72,9 +73,8 @@ char* pcHostDomain = 0; // Negociated
72
73
bool bHostDomainConfirmed = false ; // Flags the confirmation of the host domain
73
74
MDNSResponder::hMDNSService hMDNSService = 0 ; // The handle of the clock service in the MDNS responder
74
75
75
- // TCP server at port 'SERVICE_PORT' will respond to HTTP requests
76
- WiFiServer server (SERVICE_PORT);
77
-
76
+ // HTTP server at port 'SERVICE_PORT' will respond to HTTP requests
77
+ ESP8266WebServer server (SERVICE_PORT);
78
78
79
79
/*
80
80
getTimeString
@@ -135,18 +135,13 @@ bool setStationHostname(const char* p_pcHostname) {
135
135
This can be triggered by calling MDNS.announce().
136
136
137
137
*/
138
- bool MDNSDynamicServiceTxtCallback (MDNSResponder* p_pMDNSResponder,
139
- const MDNSResponder::hMDNSService p_hService,
140
- void * p_pUserdata) {
138
+ void MDNSDynamicServiceTxtCallback (const MDNSResponder::hMDNSService p_hService) {
141
139
Serial.println (" MDNSDynamicServiceTxtCallback" );
142
- (void ) p_pUserdata;
143
140
144
- if ((p_pMDNSResponder) &&
145
- (hMDNSService == p_hService)) {
141
+ if (hMDNSService == p_hService) {
146
142
Serial.printf (" Updating curtime TXT item to: %s\n " , getTimeString ());
147
- p_pMDNSResponder-> addDynamicServiceTxt (p_hService, " curtime" , getTimeString ());
143
+ MDNS. addDynamicServiceTxt (p_hService, " curtime" , getTimeString ());
148
144
}
149
- return true ;
150
145
}
151
146
152
147
@@ -160,105 +155,66 @@ bool MDNSDynamicServiceTxtCallback(MDNSResponder* p_pMDNSResponder,
160
155
restarted via p_pMDNSResponder->setHostname().
161
156
162
157
*/
163
- bool MDNSProbeResultCallback (MDNSResponder* p_pMDNSResponder,
164
- const char * p_pcDomainName,
165
- const MDNSResponder::hMDNSService p_hService,
166
- bool p_bProbeResult,
167
- void * p_pUserdata) {
158
+ void hostProbeResult (String p_pcDomainName, bool p_bProbeResult) {
159
+
168
160
Serial.println (" MDNSProbeResultCallback" );
169
- (void ) p_pUserdata;
170
-
171
- if ((p_pMDNSResponder) &&
172
- (0 == p_hService)) { // Called for host domain
173
- Serial.printf (" MDNSProbeResultCallback: Host domain '%s.local' is %s\n " , p_pcDomainName, (p_bProbeResult ? " free" : " already USED!" ));
174
- if (true == p_bProbeResult) {
175
- // Set station hostname
176
- setStationHostname (pcHostDomain);
177
-
178
- if (!bHostDomainConfirmed) {
179
- // Hostname free -> setup clock service
180
- bHostDomainConfirmed = true ;
181
-
182
- if (!hMDNSService) {
183
- // Add a 'clock.tcp' service to port 'SERVICE_PORT', using the host domain as instance domain
184
- hMDNSService = p_pMDNSResponder->addService (0 , " espclk" , " tcp" , SERVICE_PORT);
185
- if (hMDNSService) {
186
- // Add a simple static MDNS service TXT item
187
- p_pMDNSResponder->addServiceTxt (hMDNSService, " port#" , SERVICE_PORT);
188
- // Set the callback function for dynamic service TXTs
189
- p_pMDNSResponder->setDynamicServiceTxtCallback (hMDNSService, MDNSDynamicServiceTxtCallback, 0 );
190
- }
161
+ Serial.printf (" MDNSProbeResultCallback: Host domain '%s.local' is %s\n " , p_pcDomainName.c_str (), (p_bProbeResult ? " free" : " already USED!" ));
162
+ if (true == p_bProbeResult) {
163
+ // Set station hostname
164
+ setStationHostname (pcHostDomain);
165
+
166
+ if (!bHostDomainConfirmed) {
167
+ // Hostname free -> setup clock service
168
+ bHostDomainConfirmed = true ;
169
+
170
+ if (!hMDNSService) {
171
+ // Add a 'clock.tcp' service to port 'SERVICE_PORT', using the host domain as instance domain
172
+ hMDNSService = MDNS.addService (0 , " espclk" , " tcp" , SERVICE_PORT);
173
+ if (hMDNSService) {
174
+ // Add a simple static MDNS service TXT item
175
+ MDNS.addServiceTxt (hMDNSService, " port#" , SERVICE_PORT);
176
+ // Set the callback function for dynamic service TXTs
177
+ MDNS.setDynamicServiceTxtCallback (MDNSDynamicServiceTxtCallback);
191
178
}
192
179
}
180
+ }
181
+ } else {
182
+ // Change hostname, use '-' as divider between base name and index
183
+ if (MDNSResponder::indexDomain (pcHostDomain, " -" , 0 )) {
184
+ MDNS.setHostname (pcHostDomain);
193
185
} else {
194
- // Change hostname, use '-' as divider between base name and index
195
- if (MDNSResponder::indexDomain (pcHostDomain, " -" , 0 )) {
196
- p_pMDNSResponder->setHostname (pcHostDomain);
197
- } else {
198
- Serial.println (" MDNSProbeResultCallback: FAILED to update hostname!" );
199
- }
186
+ Serial.println (" MDNSProbeResultCallback: FAILED to update hostname!" );
200
187
}
201
188
}
202
- return true ;
203
189
}
204
190
205
191
206
192
/*
207
193
handleHTTPClient
208
194
*/
209
- void handleHTTPClient (WiFiClient& client) {
210
- Serial.println (" " );
211
- Serial.println (" New client" );
212
-
213
- // Wait for data from client to become available
214
- while (client.connected () && !client.available ()) {
215
- delay (1 );
216
- }
217
195
218
- // Read the first line of HTTP request
219
- String req = client.readStringUntil (' \r ' );
220
-
221
- // First line of HTTP request looks like "GET /path HTTP/1.1"
222
- // Retrieve the "/path" part by finding the spaces
223
- int addr_start = req.indexOf (' ' );
224
- int addr_end = req.indexOf (' ' , addr_start + 1 );
225
- if (addr_start == -1 || addr_end == -1 ) {
226
- Serial.print (" Invalid request: " );
227
- Serial.println (req);
228
- return ;
229
- }
230
- req = req.substring (addr_start + 1 , addr_end);
231
- Serial.print (" Request: " );
232
- Serial.println (req);
233
- client.flush ();
196
+ void handleHTTPRequest () {
197
+ Serial.println (" " );
198
+ Serial.println (" HTTP Request" );
234
199
235
200
// Get current time
236
201
time_t now = time (nullptr );;
237
202
struct tm timeinfo;
238
203
gmtime_r (&now, &timeinfo);
239
204
240
205
String s;
241
- if (req == " /" ) {
242
- IPAddress ip = WiFi.localIP ();
243
- String ipStr = String (ip[0 ]) + ' .' + String (ip[1 ]) + ' .' + String (ip[2 ]) + ' .' + String (ip[3 ]);
244
- s = " HTTP/1.1 200 OK\r\n Content-Type: text/html\r\n\r\n <!DOCTYPE HTML>\r\n <html>Hello from " ;
245
- s += WiFi.hostname () + " at " + ipStr;
246
- // Simple addition of the current time
247
- s += " \r\n Current time is: " ;
248
- s += getTimeString ();
249
- // done :-)
250
- s += " </html>\r\n\r\n " ;
251
- Serial.println (" Sending 200" );
252
- } else {
253
- s = " HTTP/1.1 404 Not Found\r\n\r\n " ;
254
- Serial.println (" Sending 404" );
255
- }
256
- client.print (s);
257
206
258
- Serial.println (" Done with client" );
207
+ s = " <!DOCTYPE HTML>\r\n <html>Hello from " ;
208
+ s += WiFi.hostname () + " at " + WiFi.localIP ().toString ();
209
+ // Simple addition of the current time
210
+ s += " \r\n Current time is: " ;
211
+ s += getTimeString ();
212
+ // done :-)
213
+ s += " </html>\r\n\r\n " ;
214
+ Serial.println (" Sending 200" );
215
+ server.send (200 , " text/html" , s);
259
216
}
260
217
261
-
262
218
/*
263
219
setup
264
220
*/
@@ -285,7 +241,7 @@ void setup(void) {
285
241
setClock ();
286
242
287
243
// Setup MDNS responder
288
- MDNS.setProbeResultCallback (MDNSProbeResultCallback, 0 );
244
+ MDNS.setHostProbeResultCallback (hostProbeResult );
289
245
// Init the (currently empty) host domain string with 'esp8266'
290
246
if ((!MDNSResponder::indexDomain (pcHostDomain, 0 , " esp8266" )) ||
291
247
(!MDNS.begin (pcHostDomain))) {
@@ -296,26 +252,22 @@ void setup(void) {
296
252
}
297
253
Serial.println (" MDNS responder started" );
298
254
299
- // Start TCP (HTTP) server
255
+ // Setup HTTP server
256
+ server.on (" /" , handleHTTPRequest);
300
257
server.begin ();
301
- Serial.println (" TCP server started" );
258
+ Serial.println (" HTTP server started" );
302
259
}
303
260
304
-
305
261
/*
306
262
loop
307
263
*/
308
264
void loop (void ) {
309
- // Check if a client has connected
310
- WiFiClient client = server.available ();
311
- if (client) {
312
- handleHTTPClient (client);
313
- }
314
265
266
+ // Check if a request has come in
267
+ server.handleClient ();
315
268
// Allow MDNS processing
316
269
MDNS.update ();
317
270
318
- // Update time (if needed)
319
271
static esp8266::polledTimeout::periodic timeout (UPDATE_CYCLE);
320
272
if (timeout.expired ()) {
321
273
@@ -326,5 +278,3 @@ void loop(void) {
326
278
}
327
279
}
328
280
}
329
-
330
-
0 commit comments