Thanks, im using the NodeMCUv3 - ESP8266 with arduino/platformio and want to compile following code:
#if LWIP_FEATURES && !LWIP_IPV6
#define HAVE_NETDUMP 0
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <lwip/napt.h>
#include <lwip/dns.h>
#include <LwipDhcpServer.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define NAPT 1000
#define NAPT_PORT 10
const char* espHostname = "blackzspot";
#if HAVE_NETDUMP
#include <NetDump.h>
void dump(int netif_idx, const char* data, size_t len, int out, int success) {
(void)success;
Serial.print(out ? F("out ") : F(" in "));
Serial.printf("%d ", netif_idx);
// optional filter example: if (netDump_is_ARP(data))
{
netDump(Serial, data, len);
//netDumpHex(Serial, data, len);
}
}
#endif
// MY FUNCTIONS
bool testwifi() {
Serial.printf("\nConsole<>> Testing connection with '%s'\n", WiFi.SSID().c_str());
int count = 0;
digitalWrite(LED_BUILTIN,LOW);
while (count < 20) {
if (WiFi.status() == WL_CONNECTED) {
Serial.printf("\nConsole<>> WiFi Connected! \nSTA: %s (dns: %s / %s)\n\n",
WiFi.localIP().toString().c_str(),
WiFi.dnsIP(0).toString().c_str(),
WiFi.dnsIP(1).toString().c_str());
// ip4_addr_t dhcps_set_dns;
// IPAddress DNS servers to AP side
dhcpSoftAP.dhcps_set_dns(0, WiFi.dnsIP(0));
dhcpSoftAP.dhcps_set_dns(1, WiFi.dnsIP(1));
//auto& server = WiFi.softAPDhcpServer();
// server.setDns(WiFi.dnsIP(0));
digitalWrite(LED_BUILTIN,HIGH);
return true;
}
Serial.print(".");
delay(1000);
count++;
}
return false;
}
// SERVER
ESP8266WebServer server(80);
String content;
String networks[40];
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
<title>BlackLeakz-Repeater</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8">
<meta name="description" content="BlackLeakz-SOFTAP_STA">
<link rel="icon" href="data:,">
<style>
head{
background-color: #8F8F8F;
color: #FF0000;
}
body{
background-color: #8F8F8F;
color: #00ECFF;
}
html {font-family: Arial; display: inline-block; text-align: center;}
p {font-size: 3.0rem;}
body {max-width: 600px; margin:0px auto; padding-bottom: 25px;}
.switch {position: relative; display: inline-block; width: 120px; height: 68px}
.switch input {display: none}
.slider {position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; border-radius: 6px}
.slider:before {position: absolute; content: ""; height: 52px; width: 52px; left: 8px; bottom: 8px; background-color: #fff; -webkit-transition: .4s; transition: .4s; border-radius: 3px}
input:checked+.slider {background-color: #b30000}
input:checked+.slider:before {-webkit-transform: translateX(52px); -ms-transform: translateX(52px); transform: translateX(52px)}
</style>
</head>
<body>
<center><form action=\"/login\" method=\"POST\"><input type=\"text\" name=\"username\" placeholder=\"Username\"></center></br>
<center><input type=\"password\" name=\"password\" placeholder=\"Password\"></center></br>
<center><input type=\"submit\" value=\"Login\"></form></center>
<center><p>Try 'John Doe' and 'password123' ...</p></center>
<center><h2>BlackLeakz-Repeater</h2></center>
<center><p1>Repeater-Configuration </p1></center><center><a class=\"button button-on\" href="/repeater">Settings</a></center>
<center><p2>OTA-Update</p2></center><center><a class=\"button button-on\" href="/update">Update</a></center>
<center><p3>Scan for WiFi</p3></center><center><a class=\"button button-on\" href="/scan">Scan</a></center>
</body>
</html>
)rawliteral";
const char style[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML>
<html>
<style>
head{
background-color: #8F8F8F;
color: #FF0000;
}
body{
background-color: #8F8F8F;
color: #00ECFF;
}
</style>
</html>
)rawliteral";
void handleLogin() { // If a POST request is made to URI /login
if( ! server.hasArg("username") || ! server.hasArg("password")
|| server.arg("username") == NULL || server.arg("password") == NULL) { // If the POST request doesn't have username and password data
server.send(400, "text/plain", "400: Invalid Request"); // The request is invalid, so send HTTP status 400
return;
}
if(server.arg("username") == "blackleakz" && server.arg("password") == "x3pc09") { // If both the username and the password are correct
server.send(200, "text/html", "<h1>Welcome, " + server.arg("username") + "!</h1><p>Login successful</p>");
} else { // Username and password don't match
server.send(401, "text/plain", "401: Unauthorized");
}
}
void serverconfig() {
server.begin();
int n = WiFi.scanNetworks();
content = "<!DOCTYPE html><html lang='en'><meta name='viewport' content='width=device-width, initial-scale=1.0'>";
content += "<style>head{ background-color: #8F8F8F; color: #FF0000; } body{ background-color: #8F8F8F; color: #00ECFF; }</style>";
content += "<head><title>ESP8266 Configuration Page</title></head>";
content += "<body>";
if (WiFi.status() != WL_CONNECTED) {
content += "<center><div>currently not connected</div></center>";
}
else {
content += "<center><div>connected to: ";
content += WiFi.SSID();
content += " IP: ";
content += WiFi.localIP().toString();
content += "</div></center>";
}
content += "<center><div>";
if (n == 0) {
content += "<center><h1>No wireless networks found</h1></center>";
}
else {
content += "<center><h1>Wireless Station Settings</h1></center>";
content += "<center><form method='post'>";
for (int i = 0; i < n; ++i) {
networks[i] = WiFi.SSID(i);
content += "<center><div>";
content += "<center><input type=\"radio\" id=\"";
content += String(i);
content += "\" ";
content += "name=\"SSIDs\" value=\"";
content += String(i);
content += "\"></center>";
content += "<center><label for=\"";
content += String(i);
content += "\"";
content += ">";
content += String(i + 1);
content += ": ";
content += WiFi.SSID(i);
content += " (";
content += String(WiFi.RSSI(i));
content += ")";
content += (WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*";
content += "</label></center>";
content += "</div></center>";
delay(10);
}
content += "<center><label>Password:</label></center><br><center><input type='password' placeholder='********' name='stapsk' minlength=8 maxlength=63></center><br><center><small>Must be at least 8 characters or blank!</small></center><br><br>";
content += "<center><button type='submit' formaction='stasettings'>Save Permanently</button></center><center><button type='submit' formaction='tempstasettings'>Save Temporarily (Until Reboot)</button></center>";
content += "</form></center>";
content += "<center><h1>Wireless Access Point Settings</h1></center>";
content += "<center><form method='post'>";
content += "<center><label>SSID:</label></center><br><input name='apssid' placeholder='";
content += WiFi.softAPSSID();
content += "' length=32><br>";
content += "<center><label>Password:</label></center><br><center><input type='password' placeholder='";
content += WiFi.softAPPSK();
content += "' name='appsk' minlength=8 maxlength=63></center><br><center><small>Must be at least 8 characters or blank!</small></center><br><br>";
content += "<center><button type='submit' formaction='apsettings'>Save Permanently</button></center><center><button type='submit' formaction='tempapsettings'>Save Temporarily (Until Reboot)</button></center>";
content += "</form></center>";
}
content += "<center><h1>Miscellaneous</h1></center>";
content += "<center><form method='get' action='reboot'><input type='submit' value='Reboot'></form></center>";
content += "<div>";
server.on("/", []() {
server.send(200, "text/html", index_html);
});
server.on("/login", HTTP_POST, handleLogin);
server.on("/repeater", []() {
server.send(200, "text/html", content);
});
server.onNotFound([]() {
server.send(404, "text/plain", "How the heck did you get here?");
});
server.on("/scan", []() {
int n = WiFi.scanNetworks();
String msg;
for (int i = 0; i < n; ++i) {
networks[i] = WiFi.SSID(i);
msg += "<center><div>";
msg += "<input type=\"radio\" id=\"";
msg += String(i);
msg += "\" ";
msg += "name=\"SSIDs\" value=\"";
msg += String(i);
msg += "\">";
msg += "<label for=\"";
msg += String(i);
msg += "\"";
msg += ">";
msg += String(i + 1);
msg += ": ";
msg += WiFi.SSID(i);
msg += " (";
msg += String(WiFi.RSSI(i));
msg += ")";
msg += (WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*";
msg += "</label>";
msg += "</div>";
delay(10);
}
server.send(200, "text/html", msg);
});
server.on("/stasettings", []() {
String temp = server.arg("SSIDs");
int number = temp.toInt();
String stassid = networks[number];
String stapsk = server.arg("stapsk");
if (stassid.length() > 0) {
server.send(200, "text/plain", "Settings Recieved");
Serial.printf("\n\nConsole<>> Attempting to connect to '%s' using password '%s' \n", stassid.c_str(), stapsk.c_str());
display.clearDisplay();
display.setCursor(0,0);
display.println("Trying to connect to: ");
display.display();
display.setCursor(0,10);
display.display();
display.setCursor(0,20);
display.display();
WiFi.persistent(true);
WiFi.begin(stassid, stapsk);
testwifi();
}
});
server.on("/tempstasettings", []() {
String temp = server.arg("SSIDs");
int number = temp.toInt();
String stassid = networks[number];
String stapsk = server.arg("stapsk");
if (stassid.length() > 0) {
server.send(200, "text/plain", "Settings Recieved");
Serial.printf("\n\nConsole<>> Attempting to connect to '%s' using password '%s' \n", stassid.c_str(), stapsk.c_str());
display.clearDisplay();
display.setCursor(0,0);
display.println("Connecting to: ");
display.display();
display.setCursor(0,10);
display.println(stassid);
display.display();
display.setCursor(0,20);
display.println(stapsk);
display.display();
WiFi.persistent(false);
WiFi.begin(stassid, stapsk);
testwifi();
}
});
server.on("/apsettings", []() {
String apssid = server.arg("apssid");
String appsk = server.arg("appsk");
if (apssid.length() > 0) {
server.send(200, "text/plain", "Settings Recieved");
Serial.printf("\n\nConsole<>> Setting AP Credentials \nSSID: %s \nPassword: %s \n", apssid.c_str(), appsk.c_str());
display.clearDisplay();
display.setCursor(0,0);
display.println("Settings recived.");
display.display();
display.setCursor(0,10);
display.println("Permanent AP:");
display.display();
display.setCursor(0,20);
display.display();
display.setCursor(0,30);
display.display();
WiFi.persistent(true);
WiFi.softAP(apssid, appsk);
}
});
server.on("/tempapsettings", []() {
String apssid = server.arg("apssid");
String appsk = server.arg("appsk");
if (apssid.length() > 0) {
server.send(200, "text/plain", "Settings Recieved");
Serial.printf("\n\nConsole<>> Setting Temporary AP Credentials \nSSID: %s \nPassword: %s \n", apssid.c_str(), appsk.c_str());
display.clearDisplay();
display.setCursor(0,0);
display.println("Settings recived.");
display.display();
display.setCursor(0,10);
display.println("Temporary AP:");
display.display();
display.setCursor(0,20);
display.println(apssid.c_str());
display.display();
display.setCursor(0,30);
display.println(appsk.c_str());
display.display();
WiFi.persistent(false);
WiFi.softAP(apssid, appsk);
}
});
server.on("/reboot", []() {
server.send(200, "text/plain", "Rebooting now...");
delay(5000);
ESP.reset();
});
}
void setup() {
Serial.begin(115200);
Serial.println("Console<>> Console started.");
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
digitalWrite(LED_BUILTIN, HIGH);
delay(1500);
digitalWrite(LED_BUILTIN, LOW);
Serial.println("Console<>> Initialize display.");
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.display();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.println("Console<>>");
display.display();
display.setCursor(0,10);
display.println("Started.");
display.display();
delay(3000);
display.clearDisplay();
delay(1000);
Serial.printf("\n\nConsole<>> NAPT Range extender\n");
Serial.printf("Console<>> Heap on start: %d\n", ESP.getFreeHeap());
#if HAVE_NETDUMP
phy_capture = dump;
#endif
WiFi.setPhyMode(WIFI_PHY_MODE_11N); // Set radio type to N
WiFi.mode(WIFI_AP_STA);
WiFi.persistent(false);
WiFi.begin(); // Use stored credentials to connect to network
testwifi();
WiFi.softAPConfig( // Set IP Address, Gateway and Subnet
IPAddress(192, 168, 4, 1),
IPAddress(192, 168, 4, 1),
IPAddress(255, 255, 255, 0));
WiFi.softAP(WiFi.softAPSSID(), WiFi.softAPPSK()); // Use stored credentials to create AP
Serial.println("Console<>> SSID: " + WiFi.softAPSSID() + "\n\nPASSPHRASE: " + WiFi.softAPPSK());
display.setCursor(0,0);
display.println("SSID:");
display.display();
display.setCursor(0,10);
display.println(WiFi.softAPSSID());
display.display();
display.setCursor(0,20);
display.println("KEY:");
display.display();
display.setCursor(0,30);
display.println(WiFi.softAPPSK());
display.display();
delay(4000);
display.clearDisplay();
display.setCursor(0,0);
display.println("IP:");
display.display();
display.setCursor(0,10);
display.println(WiFi.localIP());
display.display();
ArduinoOTA.onStart([]() {
Serial.println("Start");
});
ArduinoOTA.onEnd([]() {
Serial.println("\nEnd");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
else if (error == OTA_END_ERROR) Serial.println("End Failed");
});
ArduinoOTA.begin();
Serial.printf("Console<>> Heap before: %d\n", ESP.getFreeHeap());
err_t ret = ip_napt_init(NAPT, NAPT_PORT);
Serial.printf("Console<>> ip_napt_init(%d,%d): ret=%d (OK=%d)\n", NAPT, NAPT_PORT, (int)ret, (int)ERR_OK);
if (ret == ERR_OK) {
ret = ip_napt_enable_no(SOFTAP_IF, 1);
Serial.printf("ip_napt_enable_no(SOFTAP_IF): ret=%d (OK=%d)\n", (int)ret, (int)ERR_OK);
if (ret == ERR_OK) {
}
}
Serial.printf("Console<>> Heap after napt init: %d\n", ESP.getFreeHeap());
if (ret != ERR_OK) {
Serial.printf("Console<>> NAPT initialization failed\n");
}
serverconfig();
}
#else
void setup() {
Serial.begin(115200);
Serial.printf("\n\nConsole<>> NAPT not supported in this configuration\n");
}
#endif
void loop() {
MDNS.update();
server.handleClient();
if (WiFi.status() != WL_CONNECTED) {
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
}
else {
digitalWrite(LED_BUILTIN, HIGH);
}
}
The Output is:
Compiling .pio\build\nodemcuv2\lib283\ESP8266WiFi\BearSSLHelpers.cpp.o
src\main.cpp: In function 'bool testwifi()':
src\main.cpp:70:9: error: 'dhcpSoftAP' was not declared in this scope
70 | dhcpSoftAP.dhcps_set_dns(0, WiFi.dnsIP(0));
| ^~~~~~~~~~
Archiving .pio\build\nodemcuv2\lib1bc\libAdafruit GFX Library.a
Compiling .pio\build\nodemcuv2\lib283\ESP8266WiFi\CertStoreBearSSL.cpp.o
*** [.pio\build\nodemcuv2\src\main.cpp.o] Error 1
=================================================================== [FAILED] Took 9.09 seconds ===================================================================
[{
"resource": "/c:/Users/bluel/OneDrive/.backup/unsorted/Dokumente/PlatformIO/Projects/NodeMCUv3-esp8266-WiFi-Repeater.v0.3a/src/main.cpp",
"owner": "cpp",
"severity": 8,
"message": "'dhcpSoftAP' was not declared in this scope",
"startLineNumber": 70,
"startColumn": 9,
"endLineNumber": 70,
"endColumn": 9
}]
I dont know why but on my Desktop-PC it works without any error by using the same ide. Could the c++/gcc compiler plays a role?
This code needs to be declared:
dhcpSoftAP.dhcps_set_dns(0, WiFi.dnsIP(0));
dhcpSoftAP.dhcps_set_dns(1, WiFi.dnsIP(1));
on my Laptop-fresh installed Arduino-IDE 1.8.5 & 2.0, PlatformIO and Web IDE by arduino.cc, i get always in all ways the same declaration-error of this fucin declaration of the Soft_AP's dhcps, dns setting. Only my old Desktop-PC, which really uses the same Arduino IDE, compiles the code without an error by this declaration.
Thanks in advance for possible solutions near the reality, kiddin myself always rofl.