mirror of
https://github.com/esp8266/Arduino.git
synced 2025-07-27 18:02:17 +03:00
@ -36,21 +36,9 @@
|
||||
#include <WiFiClient.h>
|
||||
#include <ESP8266WebServer.h>
|
||||
#include <time.h>
|
||||
|
||||
/*
|
||||
Include the MDNSResponder (the library needs to be included also)
|
||||
As LEA MDNSResponder is experimantal in the ESP8266 environment currently, the
|
||||
legacy MDNSResponder is defaulted in th include file.
|
||||
There are two ways to access LEA MDNSResponder:
|
||||
1. Prepend every declaration and call to global declarations or functions with the namespace, like:
|
||||
'LEAmDNS::MDNSResponder::hMDNSService hMDNSService;'
|
||||
This way is used in the example. But be careful, if the namespace declaration is missing
|
||||
somewhere, the call might go to the legacy implementation...
|
||||
2. Open 'ESP8266mDNS.h' and set LEAmDNS to default.
|
||||
|
||||
*/
|
||||
#include <ESP8266mDNS.h>
|
||||
#include <PolledTimeout.h>
|
||||
#include <ESP8266mDNS.h>
|
||||
|
||||
/*
|
||||
Global defines and vars
|
||||
*/
|
||||
|
@ -0,0 +1,269 @@
|
||||
/*
|
||||
ESP8266 mDNS responder clock
|
||||
|
||||
This example demonstrates two features of the LEA clsLEAMDNSHost:
|
||||
1. The host and service domain negotiation process that ensures
|
||||
the uniqueness of the finally chosen host and service domain name.
|
||||
2. The dynamic MDNS service TXT feature
|
||||
|
||||
A 'clock' service in announced via the MDNS responder and the current
|
||||
time is set as a TXT item (eg. 'curtime=Mon Oct 15 19:54:35 2018').
|
||||
The time value is updated every second!
|
||||
|
||||
The ESP is initially announced to clients as 'esp8266.local', if this host domain
|
||||
is already used in the local network, another host domain is negotiated. Keep an
|
||||
eye on the serial output to learn the final host domain for the clock service.
|
||||
The service itself is is announced as 'host domain'._espclk._tcp.local.
|
||||
As the service uses port 80, a very simple HTTP server is also installed to deliver
|
||||
a small web page containing a greeting and the current time (not updated).
|
||||
The web server code is taken nearly 1:1 from the 'mDNS_Web_Server.ino' example.
|
||||
Point your browser to 'host domain'.local to see this web page.
|
||||
|
||||
Instructions:
|
||||
- Update WiFi SSID and password as necessary.
|
||||
- Flash the sketch to the ESP8266 board
|
||||
- Install host software:
|
||||
- For Linux, install Avahi (http://avahi.org/).
|
||||
- For Windows, install Bonjour (http://www.apple.com/support/bonjour/).
|
||||
- For Mac OSX and iOS support is built in through Bonjour already.
|
||||
- Use a MDNS/Bonjour browser like 'Discovery' to find the clock service in your local
|
||||
network and see the current time updates.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <WiFiClient.h>
|
||||
#include <ESP8266WebServer.h>
|
||||
#include <LwipIntf.h>
|
||||
#include <time.h>
|
||||
#include <PolledTimeout.h>
|
||||
|
||||
// uses API MDNSApiVersion::LEAv2
|
||||
#define NO_GLOBAL_MDNS // our MDNS is defined below
|
||||
#include <ESP8266mDNS.h>
|
||||
|
||||
/*
|
||||
Global defines and vars
|
||||
*/
|
||||
|
||||
#define TIMEZONE_OFFSET 1 // CET
|
||||
#define DST_OFFSET 1 // CEST
|
||||
#define UPDATE_CYCLE (1 * 1000) // every second
|
||||
|
||||
#define START_AP_AFTER_MS 10000 // start AP after delay
|
||||
#define SERVICE_PORT 80 // HTTP port
|
||||
|
||||
#ifndef STASSID
|
||||
#define STASSID "your-ssid"
|
||||
#define STAPSK "your-password"
|
||||
#endif
|
||||
|
||||
#ifndef APSSID
|
||||
#define APSSID "ap4mdnsClock"
|
||||
#define APPSK "mdnsClock"
|
||||
#endif
|
||||
|
||||
const char* ssid = STASSID;
|
||||
const char* password = STAPSK;
|
||||
|
||||
clsLEAMDNSHost MDNSRESP; // MDNS responder
|
||||
bool bHostDomainConfirmed = false; // Flags the confirmation of the host domain
|
||||
clsLEAMDNSHost::clsService* hMDNSService = 0; // The handle of the clock service in the MDNS responder
|
||||
|
||||
// HTTP server at port 'SERVICE_PORT' will respond to HTTP requests
|
||||
ESP8266WebServer server(SERVICE_PORT);
|
||||
|
||||
/*
|
||||
getTimeString
|
||||
*/
|
||||
const char* getTimeString(void) {
|
||||
|
||||
static char acTimeString[32];
|
||||
time_t now = time(nullptr);
|
||||
ctime_r(&now, acTimeString);
|
||||
size_t stLength;
|
||||
while (((stLength = strlen(acTimeString))) &&
|
||||
('\n' == acTimeString[stLength - 1])) {
|
||||
acTimeString[stLength - 1] = 0; // Remove trailing line break...
|
||||
}
|
||||
return acTimeString;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
setClock
|
||||
|
||||
Set time via NTP
|
||||
*/
|
||||
void setClock(void) {
|
||||
configTime((TIMEZONE_OFFSET * 3600), (DST_OFFSET * 3600), "pool.ntp.org", "time.nist.gov", "time.windows.com");
|
||||
|
||||
Serial.print("Waiting for NTP time sync: ");
|
||||
time_t now = time(nullptr); // Secs since 01.01.1970 (when uninitalized starts with (8 * 3600 = 28800)
|
||||
while (now < 8 * 3600 * 2) { // Wait for realistic value
|
||||
delay(500);
|
||||
Serial.print(".");
|
||||
now = time(nullptr);
|
||||
}
|
||||
Serial.println("");
|
||||
Serial.printf("Current time: %s\n", getTimeString());
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
setStationHostname
|
||||
*/
|
||||
bool setStationHostname(const char* p_pcHostname) {
|
||||
|
||||
if (p_pcHostname) {
|
||||
WiFi.hostname(p_pcHostname);
|
||||
Serial.printf("setDeviceHostname: Station hostname is set to '%s'\n", p_pcHostname);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
MDNSDynamicServiceTxtCallback
|
||||
|
||||
Add a dynamic MDNS TXT item 'ct' to the clock service.
|
||||
The callback function is called every time, the TXT items for the clock service
|
||||
are needed.
|
||||
This can be triggered by calling MDNSRESP.announce().
|
||||
|
||||
*/
|
||||
void MDNSDynamicServiceTxtCallback(const clsLEAMDNSHost::hMDNSService& p_hService) {
|
||||
Serial.println("MDNSDynamicServiceTxtCallback");
|
||||
|
||||
if (hMDNSService == &p_hService) {
|
||||
Serial.printf("Updating curtime TXT item to: %s\n", getTimeString());
|
||||
hMDNSService->addDynamicServiceTxt("curtime", getTimeString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
handleHTTPClient
|
||||
*/
|
||||
|
||||
void handleHTTPRequest() {
|
||||
Serial.println("");
|
||||
Serial.println("HTTP Request");
|
||||
|
||||
// Get current time
|
||||
time_t now = time(nullptr);;
|
||||
struct tm timeinfo;
|
||||
gmtime_r(&now, &timeinfo);
|
||||
|
||||
String s;
|
||||
s.reserve(300);
|
||||
|
||||
s = "<!DOCTYPE HTML>\r\n<html>Hello from ";
|
||||
s += WiFi.hostname() + " at " + WiFi.localIP().toString();
|
||||
// Simple addition of the current time
|
||||
s += "\r\nCurrent time is: ";
|
||||
s += getTimeString();
|
||||
// done :-)
|
||||
s += "</html>\r\n\r\n";
|
||||
Serial.println("Sending 200");
|
||||
server.send(200, "text/html", s);
|
||||
}
|
||||
|
||||
/*
|
||||
setup
|
||||
*/
|
||||
void setup(void) {
|
||||
Serial.begin(115200);
|
||||
|
||||
// Connect to WiFi network
|
||||
|
||||
WiFi.persistent(false);
|
||||
|
||||
// useless informative callback
|
||||
if (!LwipIntf::stateUpCB([](netif * nif) {
|
||||
Serial.printf("New interface %c%c/%d is up\n",
|
||||
nif->name[0],
|
||||
nif->name[1],
|
||||
netif_get_index(nif));
|
||||
})) {
|
||||
Serial.println("Error: could not add informative callback\n");
|
||||
}
|
||||
|
||||
WiFi.mode(WIFI_STA);
|
||||
WiFi.begin(ssid, password);
|
||||
Serial.println("");
|
||||
|
||||
// Wait for connection
|
||||
while (WiFi.status() != WL_CONNECTED) {
|
||||
delay(500);
|
||||
Serial.print(".");
|
||||
}
|
||||
Serial.println("");
|
||||
Serial.print("Connected to ");
|
||||
Serial.println(ssid);
|
||||
Serial.print("IP address: ");
|
||||
Serial.println(WiFi.localIP());
|
||||
|
||||
// Sync clock
|
||||
setClock();
|
||||
|
||||
// Setup MDNS responder
|
||||
// Init the (currently empty) host domain string with 'leamdnsv2'
|
||||
if (MDNSRESP.begin("leamdnsv2",
|
||||
[](clsLEAMDNSHost & p_rMDNSHost, const char* p_pcDomainName, bool p_bProbeResult)->void {
|
||||
if (p_bProbeResult) {
|
||||
Serial.printf("mDNSHost_AP::ProbeResultCallback: '%s' is %s\n", p_pcDomainName, (p_bProbeResult ? "FREE" : "USED!"));
|
||||
// Unattended added service
|
||||
hMDNSService = p_rMDNSHost.addService(0, "espclk", "tcp", 80);
|
||||
hMDNSService->addDynamicServiceTxt("curtime", getTimeString());
|
||||
hMDNSService->setDynamicServiceTxtCallback(MDNSDynamicServiceTxtCallback);
|
||||
} else {
|
||||
// Change hostname, use '-' as divider between base name and index
|
||||
MDNSRESP.setHostName(clsLEAMDNSHost::indexDomainName(p_pcDomainName, "-", 0));
|
||||
}
|
||||
})) {
|
||||
Serial.println("mDNS-AP started");
|
||||
} else {
|
||||
Serial.println("FAILED to start mDNS-AP");
|
||||
}
|
||||
|
||||
// Setup HTTP server
|
||||
server.on("/", handleHTTPRequest);
|
||||
server.begin();
|
||||
Serial.println("HTTP server started");
|
||||
}
|
||||
|
||||
/*
|
||||
loop
|
||||
*/
|
||||
void loop(void) {
|
||||
|
||||
// Check if a request has come in
|
||||
server.handleClient();
|
||||
// Allow MDNS processing
|
||||
MDNSRESP.update();
|
||||
|
||||
static esp8266::polledTimeout::periodicMs timeout(UPDATE_CYCLE);
|
||||
if (timeout.expired()) {
|
||||
|
||||
if (hMDNSService) {
|
||||
// Just trigger a new MDNS announcement, this will lead to a call to
|
||||
// 'MDNSDynamicServiceTxtCallback', which will update the time TXT item
|
||||
Serial.printf("Announce trigger from user\n");
|
||||
MDNSRESP.announce();
|
||||
}
|
||||
}
|
||||
|
||||
static bool AP_started = false;
|
||||
if (!AP_started && millis() > START_AP_AFTER_MS) {
|
||||
AP_started = true;
|
||||
Serial.printf("Starting AP...\n");
|
||||
WiFi.mode(WIFI_AP_STA);
|
||||
WiFi.softAP(APSSID, APPSK);
|
||||
Serial.printf("AP started...(%s:%s, %s)\n",
|
||||
WiFi.softAPSSID().c_str(),
|
||||
WiFi.softAPPSK().c_str(),
|
||||
WiFi.softAPIP().toString().c_str());
|
||||
}
|
||||
}
|
@ -33,19 +33,6 @@
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <WiFiClient.h>
|
||||
#include <ESP8266WebServer.h>
|
||||
|
||||
/*
|
||||
Include the MDNSResponder (the library needs to be included also)
|
||||
As LEA MDNSResponder is experimantal in the ESP8266 environment currently, the
|
||||
legacy MDNSResponder is defaulted in th include file.
|
||||
There are two ways to access LEA MDNSResponder:
|
||||
1. Prepend every declaration and call to global declarations or functions with the namespace, like:
|
||||
'LEAmDNS:MDNSResponder::hMDNSService hMDNSService;'
|
||||
This way is used in the example. But be careful, if the namespace declaration is missing
|
||||
somewhere, the call might go to the legacy implementation...
|
||||
2. Open 'ESP8266mDNS.h' and set LEAmDNS to default.
|
||||
|
||||
*/
|
||||
#include <ESP8266mDNS.h>
|
||||
|
||||
/*
|
||||
|
@ -0,0 +1,259 @@
|
||||
/*
|
||||
ESP8266 mDNS Responder Service Monitor
|
||||
|
||||
This example demonstrates two features of the LEA clsLEAMDNSHost:
|
||||
1. The host and service domain negotiation process that ensures
|
||||
the uniqueness of the finally choosen host and service domain name.
|
||||
2. The dynamic MDNS service lookup/query feature.
|
||||
|
||||
A list of 'HTTP' services in the local network is created and kept up to date.
|
||||
In addition to this, a (very simple) HTTP server is set up on port 80
|
||||
and announced as a service.
|
||||
|
||||
The ESP itself is initially announced to clients as 'esp8266.local', if this host domain
|
||||
is already used in the local network, another host domain is negociated. Keep an
|
||||
eye to the serial output to learn the final host domain for the HTTP service.
|
||||
The service itself is is announced as 'host domain'._http._tcp.local.
|
||||
The HTTP server delivers a short greeting and the current list of other 'HTTP' services (not updated).
|
||||
The web server code is taken nearly 1:1 from the 'mDNS_Web_Server.ino' example.
|
||||
Point your browser to 'host domain'.local to see this web page.
|
||||
|
||||
Instructions:
|
||||
- Update WiFi SSID and password as necessary.
|
||||
- Flash the sketch to the ESP8266 board
|
||||
- Install host software:
|
||||
- For Linux, install Avahi (http://avahi.org/).
|
||||
- For Windows, install Bonjour (http://www.apple.com/support/bonjour/).
|
||||
- For Mac OSX and iOS support is built in through Bonjour already.
|
||||
- Use a browser like 'Safari' to see the page at http://'host domain'.local.
|
||||
|
||||
*/
|
||||
|
||||
// THIS IS A WORK IN PROGRESS: some TODOs need completion
|
||||
|
||||
#ifndef STASSID
|
||||
#define STASSID "ssid"
|
||||
#define STAPSK "psk"
|
||||
#endif
|
||||
|
||||
#ifndef APSSID
|
||||
#define APSSID "esp8266"
|
||||
//#define APPSK "psk"
|
||||
#endif
|
||||
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <WiFiClient.h>
|
||||
#include <ESP8266WebServer.h>
|
||||
|
||||
#define NO_GLOBAL_MDNS // our MDNS is defined below
|
||||
#include <ESP8266mDNS.h>
|
||||
|
||||
/*
|
||||
Global defines and vars
|
||||
*/
|
||||
|
||||
#define SERVICE_PORT 80 // HTTP port
|
||||
clsLEAMDNSHost MDNS; // MDNS responder
|
||||
|
||||
char* pcHostDomain = 0; // Negociated host domain
|
||||
bool bHostDomainConfirmed = false; // Flags the confirmation of the host domain
|
||||
clsLEAMDNSHost::clsService* hMDNSService = 0; // The handle of the http service in the MDNS responder
|
||||
clsLEAMDNSHost::clsQuery* hMDNSServiceQuery = 0; // The handle of the 'http.tcp' service query in the MDNS responder
|
||||
|
||||
const String cstrNoHTTPServices = "Currently no 'http.tcp' services in the local network!<br/>";
|
||||
String strHTTPServices = cstrNoHTTPServices;
|
||||
|
||||
// HTTP server at port 'SERVICE_PORT' will respond to HTTP requests
|
||||
ESP8266WebServer server(SERVICE_PORT);
|
||||
|
||||
|
||||
/*
|
||||
setStationHostname
|
||||
*/
|
||||
bool setStationHostname(const char* p_pcHostname) {
|
||||
|
||||
if (p_pcHostname) {
|
||||
WiFi.hostname(p_pcHostname);
|
||||
Serial.printf("setStationHostname: Station hostname is set to '%s'\n", p_pcHostname);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void MDNSServiceQueryCallback(const clsLEAMDNSHost::clsQuery& p_Query,
|
||||
const clsLEAMDNSHost::clsQuery::clsAnswer& p_Answer,
|
||||
clsLEAMDNSHost::clsQuery::clsAnswer::typeQueryAnswerType p_QueryAnswerTypeFlags,
|
||||
bool p_bSetContent) {
|
||||
(void)p_Query;
|
||||
|
||||
String answerInfo;
|
||||
switch (p_QueryAnswerTypeFlags) {
|
||||
case static_cast<clsLEAMDNSHost::clsQuery::clsAnswer::typeQueryAnswerType>(clsLEAMDNSHost::clsQuery::clsAnswer::enuQueryAnswerType::ServiceDomain):
|
||||
answerInfo = "ServiceDomain " + String(p_Answer.m_ServiceDomain.c_str());
|
||||
break;
|
||||
|
||||
case static_cast<clsLEAMDNSHost::clsQuery::clsAnswer::typeQueryAnswerType>(clsLEAMDNSHost::clsQuery::clsAnswer::enuQueryAnswerType::HostDomainPort):
|
||||
answerInfo = "HostDomainAndPort " + String(p_Answer.m_HostDomain.c_str()) + ":" + String(p_Answer.m_u16Port);
|
||||
break;
|
||||
case static_cast<clsLEAMDNSHost::clsQuery::clsAnswer::typeQueryAnswerType>(clsLEAMDNSHost::clsQuery::clsAnswer::enuQueryAnswerType::IPv4Address):
|
||||
answerInfo = "IP4Address ";
|
||||
for (auto ip : p_Answer.m_IPv4Addresses) {
|
||||
answerInfo += "- " + ip->m_IPAddress.toString();
|
||||
};
|
||||
break;
|
||||
case static_cast<clsLEAMDNSHost::clsQuery::clsAnswer::typeQueryAnswerType>(clsLEAMDNSHost::clsQuery::clsAnswer::enuQueryAnswerType::Txts):
|
||||
answerInfo = "TXT ";
|
||||
for (auto kv : p_Answer.m_Txts.m_Txts) {
|
||||
answerInfo += "\nkv : " + String(kv->m_pcKey) + " : " + String(kv->m_pcValue);
|
||||
}
|
||||
break;
|
||||
default :
|
||||
answerInfo = "Unknown Answertype " + String(p_QueryAnswerTypeFlags);
|
||||
|
||||
}
|
||||
Serial.printf("Answer %s %s\n", answerInfo.c_str(), p_bSetContent ? "Modified" : "Deleted");
|
||||
}
|
||||
|
||||
/*
|
||||
MDNSServiceProbeResultCallback
|
||||
Probe result callback for Services
|
||||
*/
|
||||
|
||||
void serviceProbeResult(clsLEAMDNSHost::clsService& p_rMDNSService,
|
||||
const char* p_pcInstanceName,
|
||||
bool p_bProbeResult) {
|
||||
(void)p_rMDNSService;
|
||||
Serial.printf("MDNSServiceProbeResultCallback: Service %s probe %s\n", p_pcInstanceName, (p_bProbeResult ? "succeeded." : "failed!"));
|
||||
}
|
||||
|
||||
/*
|
||||
MDNSHostProbeResultCallback
|
||||
|
||||
Probe result callback for the host domain.
|
||||
If the domain is free, the host domain is set and the http service is
|
||||
added.
|
||||
If the domain is already used, a new name is created and the probing is
|
||||
restarted via p_pclsLEAMDNSHost->setHostname().
|
||||
|
||||
*/
|
||||
|
||||
void hostProbeResult(clsLEAMDNSHost & p_rMDNSHost, String p_pcDomainName, bool p_bProbeResult) {
|
||||
|
||||
(void)p_rMDNSHost;
|
||||
Serial.printf("MDNSHostProbeResultCallback: Host domain '%s.local' is %s\n", p_pcDomainName.c_str(), (p_bProbeResult ? "free" : "already USED!"));
|
||||
|
||||
if (true == p_bProbeResult) {
|
||||
// Set station hostname
|
||||
setStationHostname(pcHostDomain);
|
||||
|
||||
if (!bHostDomainConfirmed) {
|
||||
// Hostname free -> setup clock service
|
||||
bHostDomainConfirmed = true;
|
||||
|
||||
if (!hMDNSService) {
|
||||
// Add a 'http.tcp' service to port 'SERVICE_PORT', using the host domain as instance domain
|
||||
hMDNSService = MDNS.addService(0, "http", "tcp", SERVICE_PORT, serviceProbeResult);
|
||||
|
||||
if (hMDNSService) {
|
||||
hMDNSService->setProbeResultCallback(serviceProbeResult);
|
||||
// MDNS.setServiceProbeResultCallback(hMDNSService, serviceProbeResult);
|
||||
|
||||
// Add some '_http._tcp' protocol specific MDNS service TXT items
|
||||
// See: http://www.dns-sd.org/txtrecords.html#http
|
||||
hMDNSService->addServiceTxt("user", "");
|
||||
hMDNSService->addServiceTxt("password", "");
|
||||
hMDNSService->addServiceTxt("path", "/");
|
||||
}
|
||||
|
||||
// Install dynamic 'http.tcp' service query
|
||||
if (!hMDNSServiceQuery) {
|
||||
hMDNSServiceQuery = MDNS.installServiceQuery("http", "tcp", MDNSServiceQueryCallback);
|
||||
if (hMDNSServiceQuery) {
|
||||
Serial.printf("MDNSProbeResultCallback: Service query for 'http.tcp' services installed.\n");
|
||||
} else {
|
||||
Serial.printf("MDNSProbeResultCallback: FAILED to install service query for 'http.tcp' services!\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Change hostname, use '-' as divider between base name and index
|
||||
MDNS.setHostName(clsLEAMDNSHost::indexDomainName(p_pcDomainName.c_str(), "-", 0));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
HTTP request function (not found is handled by server)
|
||||
*/
|
||||
void handleHTTPRequest() {
|
||||
Serial.println("");
|
||||
Serial.println("HTTP Request");
|
||||
|
||||
IPAddress ip = server.client().localIP();
|
||||
String ipStr = ip.toString();
|
||||
String s;
|
||||
s.reserve(200 /* + service listed */);
|
||||
s = "<!DOCTYPE HTML>\r\n<html><h3><head>Hello from ";
|
||||
s += WiFi.hostname() + ".local at " + server.client().localIP().toString() + "</h3></head>";
|
||||
s += "<br/><h4>Local HTTP services are :</h4>";
|
||||
s += "<ol>";
|
||||
|
||||
// TODO: list services
|
||||
|
||||
s += "</ol><br/>";
|
||||
|
||||
Serial.println("Sending 200");
|
||||
server.send(200, "text/html", s);
|
||||
Serial.println("Done with request");
|
||||
}
|
||||
|
||||
/*
|
||||
setup
|
||||
*/
|
||||
void setup(void) {
|
||||
Serial.begin(115200);
|
||||
Serial.setDebugOutput(false);
|
||||
|
||||
Serial.println("");
|
||||
Serial.println("THIS IS A WORK IN PROGRESS: some TODOs need completion");
|
||||
Serial.println("");
|
||||
|
||||
// Connect to WiFi network
|
||||
WiFi.mode(WIFI_AP_STA);
|
||||
WiFi.softAP(APSSID);
|
||||
WiFi.begin(STASSID, STAPSK);
|
||||
Serial.println("");
|
||||
|
||||
// Wait for connection
|
||||
while (WiFi.status() != WL_CONNECTED) {
|
||||
delay(500);
|
||||
Serial.print(".");
|
||||
}
|
||||
Serial.println("");
|
||||
Serial.print("Connected to ");
|
||||
Serial.println(STASSID);
|
||||
Serial.print("IP address: ");
|
||||
Serial.println(WiFi.localIP());
|
||||
|
||||
// Setup HTTP server
|
||||
server.on("/", handleHTTPRequest);
|
||||
|
||||
// Setup MDNS responders
|
||||
MDNS.setProbeResultCallback(hostProbeResult);
|
||||
|
||||
// Init the (currently empty) host domain string with 'leamdnsv2'
|
||||
MDNS.begin("leamdnsv2");
|
||||
Serial.println("MDNS responder started");
|
||||
|
||||
// Start HTTP server
|
||||
server.begin();
|
||||
Serial.println("HTTP server started");
|
||||
}
|
||||
|
||||
void loop(void) {
|
||||
// Check if a request has come in
|
||||
server.handleClient();
|
||||
// Allow MDNS processing
|
||||
MDNS.update();
|
||||
}
|
@ -12,33 +12,38 @@
|
||||
|
||||
*/
|
||||
|
||||
#ifndef APSSID
|
||||
#define APSSID "your-apssid"
|
||||
#define APPSK "your-password"
|
||||
#endif
|
||||
|
||||
#ifndef STASSID
|
||||
#define STASSID "your-ssid"
|
||||
#define STASSID "your-sta"
|
||||
#define STAPSK "your-password"
|
||||
#endif
|
||||
|
||||
// includes
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <ESP8266mDNS.h>
|
||||
#include <WiFiUdp.h>
|
||||
#include <FS.h>
|
||||
#include <LittleFS.h>
|
||||
#include <ArduinoOTA.h>
|
||||
#include <ESP8266mDNS.h>
|
||||
|
||||
|
||||
/**
|
||||
@brief mDNS and OTA Constants
|
||||
@{
|
||||
*/
|
||||
#define HOSTNAME "ESP8266-OTA-" ///< Hostename. The setup function adds the Chip ID at the end.
|
||||
#define HOSTNAME "ESP8266-OTA-" ///< Hostname. The setup function adds the Chip ID at the end.
|
||||
/// @}
|
||||
|
||||
/**
|
||||
@brief Default WiFi connection information.
|
||||
@{
|
||||
*/
|
||||
const char* ap_default_ssid = STASSID; ///< Default SSID.
|
||||
const char* ap_default_psk = STAPSK; ///< Default PSK.
|
||||
const char* ap_default_ssid = APSSID; ///< Default SSID.
|
||||
const char* ap_default_psk = APPSK; ///< Default PSK.
|
||||
/// @}
|
||||
|
||||
/// Uncomment the next line for verbose output over UART.
|
||||
@ -166,8 +171,8 @@ void setup() {
|
||||
|
||||
// Load wifi connection information.
|
||||
if (! loadConfig(&station_ssid, &station_psk)) {
|
||||
station_ssid = "";
|
||||
station_psk = "";
|
||||
station_ssid = STASSID;
|
||||
station_psk = STAPSK;
|
||||
|
||||
Serial.println("No WiFi connection information available.");
|
||||
}
|
Reference in New Issue
Block a user