Arduino ESP8266-AP+;STA模式工作不正常
我正在尝试使用ESP8266 ESP-12同时作为接入点和站点,在这两种情况下提供相同的网页。 这就是我所拥有的:Arduino ESP8266-AP+;STA模式工作不正常,arduino,wifi,esp8266,Arduino,Wifi,Esp8266,我正在尝试使用ESP8266 ESP-12同时作为接入点和站点,在这两种情况下提供相同的网页。 这就是我所拥有的: #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #include <ESP8266mDNS.h> #include <EEPROM.h> #include <DNSServer.h> #include
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <EEPROM.h>
#include <DNSServer.h>
#include <ESP.h>
const byte DNS_PORT = 53;
DNSServer dnsServer;
MDNSResponder mdns;
ESP8266WebServer server(80);
String ssid = "";
String password = "";
String webPage = "";
void setup(void){
IPAddress Ip(192, 168, 1, 1);
IPAddress NMask(255, 255, 255, 0);
WiFi.softAPConfig(Ip, Ip, NMask);
WiFi.softAP(conf_ssid.c_str());
WiFi.mode(WIFI_AP_STA);
Serial.begin(115200);
delay(1000);
Serial.println("");
Serial.println("Soft AP Started");
Serial.println("");
/* Setup the DNS server redirecting all the domains to the Ip */
dnsServer.setErrorReplyCode(DNSReplyCode::NoError);
dnsServer.start(DNS_PORT, "www.example.com", Ip);
//connectToWifi();
getCredentials(); //Reads Home WiFi credentials from the EEPROM
if (ssid != "" and password != ""){
WiFi.begin(ssid.c_str(), password.c_str());
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
WiFi.mode(WIFI_AP_STA);
}
server.begin();
// When no password is present
if ((ssid == "" and password == "") or (ssid == "Error")){
// ****** MAIN PAGE ******
server.on("/", [](){ /* HANDLES CREDENTIAL INPUT */ });
server.begin();
}
else // If we have ssid and password -- check if we have connection
{
webPage += "<h1>Main Webpage</h1>";
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
server.begin();
//if (mdns.begin("esp8266", WiFi.localIP())) {
// Serial.println("MDNS responder started");
//}
server.on("/", [](){
server.send(200, "text/html", webPage);
});
Serial.println("HTTP server started");
}
}
void loop(void){
dnsServer.processNextRequest();
server.handleClient();
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
常量字节DNS_端口=53;
DNSServer DNSServer;
mdnsrresponder-mdns;
ESP8266Web服务器(80);
字符串ssid=“”;
字符串密码=”;
字符串网页=”;
作废设置(作废){
Ip地址Ip(192、168、1、1);
IP地址NMask(255,255,255,0);
WiFi.softAPConfig(Ip、Ip、NMask);
softAP(conf_ssid.c_str());
WiFi.模式(WiFi\u AP\u STA);
序列号开始(115200);
延迟(1000);
Serial.println(“”);
Serial.println(“软AP启动”);
Serial.println(“”);
/*设置DNS服务器,将所有域重定向到Ip*/
dnsServer.setErrorReplyCode(DNSReplyCode::NoError);
dnsServer.start(DNS_端口,“www.example.com”,Ip);
//connectToWifi();
getCredentials();//从EEPROM读取家庭WiFi凭据
如果(ssid!=“”和密码!=“”){
begin(ssid.c_str(),password.c_str());
while(WiFi.status()!=WL_已连接){
延迟(500);
连续打印(“.”);
}
WiFi.模式(WiFi\u AP\u STA);
}
server.begin();
//没有密码时
如果((ssid==“”和密码==“”)或(ssid==“错误”)){
//*******主页面******
在(“/”上,[](){/*处理凭证输入*/});
server.begin();
}
else//如果我们有ssid和密码——检查我们是否有连接
{
网页+=“主网页”;
Serial.println(“”);
串行打印(“连接到”);
序列号println(ssid);
串行打印(“IP地址:”);
Serial.println(WiFi.localIP());
server.begin();
//if(mdns.begin(“esp8266”,WiFi.localIP())){
//Serial.println(“MDNS响应程序已启动”);
//}
服务器。在(“/”,[](){
发送(200,“文本/html”,网页);
});
Serial.println(“HTTP服务器已启动”);
}
}
无效循环(无效){
dnsServer.processNextRequest();
server.handleClient();
}
基本上,它从EEPROM读取凭据,如果没有凭据,则显示WiFi配置页面,否则它还连接到为AP和站点的主网页提供服务的WiFi
问题是,即使我可以看到AP和从我的PC到WiFi站点Ip的ping,我也只能通过AP而不是站点连接才能访问该网页。
有什么想法吗
非常感谢。我找到了一个解决这个问题的方法,这个方法对我来说很有效。解决方案是创建两台服务器,一台使用站点IP,另一台使用AP IP。这里出现的问题是,当线路板打开时,AP会立即创建,但连接到站点需要时间。因此,当发出请求时,服务器不知道它必须同时为这两个IP提供服务 我已经准备好了LUA代码:
wifi.setmode(wifi.STATIONAP)
ap = {}
sta = {}
ap_ip = {}
conn_table = {}
ap.ssid = "Node-Mcu1"
ap.pwd = "123456789"
sta.ssid = "Home WIFI"
sta.pwd = "iforgotmypassword"
ap_ip.ip = "192.168.1.1"
ap_ip.netmask = "255.255.255.0"
ap_ip.gateway = "192.168.0.2"
wifi.sta.sethostname("ESP8266")
wifi.ap.setip(ap_ip)
wifi.ap.config(ap)
wifi.sta.config(sta)
wifi.sta.connect()
timer1 = tmr.create()
timer1:alarm(1000,tmr.ALARM_AUTO ,function()
conn_table = wifi.ap.getclient()
--[[ GET THE IF ADDRESSES OF ALL CONNECCTED MODULES
for mac,ip in pairs(conn_table) do
print(mac,ip)
end --]]
end
)
server1 = net.createServer(net.TCP,120)
server2 = net.createServer(net.TCP,120)
LEDpin = 2
gpio.mode(LEDpin, gpio.OUTPUT)
function SendHTML(sck, led) -- Send LED on/off HTML page
htmlstring = "<!DOCTYPE html>\r\n"
htmlstring = htmlstring.."<html>\r\n"
htmlstring = htmlstring.."<head>\r\n"
htmlstring = htmlstring.."<title>LED Control</title>\r\n"
htmlstring = htmlstring.."</head>\r\n"
htmlstring = htmlstring.."<body>\r\n"
htmlstring = htmlstring.."<h1>LED</h1>\r\n"
htmlstring = htmlstring.."<p>Click to switch LED on and off.</p>\r\n"
htmlstring = htmlstring.."<form method=\"get\">\r\n"
if (led) then
htmlstring = htmlstring.."<input type=\"button\" value=\"LED OFF\" onclick=\"window.location.href='/ledoff'\">\r\n"
else
htmlstring = htmlstring.."<input type=\"button\" value=\"LED ON\" onclick=\"window.location.href='/ledon'\">\r\n"
end
htmlstring = htmlstring.."</form>\r\n"
htmlstring = htmlstring.."</body>\r\n"
htmlstring = htmlstring.."</html>\r\n"
sck:send(htmlstring)
end
function receiver(sck, data)-- process callback on recive data from client
print(data)
if string.find(data, "GET /ledon") then
SendHTML(sck, true)
gpio.write(LEDpin, gpio.HIGH)
elseif string.find(data, "GET / ") or string.find(data, "GET /ledoff") then
SendHTML(sck, false)
gpio.write(LEDpin, gpio.LOW)
else
sck:send("<h2>Not found...!!</h2>")
sck:on("sent", function(conn) conn:close() end)
end
end
if server1 then
print(wifi.ap.getip())
server1:listen(80,wifi.ap.getip(), function(conn)-- listen to the port 80
conn:on("receive", receiver)
end)
end
timer = tmr.create()
timer:alarm(1000,tmr.ALARM_AUTO ,function()
if wifi.sta.getip() == nil then
print("Obtaining IP...")
else
timer:stop()
timer:unregister()
print("Got IP. "..wifi.sta.getip())
if server2 then
print("server2")
server2:listen(80,wifi.sta.getip(), function(conn)-- listen to the port 80
conn:on("receive", receiver)
end)
end
end
end
)
wifi.setmode(wifi.STATIONAP)
ap={}
sta={}
ap_ip={}
conn_表={}
ap.ssid=“节点-Mcu1”
ap.pwd=“123456789”
sta.ssid=“家庭WIFI”
sta.pwd=“iforgotmypassword”
ap_ip.ip=“192.168.1.1”
ap_ip.netmask=“255.255.255.0”
ap_ip.gateway=“192.168.0.2”
wifi.sta.sethostname(“ESP8266”)
wifi.ap.setip(ap_ip)
wifi.ap.config(ap)
wifi.sta.config(sta)
wifi.sta.connect()
timer1=tmr.create()
定时器1:报警(1000,tmr.alarm\u自动,功能()
conn_table=wifi.ap.getclient()
--[[获取所有连接模块的IF地址
对于mac,ip成对(连接表)执行
打印(mac、ip)
结束--]]
结束
)
server1=net.createServer(net.TCP,120)
server2=net.createServer(net.TCP,120)
LEDpin=2
gpio.mode(LED引脚,gpio.OUTPUT)
函数SendHTML(sck,led)——发送led打开/关闭HTML页面
htmlstring=“\r\n”
htmlstring=htmlstring..“\r\n”
htmlstring=htmlstring..“\r\n”
htmlstring=htmlstring..“LED控制\r\n”
htmlstring=htmlstring..“\r\n”
htmlstring=htmlstring..“\r\n”
htmlstring=htmlstring.“发光二极管\r\n”
htmlstring=htmlstring.“单击可打开和关闭LED。\r\n”
htmlstring=htmlstring..“\r\n”
如果(led)那么
htmlstring=htmlstring..“\r\n”
其他的
htmlstring=htmlstring..“\r\n”
结束
htmlstring=htmlstring..“\r\n”
htmlstring=htmlstring..“\r\n”
htmlstring=htmlstring..“\r\n”
sck:发送(htmlstring)
结束
函数接收器(sck,数据)——对来自客户端的接收数据进行回调
打印(数据)
如果是string.find(数据“GET/ledon”),那么
SendHTML(sck,true)
gpio.write(LED引脚,gpio.HIGH)
elseif string.find(数据,“GET/”)或string.find(数据,“GET/ledoff”)然后
SendHTML(sck,false)
gpio.write(LED引脚,gpio.LOW)
其他的
sck:发送(“未找到…!!”)
sck:on(“已发送”,函数(conn)conn:close()结束)
结束
结束
如果是服务器1,那么
打印(wifi.ap.getip())
server1:侦听(80,wifi.ap.getip(),函数(conn)--侦听端口80
接通(“接收”,接收器)
(完)
结束
timer=tmr.create()
定时器:报警(1000,tmr.alarm\u自动,功能()
如果wifi.sta.getip()==nil,则
打印(“获取IP…”)
其他的
计时器:停止()
计时器:取消注册()
打印(“获得IP”…wifi.sta.getip())
如果是服务器2,那么
打印(“服务器2”)
server2:侦听(80,wifi.sta.getip(),函数(conn)--侦听端口80
接通(“接收”,接收器)
(完)
结束
结束
结束
)
如果你注释掉dns内容,你能作为STA连接吗?如果我注释掉,什么都不会改变。我仍然可以作为STA连接,但网页不显示