Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino ESP8266-AP+;STA模式工作不正常_Arduino_Wifi_Esp8266 - Fatal编程技术网

Arduino ESP8266-AP+;STA模式工作不正常

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

我正在尝试使用ESP8266 ESP-12同时作为接入点和站点,在这两种情况下提供相同的网页。 这就是我所拥有的:

#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连接,但网页不显示