mirror of
https://github.com/wled/WLED.git
synced 2025-07-24 19:26:40 +00:00
New hostname handling - add option to enable mDNS in settings - move hostname to "nw" key in config JSON - add new config key in "nw" for mDNS (bool) - remove prepareHostname()
function - update mDNS calls - add hostname update for Ethernet - move WiFi configuration to cfg.json - rename LED and WiFi to Hardware and Network in settings - reorder network settings
This commit is contained in:
parent
e2edd38de5
commit
2509b1c5d5
@ -57,25 +57,22 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
|
||||
#endif
|
||||
|
||||
JsonObject id = doc["id"];
|
||||
getStringFromJson(cmDNS, id[F("mdns")], sizeof(cmDNS));
|
||||
// fill in unique mDNS name if not set (cmDNS can be empty meaning no mDNS is used)
|
||||
if (strcmp(cmDNS, DEFAULT_MDNS_NAME) == 0) sprintf_P(cmDNS, PSTR("wled-%*s"), 6, escapedMac.c_str() + 6);
|
||||
getStringFromJson(serverDescription, id[F("name")], sizeof(serverDescription));
|
||||
if (!fromFS) {
|
||||
char hostname[25];
|
||||
prepareHostname(hostname, sizeof(hostname)-1);
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
WiFi.setHostname(hostname);
|
||||
#else
|
||||
WiFi.hostname(hostname);
|
||||
#endif
|
||||
// legacy behaviour
|
||||
getStringFromJson(hostName, id[F("mdns")], sizeof(hostName));
|
||||
if (strlen(hostName) == 0) {
|
||||
mDNSenabled = false; // if no host name is set, disable mDNS
|
||||
sprintf_P(hostName, PSTR("wled-%.*s"), 6, escapedMac.c_str() + 6);
|
||||
}
|
||||
|
||||
getStringFromJson(serverDescription, id["name"], sizeof(serverDescription));
|
||||
#ifndef WLED_DISABLE_ALEXA
|
||||
getStringFromJson(alexaInvocationName, id[F("inv")], sizeof(alexaInvocationName));
|
||||
#endif
|
||||
CJSON(simplifiedUI, id[F("sui")]);
|
||||
|
||||
JsonObject nw = doc["nw"];
|
||||
CJSON(mDNSenabled, nw[F("mdns")]);
|
||||
getStringFromJson(hostName, nw["name"], sizeof(hostName));
|
||||
#ifndef WLED_DISABLE_ESPNOW
|
||||
CJSON(enableESPNow, nw[F("espnow")]);
|
||||
linked_remotes.clear();
|
||||
@ -154,13 +151,23 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
|
||||
|
||||
JsonObject wifi = doc[F("wifi")];
|
||||
noWifiSleep = !(wifi[F("sleep")] | !noWifiSleep); // inverted
|
||||
//noWifiSleep = !noWifiSleep;
|
||||
CJSON(force802_3g, wifi[F("phy")]); //force phy mode g?
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
CJSON(txPower, wifi[F("txpwr")]);
|
||||
txPower = min(max((int)txPower, (int)WIFI_POWER_2dBm), (int)WIFI_POWER_19_5dBm);
|
||||
#endif
|
||||
|
||||
// apply WiFi options from above (regardless of fromFS or not)
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
WiFi.setSleep(!noWifiSleep);
|
||||
WiFi.setHostname(hostName);
|
||||
WiFi.setTxPower(wifi_power_t(txPower));
|
||||
#else
|
||||
WiFi.setPhyMode(force802_3g ? WIFI_PHY_MODE_11G : WIFI_PHY_MODE_11N);
|
||||
wifi_set_sleep_type((noWifiSleep) ? NONE_SLEEP_T : MODEM_SLEEP_T);
|
||||
WiFi.hostname(hostName);
|
||||
#endif
|
||||
|
||||
JsonObject hw = doc[F("hw")];
|
||||
|
||||
// initialize LED pins and lengths prior to other HW (except for ethernet)
|
||||
@ -837,14 +844,15 @@ void serializeConfig(JsonObject root) {
|
||||
root[F("vid")] = VERSION;
|
||||
|
||||
JsonObject id = root.createNestedObject("id");
|
||||
id[F("mdns")] = cmDNS;
|
||||
id[F("name")] = serverDescription;
|
||||
id["name"] = serverDescription;
|
||||
#ifndef WLED_DISABLE_ALEXA
|
||||
id[F("inv")] = alexaInvocationName;
|
||||
#endif
|
||||
id[F("sui")] = simplifiedUI;
|
||||
|
||||
JsonObject nw = root.createNestedObject("nw");
|
||||
id["name"] = hostName;
|
||||
id[F("mdns")] = mDNSenabled;
|
||||
#ifndef WLED_DISABLE_ESPNOW
|
||||
nw[F("espnow")] = enableESPNow;
|
||||
JsonArray lrem = nw.createNestedArray(F("linked_remote"));
|
||||
|
@ -38,13 +38,13 @@
|
||||
</head>
|
||||
<body onload="S()">
|
||||
<button type=submit id="b" onclick="window.location=getURL('/')">Back</button>
|
||||
<button type="submit" onclick="window.location=getURL('/settings/wifi')">WiFi Setup</button>
|
||||
<button type="submit" onclick="window.location=getURL('/settings/leds')">LED Preferences</button>
|
||||
<button type="submit" onclick="window.location=getURL('/settings/wifi')">Network Setup</button>
|
||||
<button type="submit" onclick="window.location=getURL('/settings/leds')">Hardware Setup</button>
|
||||
<button id="2dbtn" type="submit" onclick="window.location=getURL('/settings/2D')">2D Configuration</button>
|
||||
<button type="submit" onclick="window.location=getURL('/settings/ui')">User Interface</button>
|
||||
<button id="dmxbtn" style="display:none;" type="submit" onclick="window.location=getURL('/settings/dmx')">DMX Output</button>
|
||||
<button type="submit" onclick="window.location=getURL('/settings/sync')">Sync Interfaces</button>
|
||||
<button type="submit" onclick="window.location=getURL('/settings/time')">Time & Macros</button>
|
||||
<button type="submit" onclick="window.location=getURL('/settings/time')">Time & Scheduler</button>
|
||||
<button type="submit" onclick="window.location=getURL('/settings/um')">Usermods</button>
|
||||
<button type="submit" onclick="window.location=getURL('/settings/sec')">Security & Updates</button>
|
||||
</body>
|
||||
|
@ -155,14 +155,13 @@
|
||||
|
||||
function Save() {
|
||||
SetLS();
|
||||
if (d.Sf.DS.value != initial_ds || /*d.Sf.ST.checked != initial_st ||*/ d.Sf.SU.checked != initial_su) d.Sf.submit();
|
||||
if (d.Sf.DS.value != initial_ds || d.Sf.SU.checked != initial_su) d.Sf.submit();
|
||||
}
|
||||
|
||||
function S() {
|
||||
getLoc();
|
||||
loadJS(getURL('/settings/s.js?p=3'), false, undefined, ()=>{
|
||||
initial_ds = d.Sf.DS.value;
|
||||
//initial_st = d.Sf.ST.checked;
|
||||
initial_su = d.Sf.SU.checked;
|
||||
GetLS();
|
||||
}); // If we set async false, file is loaded and executed, then next statement is processed
|
||||
@ -219,10 +218,9 @@
|
||||
<span id="lserr" style="color:red; display:none">⚠ Could not access local storage. Make sure it is enabled in your browser.</span><hr>
|
||||
</div>
|
||||
<h2>Web Setup</h2>
|
||||
Server description: <input type="text" name="DS" maxlength="32"><br>
|
||||
<!-- Sync button toggles both send and receive: <input type="checkbox" name="ST"><br> -->
|
||||
Device name: <input type="text" name="DS" minlength="2" maxlength="32"><br>
|
||||
Enable simplified UI: <input type="checkbox" name="SU"><br>
|
||||
<i>The following UI customization settings are unique both to the WLED device and this browser.<br>
|
||||
<i class="warn">The following UI customization settings are unique both to the WLED device and this browser.<br>
|
||||
You will need to set them again if using a different browser, device or WLED IP address.<br>
|
||||
Refresh the main UI to apply changes.</i><br>
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport">
|
||||
<title>WiFi Settings</title>
|
||||
<title>Network Settings</title>
|
||||
<script src="common.js" async type="text/javascript"></script>
|
||||
<script>
|
||||
var scanLoops = 0, preScanSSID = "";
|
||||
@ -134,7 +134,7 @@ Static subnet mask:<br>
|
||||
}
|
||||
function S() {
|
||||
getLoc();
|
||||
loadJS(getURL('/settings/s.js?p=1'), false); // If we set async false, file is loaded and executed, then next statement is processed
|
||||
loadJS(getURL('/settings/s.js?p=1'), false, undefined, genUrl); // If we set async false, file is loaded and executed, then next statement is processed
|
||||
if (loc) d.Sf.action = getURL('/settings/wifi');
|
||||
setTimeout(tE, 500); // wait for DOM to load before calling tE()
|
||||
}
|
||||
@ -177,8 +177,9 @@ Static subnet mask:<br>
|
||||
rC++;
|
||||
gId('+').style.display = gId("rml").childElementCount < 10 ? 'inline' : 'none'; // can't append to list anymore, hide button
|
||||
}
|
||||
function vI(i) {
|
||||
i.style.color = (i.value.match(/^[a-zA-Z0-9_\-]*$/)) ? 'white' : 'red';
|
||||
function genUrl() {
|
||||
gId("ml").textContent = d.Sf.CM.value;
|
||||
gId('mi').style.display = d.Sf.MD.checked?'inline':'none'
|
||||
}
|
||||
</script>
|
||||
<style>@import url("style.css");</style>
|
||||
@ -189,14 +190,15 @@ Static subnet mask:<br>
|
||||
<div class="helpB"><button type="button" onclick="H('features/settings/#wifi-settings')">?</button></div>
|
||||
<button type="button" onclick="B()">Back</button><button type="submit">Save & Connect</button><hr>
|
||||
</div>
|
||||
<h2>WiFi setup</h2>
|
||||
Hostname/mDNS address (empty for no mDNS):<br>
|
||||
http://<input type="text" name="CM" maxlength="32" pattern="[a-zA-Z0-9_\-]*" oninput="vI(this)">.local<br>
|
||||
<h2>Network setup</h2>
|
||||
Hostname<br>
|
||||
<input type="text" name="CM" minlength="2" maxlength="32" pattern="[a-zA-Z0-9_\-]*" oninput="genUrl()"><br>
|
||||
Enable mDNS: <input type="checkbox" name="MD" checked onchange="genUrl()"><br>
|
||||
<div id="mi"><i>http://<span id="ml">wled</span>.local</i><br></div>
|
||||
Client IP: <span class="sip"> Not connected </span><br>
|
||||
<h3>Connect to existing network</h3>
|
||||
<h3>WiFi</h3>
|
||||
<button type="button" id="scan" onclick="N()">Scan</button><br>
|
||||
<div id="wifi">
|
||||
Wireless networks
|
||||
<div id="wifi_entries"></div>
|
||||
<hr class="sml">
|
||||
<button type="button" id="wifi_add" onclick="addWiFi()">+</button>
|
||||
@ -204,20 +206,59 @@ Static subnet mask:<br>
|
||||
</div>
|
||||
DNS server address:<br>
|
||||
<input name="D0" type="number" class="s" min="0" max="255" required>.<input name="D1" type="number" class="s" min="0" max="255" required>.<input name="D2" type="number" class="s" min="0" max="255" required>.<input name="D3" type="number" class="s" min="0" max="255" required><br>
|
||||
<h3>Configure Access Point</h3>
|
||||
AP SSID (empty for no AP):<br> <input type="text" name="AS" maxlength="32" pattern="[a-zA-Z0-9_\-]*" oninput="vI(this)"><br>
|
||||
<hr class="sml">
|
||||
<h3>Access Point</h3>
|
||||
AP SSID (empty for no AP):<br><input type="text" name="AS" maxlength="32" pattern="[a-zA-Z0-9_\-]*"><br>
|
||||
Hide AP name: <input type="checkbox" name="AH"><br>
|
||||
AP password (empty for open):<br> <input type="password" name="AP" maxlength="63" pattern="(.{8,63})|()" title="Empty or min. 8 characters"><br>
|
||||
AP password (empty for open):<br><input type="password" name="AP" maxlength="63" pattern="(.{8,63})|()" title="Empty or min. 8 characters"><br>
|
||||
Access Point WiFi channel: <input name="AC" type="number" class="xs" min="1" max="13" required><br>
|
||||
AP opens:
|
||||
AP opens:<br>
|
||||
<select name="AB">
|
||||
<option value="0">No connection after boot</option>
|
||||
<option value="1">Disconnected</option>
|
||||
<option value="2">Always</option>
|
||||
<option value="3">Never (not recommended)</option>
|
||||
<option value="4">Temporary (no connection after boot)</option>
|
||||
<option value="3">Never (use button!)</option>
|
||||
<option value="4">Temporary</option>
|
||||
</select><br>
|
||||
AP IP: <span class="sip"> Not active </span><br>
|
||||
AP IP: <span class="sip">Not active</span><br>
|
||||
<hr class="sml">
|
||||
<div id="ethd">
|
||||
<h3>Ethernet Type</h3>
|
||||
<select name="ETH" onchange="if(this.selectedIndex!=0)d.Sf.RE.checked=false;">
|
||||
<option value="0">None</option>
|
||||
<option value="9">ABC! WLED V43 & compatible</option>
|
||||
<option value="2">ESP32-POE</option>
|
||||
<option value="11">ESP32-POE-WROVER</option>
|
||||
<option value="6">ESP32Deux/RGB2Go Tetra</option>
|
||||
<option value="7">KIT-VE</option>
|
||||
<option value="12">LILYGO T-POE Pro</option>
|
||||
<option value="8">QuinLED-Dig-Octa & T-ETH-POE</option>
|
||||
<option value="4">QuinLED-ESP32</option>
|
||||
<option value="10">Serg74-ETH32</option>
|
||||
<option value="5">TwilightLord-ESP32</option>
|
||||
<option value="3">WESP32</option>
|
||||
<option value="1">WT32-ETH01</option>
|
||||
</select><br>
|
||||
<i class="warn">ESP-NOW is incompatible with Ethernet.</i>
|
||||
</div>
|
||||
<hr class="sml">
|
||||
<h3>ESP-NOW Wireless</h3>
|
||||
<div id="NoESPNOW" class="hide">
|
||||
<i class="warn">This firmware build does not include ESP-NOW support.<br></i>
|
||||
</div>
|
||||
<div id="ESPNOW">
|
||||
Enable ESP-NOW: <input type="checkbox" name="RE" onchange="tE()"><br>
|
||||
<i>Listen for events over ESP-NOW<br>
|
||||
Keep disabled if not using a remote or wireless sync, increases power consumption.<br></i>
|
||||
<div id="rlc">
|
||||
Last device seen: <span class="rlid" id="ld"></span>
|
||||
<button type="button" class="sml" id="+" onclick="aR(gId('ld').textContent)">+</button><br>
|
||||
Linked MACs:<br>
|
||||
<div id="rml"></div>
|
||||
</div>
|
||||
<input type="hidden" name="RMAC" id="rmacs">
|
||||
</div>
|
||||
<hr class="sml">
|
||||
<h3>Experimental</h3>
|
||||
Force 802.11g mode (ESP8266 only): <input type="checkbox" name="FG"><br>
|
||||
Disable WiFi sleep: <input type="checkbox" name="WS"><br>
|
||||
@ -238,43 +279,6 @@ Static subnet mask:<br>
|
||||
</select><br>
|
||||
<i class="warn">WARNING: Modifying TX power may render device unreachable.</i>
|
||||
</div>
|
||||
|
||||
<h3>ESP-NOW Wireless</h3>
|
||||
<div id="NoESPNOW" class="hide">
|
||||
<i class="warn">This firmware build does not include ESP-NOW support.<br></i>
|
||||
</div>
|
||||
<div id="ESPNOW">
|
||||
Enable ESP-NOW: <input type="checkbox" name="RE" onchange="tE()"><br>
|
||||
<i>Listen for events over ESP-NOW<br>
|
||||
Keep disabled if not using a remote or ESP-NOW sync, increases power consumption.<br></i>
|
||||
<div id="rlc">
|
||||
Last device seen: <span class="rlid" id="ld">None</span>
|
||||
<button type="button" class="sml" id="+" onclick="aR('RM'+rC,gId('ld').textContent)">+</button><br>
|
||||
Linked MACs (10 max):<br>
|
||||
<div id="rml">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="ethd">
|
||||
<h3>Ethernet Type</h3>
|
||||
<select name="ETH" onchange="if(this.selectedIndex!=0)d.Sf.RE.checked=false;">
|
||||
<option value="0">None</option>
|
||||
<option value="9">ABC! WLED V43 & compatible</option>
|
||||
<option value="2">ESP32-POE</option>
|
||||
<option value="11">ESP32-POE-WROVER</option>
|
||||
<option value="6">ESP32Deux/RGB2Go Tetra</option>
|
||||
<option value="7">KIT-VE</option>
|
||||
<option value="12">LILYGO T-POE Pro</option>
|
||||
<option value="8">QuinLED-Dig-Octa & T-ETH-POE</option>
|
||||
<option value="4">QuinLED-ESP32</option>
|
||||
<option value="10">Serg74-ETH32</option>
|
||||
<option value="5">TwilightLord-ESP32</option>
|
||||
<option value="3">WESP32</option>
|
||||
<option value="1">WT32-ETH01</option>
|
||||
</select><br>
|
||||
<i class="warn">ESP-NOW is incompatible with Ethernet.</i>
|
||||
</div>
|
||||
<hr>
|
||||
<button type="button" onclick="B()">Back</button><button type="submit">Save & Connect</button>
|
||||
</form>
|
||||
|
@ -64,7 +64,7 @@ button.sml {
|
||||
.hide {
|
||||
display: none;
|
||||
}
|
||||
.err {
|
||||
.err, input:invalid {
|
||||
color: #f00;
|
||||
}
|
||||
.warn {
|
||||
|
@ -371,6 +371,7 @@ void espNowReceiveCB(uint8_t* address, uint8_t* data, uint8_t len, signed int rs
|
||||
//network.cpp
|
||||
bool initEthernet(); // result is informational
|
||||
int getSignalQuality(int rssi);
|
||||
IPAddress resolveHostname(const String &hostname, bool useMDNS = true);
|
||||
void fillMAC2Str(char *str, const uint8_t *mac);
|
||||
void fillStr2MAC(uint8_t *mac, const char *str);
|
||||
int findWiFi(bool doScan = false);
|
||||
@ -505,7 +506,6 @@ size_t printSetFormValue(Print& settingsScript, const char* key, int val);
|
||||
size_t printSetFormValue(Print& settingsScript, const char* key, const char* val);
|
||||
size_t printSetFormIndex(Print& settingsScript, const char* key, int index);
|
||||
size_t printSetClassElementHTML(Print& settingsScript, const char* key, const int index, const char* val);
|
||||
void prepareHostname(char* hostname, size_t maxLen = 32);
|
||||
[[gnu::pure]] bool isAsterisksOnly(const char* str, byte maxLen);
|
||||
bool requestJSONBufferLock(uint8_t moduleID=255);
|
||||
void releaseJSONBufferLock();
|
||||
|
@ -206,11 +206,10 @@ void sendImprovInfoResponse() {
|
||||
#endif
|
||||
strlwr(bString);
|
||||
#endif
|
||||
//Use serverDescription if it has been changed from the default "WLED", else mDNS name
|
||||
bool useMdnsName = (strcmp(serverDescription, "WLED") == 0 && strlen(cmDNS) > 0);
|
||||
char vString[32];
|
||||
sprintf_P(vString, PSTR("%s/%i"), versionString, VERSION);
|
||||
const char *str[4] = {"WLED", vString, bString, useMdnsName ? cmDNS : serverDescription};
|
||||
char vString[33];
|
||||
snprintf_P(vString, sizeof(vString)-1, PSTR("%s/%i"), versionString, VERSION);
|
||||
//Use serverDescription if it has been changed from the default "WLED", else host name
|
||||
const char *str[4] = {"WLED", vString, bString, strcmp(serverDescription, "WLED") == 0 ? hostName : serverDescription};
|
||||
|
||||
sendImprovRPCResult(ImprovRPCType::Request_Info, 4, str);
|
||||
}
|
||||
|
@ -265,6 +265,24 @@ int getSignalQuality(int rssi)
|
||||
}
|
||||
|
||||
|
||||
IPAddress resolveHostname(const String &hostname, bool useMDNS) {
|
||||
IPAddress clnt;
|
||||
if (Network.isConnected() && hostname.length() > 0) {
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
if (mDNSenabled && useMDNS) {
|
||||
String mDNSname = hostname;
|
||||
mDNSname.toLowerCase(); // make sure we have a lowercase hostname
|
||||
int pos = mDNSname.indexOf(F(".local"));
|
||||
if (pos > 0) mDNSname.remove(pos); // remove .local domain if present (and anything following it)
|
||||
if (mDNSname.indexOf('.') < 0) clnt = MDNS.queryHost(mDNSname.c_str());
|
||||
}
|
||||
#endif
|
||||
if (clnt == IPAddress()) WiFi.hostByName(hostname.c_str(), clnt); // use full hostname if MDNS failed
|
||||
}
|
||||
return clnt;
|
||||
}
|
||||
|
||||
// fill MAC address string with 6 bytes from mac array
|
||||
void fillMAC2Str(char *str, const uint8_t *mac) {
|
||||
sprintf_P(str, PSTR("%02x%02x%02x%02x%02x%02x"), MAC2STR(mac));
|
||||
byte nul = 0;
|
||||
@ -396,15 +414,12 @@ void WiFiEvent(WiFiEvent_t event)
|
||||
if (!apActive) {
|
||||
WiFi.disconnect(true); // disable WiFi entirely
|
||||
}
|
||||
ETH.setHostname(hostName);
|
||||
if (multiWiFi[0].staticIP != (uint32_t)0x00000000 && multiWiFi[0].staticGW != (uint32_t)0x00000000) {
|
||||
ETH.config(multiWiFi[0].staticIP, multiWiFi[0].staticGW, multiWiFi[0].staticSN, dnsAddress);
|
||||
} else {
|
||||
ETH.config(INADDR_NONE, INADDR_NONE, INADDR_NONE);
|
||||
}
|
||||
// convert the "serverDescription" into a valid DNS hostname (alphanumeric)
|
||||
char hostname[33];
|
||||
prepareHostname(hostname, sizeof(hostname)-1);
|
||||
ETH.setHostname(hostname);
|
||||
showWelcomePage = false;
|
||||
break;
|
||||
}
|
||||
|
@ -63,14 +63,17 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
||||
dnsAddress = IPAddress(request->arg(F("D0")).toInt(),request->arg(F("D1")).toInt(),request->arg(F("D2")).toInt(),request->arg(F("D3")).toInt());
|
||||
}
|
||||
|
||||
strlcpy(cmDNS, request->arg(F("CM")).c_str(), sizeof(cmDNS));
|
||||
char hostname[25];
|
||||
prepareHostname(hostname, sizeof(hostname)-1);
|
||||
strlcpy(hostName, request->arg(F("CM")).c_str(), sizeof(hostName));
|
||||
if (strlen(hostName) == 0) sprintf_P(hostName, PSTR("wled-%.*s"), 6, escapedMac.c_str() + 6); // hostname must not be empty
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
WiFi.setHostname(hostname);
|
||||
#ifdef WLED_USE_ETHERNET
|
||||
ETH.setHostname(hostName);
|
||||
#endif
|
||||
WiFi.setHostname(hostName);
|
||||
#else
|
||||
WiFi.hostname(hostname);
|
||||
WiFi.hostname(hostName);
|
||||
#endif
|
||||
mDNSenabled = request->hasArg(F("MD"));
|
||||
|
||||
apBehavior = request->arg(F("AB")).toInt();
|
||||
char oldSSID[33]; strcpy(oldSSID, apSSID);
|
||||
@ -89,10 +92,17 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
int tx = request->arg(F("TX")).toInt();
|
||||
txPower = min(max(tx, (int)WIFI_POWER_2dBm), (int)WIFI_POWER_19_5dBm);
|
||||
WiFi.setTxPower(wifi_power_t(txPower));
|
||||
#endif
|
||||
|
||||
force802_3g = request->hasArg(F("FG"));
|
||||
noWifiSleep = request->hasArg(F("WS"));
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
WiFi.setSleep(!noWifiSleep);
|
||||
#else
|
||||
WiFi.setPhyMode(force802_3g ? WIFI_PHY_MODE_11G : WIFI_PHY_MODE_11N);
|
||||
wifi_set_sleep_type((noWifiSleep) ? NONE_SLEEP_T : MODEM_SLEEP_T);
|
||||
#endif
|
||||
|
||||
#ifndef WLED_DISABLE_ESPNOW
|
||||
bool oldESPNow = enableESPNow;
|
||||
@ -279,8 +289,8 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
||||
|
||||
disablePullUp = (bool)request->hasArg(F("IP"));
|
||||
touchThreshold = request->arg(F("TT")).toInt();
|
||||
for (int i = 0; i < WLED_MAX_BUTTONS; i++) {
|
||||
int offset = i < 10 ? '0' : 'A' - 10;
|
||||
for (unsigned i = 0; i < WLED_MAX_BUTTONS; i++) {
|
||||
unsigned offset = i < 10 ? '0' : 'A' - 10;
|
||||
char bt[4] = "BT"; bt[2] = offset+i; bt[3] = 0; // button pin (use A,B,C,... if WLED_MAX_BUTTONS>10)
|
||||
char be[4] = "BE"; be[2] = offset+i; be[3] = 0; // button type (use A,B,C,... if WLED_MAX_BUTTONS>10)
|
||||
int hw_btn_pin = request->arg(bt).toInt();
|
||||
@ -375,14 +385,6 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
||||
if (subPage == SUBPAGE_UI)
|
||||
{
|
||||
strlcpy(serverDescription, request->arg(F("DS")).c_str(), 33);
|
||||
char hostname[25];
|
||||
prepareHostname(hostname, sizeof(hostname)-1);
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
WiFi.setHostname(hostname);
|
||||
#else
|
||||
WiFi.hostname(hostname);
|
||||
#endif
|
||||
//syncToggleReceive = request->hasArg(F("ST"));
|
||||
simplifiedUI = request->hasArg(F("SU"));
|
||||
DEBUG_PRINTLN(F("Enumerating ledmaps"));
|
||||
enumerateLedmaps();
|
||||
|
@ -114,33 +114,6 @@ size_t printSetClassElementHTML(Print& settingsScript, const char* key, const in
|
||||
}
|
||||
|
||||
|
||||
// prepare a unique hostname based on the last 6 digits of the MAC address
|
||||
// if no mDNS name or serverDescription is set, otherwise use cmDNS or serverDescription
|
||||
// the hostname will be at most 24 characters long, starting with "wled-"
|
||||
// and containing only alphanumeric characters and hyphens
|
||||
// the hostname will not end with a hyphen and will be null-terminated
|
||||
void prepareHostname(char* hostname, size_t maxLen)
|
||||
{
|
||||
// create a unique hostname based on the last 6 digits of the MAC address if no mDNS name or serverDescription is set
|
||||
sprintf_P(hostname, PSTR("wled-%*s"), 6, escapedMac.c_str() + 6);
|
||||
const char *pC = cmDNS; // use cmDNS as hostname if set
|
||||
if (strlen(pC) == 0) pC = serverDescription; // else use serverDescription
|
||||
unsigned pos = 5; // keep "wled-" from unique name
|
||||
while (*pC && pos < maxLen) { // while !null and not over length
|
||||
if (isalnum(*pC)) { // if the current char is alpha-numeric append it to the hostname
|
||||
hostname[pos++] = *pC;
|
||||
} else if (*pC == ' ' || *pC == '_' || *pC == '-' || *pC == '+' || *pC == '!' || *pC == '?' || *pC == '*') {
|
||||
hostname[pos++] = '-';
|
||||
}
|
||||
// else do nothing - no leading hyphens and do not include hyphens for all other characters.
|
||||
pC++;
|
||||
}
|
||||
// last character must not be hyphen
|
||||
while (pos > 4 && hostname[pos-1] == '-') pos--;
|
||||
hostname[pos] = '\0'; // terminate string (leave at least "wled")
|
||||
}
|
||||
|
||||
|
||||
bool isAsterisksOnly(const char* str, byte maxLen)
|
||||
{
|
||||
for (unsigned i = 0; i < maxLen; i++) {
|
||||
|
@ -138,7 +138,7 @@ void WLED::loop()
|
||||
|
||||
yield();
|
||||
#ifdef ESP8266
|
||||
MDNS.update();
|
||||
if (mDNSenabled) MDNS.update();
|
||||
#endif
|
||||
|
||||
//millis() rolls over every 50 days
|
||||
@ -419,6 +419,8 @@ void WLED::setup()
|
||||
escapedMac.replace(":", "");
|
||||
escapedMac.toLowerCase();
|
||||
|
||||
// generate host name if no compile time default is set
|
||||
if (strcmp(hostName, DEFAULT_MDNS_NAME) == 0) sprintf_P(hostName, PSTR("wled-%.*s"), 6, escapedMac.c_str() + 6);
|
||||
WLED_SET_AP_SSID(); // otherwise it is empty on first boot until config is saved
|
||||
multiWiFi.push_back(WiFiConfig(CLIENT_SSID,CLIENT_PASS)); // initialise vector with default WiFi
|
||||
|
||||
@ -486,8 +488,7 @@ void WLED::setup()
|
||||
WLED::instance().enableWatchdog();
|
||||
#endif
|
||||
});
|
||||
if (strlen(cmDNS) > 0)
|
||||
ArduinoOTA.setHostname(cmDNS);
|
||||
ArduinoOTA.setHostname(hostName);
|
||||
}
|
||||
#endif
|
||||
#ifdef WLED_ENABLE_DMX
|
||||
@ -652,22 +653,8 @@ void WLED::initConnection()
|
||||
|
||||
if (WLED_WIFI_CONFIGURED) {
|
||||
showWelcomePage = false;
|
||||
|
||||
DEBUG_PRINTF_P(PSTR("Connecting to %s...\n"), multiWiFi[selectedWiFi].clientSSID);
|
||||
|
||||
// convert the "serverDescription" into a valid DNS hostname (alphanumeric)
|
||||
char hostname[25];
|
||||
prepareHostname(hostname);
|
||||
WiFi.begin(multiWiFi[selectedWiFi].clientSSID, multiWiFi[selectedWiFi].clientPass); // no harm if called multiple times
|
||||
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
WiFi.setTxPower(wifi_power_t(txPower));
|
||||
WiFi.setSleep(!noWifiSleep);
|
||||
WiFi.setHostname(hostname);
|
||||
#else
|
||||
wifi_set_sleep_type((noWifiSleep) ? NONE_SLEEP_T : MODEM_SLEEP_T);
|
||||
WiFi.hostname(hostname);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef WLED_DISABLE_ESPNOW
|
||||
@ -715,11 +702,11 @@ void WLED::initInterfaces()
|
||||
#endif
|
||||
|
||||
// Set up mDNS responder:
|
||||
if (strlen(cmDNS) > 0) {
|
||||
if (mDNSenabled) {
|
||||
// "end" must be called before "begin" is called a 2nd time
|
||||
// see https://github.com/esp8266/Arduino/issues/7213
|
||||
MDNS.end();
|
||||
MDNS.begin(cmDNS);
|
||||
MDNS.begin(hostName);
|
||||
|
||||
DEBUG_PRINTLN(F("mDNS started"));
|
||||
MDNS.addService("http", "tcp", 80);
|
||||
|
@ -336,7 +336,8 @@ WLED_GLOBAL char ntpServerName[33] _INIT("0.wled.pool.ntp.org"); // NTP server
|
||||
// WiFi CONFIG (all these can be changed via web UI, no need to set them here)
|
||||
WLED_GLOBAL std::vector<WiFiConfig> multiWiFi;
|
||||
WLED_GLOBAL IPAddress dnsAddress _INIT_N((( 8, 8, 8, 8))); // Google's DNS
|
||||
WLED_GLOBAL char cmDNS[33] _INIT(MDNS_NAME); // mDNS address (*.local, replaced by wledXXXXXX if default is used)
|
||||
WLED_GLOBAL char hostName[33] _INIT(MDNS_NAME); // mDNS address (*.local, replaced by wled-XXXXXX if default is used)
|
||||
WLED_GLOBAL bool mDNSenabled _INIT(true); // use mDNS (default is true, can be changed in web UI)
|
||||
WLED_GLOBAL char apSSID[33] _INIT(""); // AP off by default (unless setup)
|
||||
#ifdef WLED_SAVE_RAM
|
||||
typedef class WiFiOptions {
|
||||
|
@ -232,7 +232,7 @@ static bool captivePortal(AsyncWebServerRequest *request)
|
||||
if (!request->hasHeader(F("Host"))) return false;
|
||||
|
||||
String hostH = request->getHeader(F("Host"))->value();
|
||||
if (!isIp(hostH) && hostH.indexOf(F("wled.me")) < 0 && hostH.indexOf(cmDNS) < 0 && hostH.indexOf(':') < 0) {
|
||||
if (!isIp(hostH) && hostH.indexOf(F("wled.me")) < 0 && hostH.indexOf(hostName) < 0 && hostH.indexOf(':') < 0) {
|
||||
DEBUG_PRINTLN(F("Captive portal"));
|
||||
AsyncWebServerResponse *response = request->beginResponse(302);
|
||||
response->addHeader(F("Location"), F("http://4.3.2.1"));
|
||||
|
@ -172,6 +172,7 @@ void getSettingsJS(byte subPage, Print& settingsScript)
|
||||
if (subPage == SUBPAGE_WIFI)
|
||||
{
|
||||
size_t l;
|
||||
char s[32];
|
||||
settingsScript.printf_P(PSTR("resetWiFi(%d);"), WLED_MAX_WIFI_COUNT);
|
||||
for (size_t n = 0; n < multiWiFi.size(); n++) {
|
||||
l = strlen(multiWiFi[n].clientPass);
|
||||
@ -194,7 +195,8 @@ void getSettingsJS(byte subPage, Print& settingsScript)
|
||||
printSetFormValue(settingsScript,PSTR("D2"),dnsAddress[2]);
|
||||
printSetFormValue(settingsScript,PSTR("D3"),dnsAddress[3]);
|
||||
|
||||
printSetFormValue(settingsScript,PSTR("CM"),cmDNS);
|
||||
printSetFormValue(settingsScript,PSTR("CM"),hostName);
|
||||
printSetFormCheckbox(settingsScript,PSTR("MD"),mDNSenabled);
|
||||
printSetFormIndex(settingsScript,PSTR("AB"),apBehavior);
|
||||
printSetFormValue(settingsScript,PSTR("AS"),apSSID);
|
||||
printSetFormCheckbox(settingsScript,PSTR("AH"),apHide);
|
||||
@ -235,7 +237,6 @@ void getSettingsJS(byte subPage, Print& settingsScript)
|
||||
|
||||
if (Network.isConnected()) //is connected
|
||||
{
|
||||
char s[32];
|
||||
IPAddress localIP = Network.localIP();
|
||||
sprintf(s, "%d.%d.%d.%d", localIP[0], localIP[1], localIP[2], localIP[3]);
|
||||
|
||||
@ -248,14 +249,14 @@ void getSettingsJS(byte subPage, Print& settingsScript)
|
||||
printSetClassElementHTML(settingsScript,PSTR("sip"),0,(char*)F("Not connected"));
|
||||
}
|
||||
|
||||
if (WiFi.softAPIP()[0] != 0) //is active
|
||||
if (apActive && WiFi.softAPIP()[0] != 0) //is active
|
||||
{
|
||||
char s[16];
|
||||
IPAddress apIP = WiFi.softAPIP();
|
||||
sprintf(s, "%d.%d.%d.%d", apIP[0], apIP[1], apIP[2], apIP[3]);
|
||||
snprintf(s, sizeof(s)-1, "%d.%d.%d.%d", apIP[0], apIP[1], apIP[2], apIP[3]);
|
||||
printSetClassElementHTML(settingsScript,PSTR("sip"),1,s);
|
||||
} else
|
||||
{
|
||||
// WiFi.softAPmacAddress() for AP MAC address
|
||||
printSetClassElementHTML(settingsScript,PSTR("sip"),1,(char*)F("Not active"));
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user