Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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
C++ 在WIFI\u AP\u STA中设置AP和STA之间的路由_C++_Esp8266 - Fatal编程技术网

C++ 在WIFI\u AP\u STA中设置AP和STA之间的路由

C++ 在WIFI\u AP\u STA中设置AP和STA之间的路由,c++,esp8266,C++,Esp8266,我正在尝试在我的节点MCU中设置ESP8266的AP和STA之间的路由或某些接口。我正在尝试在NAT模式下设置Wifi中继器。这是我写的代码 #include <ESP8266WiFi.h> #include <ESP8266mDNS.h> const char* ssid = "********"; const char* password = "********"; /* Settings for SSID to be forwarded*/

我正在尝试在我的节点MCU中设置ESP8266的AP和STA之间的路由或某些接口。我正在尝试在NAT模式下设置Wifi中继器。这是我写的代码

  #include <ESP8266WiFi.h>
  #include <ESP8266mDNS.h>
  const char* ssid = "********";
  const char* password = "********";

  /* Settings for SSID to be forwarded*/

  IPAddress staticIP(192,168,1,113);
  IPAddress gateway(192,168,1,1);
  IPAddress subnet(255,255,255,0);

  MDNSResponder mdns;
  WiFiServer server(80);


  int i=0;

  void setup(void)
  {
    Serial.begin(115200);
    Serial.println();
    WiFi.mode(WIFI_AP_STA);
    /*Station Mode Configuration*/
    Serial.printf("Connecting to %s\n", ssid);
    WiFi.begin(ssid, password);
    WiFi.config(staticIP, gateway, subnet);
    while (WiFi.status() != WL_CONNECTED)
    {
      delay(500);
      Serial.print(".");
    }
    Serial.println();
    Serial.print("Connected, IP address: ");
    Serial.println(WiFi.localIP());
    Serial.print("MAC Address: ");
    Serial.println(WiFi.macAddress());
    Serial.print("Gateway IP: ");
    Serial.println(WiFi.gatewayIP());
    Serial.print("DNS Server: ");
    Serial.println(WiFi.dnsIP());

    /*SoftAP configuration */

    //Serial.print("Setting soft-AP configuration ... ");
    //Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!");
    Serial.println();
    Serial.println("!!!!!!!!!!!!!!!!!!!!!");
    Serial.println();
    Serial.print("Setting soft-AP ... ");
    Serial.println(WiFi.softAP("ESPsoftAP_01") ? "Ready" : "Failed!");

    Serial.print("Soft-AP IP address = ");
    Serial.println(WiFi.softAPIP());
  }

  void loop()
  {
    int j = WiFi.softAPgetStationNum();
    if(j != i)
    {
      Serial.printf("Stations connected to soft-AP = %d\n", WiFi.softAPgetStationNum());
      i = j;
    }


/* Checks for the requests from the ESP clients and prints them on the serial monitor. */
    mdns.update();   // Check for any mDNS queries and send responses

    WiFiClient client = server.available();  // Check if a client has connected
    if (client)
    {
      Serial.println("");
    Serial.println("New client");
    Serial.println("Checkpoint 0");

    // Wait for data from client to become available
    while (client.connected() && !client.available())
    {
      delay(1);
    }
    Serial.println("Checkpoint 1");
    // Read the first line of HTTP request
    String req = client.readStringUntil('\r');
    Serial.println(req);
    }
  }
客户端正在连接。为什么会这样

输出:

 Connecting to ********
 .......
 Connected, IP address: 192.168.1.113
 MAC Address: **:**:**:**:**:**
 Gateway IP: 192.168.1.1
 DNS Server: 0.0.0.0

 !!!!!!!!!!!!!!!!!!!!!

 Setting soft-AP ... Ready
 Soft-AP IP address = 192.168.4.1
 Stations connected to soft-AP = 1

这是个好主意,但ESP8266上的网络堆栈无法路由数据包或执行NAT

您编写的代码试图充当代理,而不是路由器

路由器在网络接口之间复制IP数据包——它能够路由所有在IP上运行的协议。NAT重写某些数据包的IP地址,以隐藏正在进行NAT的网络。ESP8266网络堆栈无法执行此操作

您的代码正在端口80(web端口)上创建基于TCP的服务器。它将只能将TCP数据包代理到端口80-它将无法代理名称服务器请求或任何其他协议

代理比你想象的要复杂得多。HTTP需要添加代理头。代理加密连接也更复杂,需要在端口443上侦听。客户机必须配置为知道连接到代理服务器,代理服务器必须能够检查原始请求,以便知道连接到何处

ESP8266网络堆栈只能同时进行5个TCP连接。如果原始连接来自web浏览器,web浏览器通常一次打开5个以上的连接,因为web页面通常从多个位置导入CSS、Javascript和图像。请记住,每个代理连接都需要一个传出连接,因此代理2个TCP连接将使用5个可用连接中的4个。5个同时连接的限制意味着ESP8266将无法成功充当web浏览器的代理

Wifi客户端和TCP客户端之间存在差异。我希望Arduino和ESP8266 SDK在这里的命名更加清晰
WiFiServer
实际上与WiFi无关——它是一个TCP服务器

您在此处未看到连接“检查点0”,因为无论您尝试路由/代理的是什么,都不知道如何打开到ESP8266的TCP连接(假设它甚至尝试使用TCP)


这是一次很好的尝试,但不幸的是,ESP8266不适合这种用途。

感谢您的简要解释。我能考虑你的观点。但是,Github上有一个项目能够执行相同的操作。它的源代码没有公开(讽刺的是)。请看这个链接。该项目不使用Arduino SDK。它似乎包含自己的网络堆栈(二进制而非源代码)。如果您想在网络堆栈上写,是的,您可以路由数据包并进行NAT。不幸的是,Arduino SDK并没有让你这么做。你知道市场上有什么板或网络堆栈可以用来完成我的任务吗?我只需要一个Raspberry Pi Zero W.$10,运行真正的Linux,这样就很容易构建路由器、NAT、防火墙,等等。我不是100%确定它可以同时作为AP和站点运行,所以它可能需要额外的USB wifi接口。
 Connecting to ********
 .......
 Connected, IP address: 192.168.1.113
 MAC Address: **:**:**:**:**:**
 Gateway IP: 192.168.1.1
 DNS Server: 0.0.0.0

 !!!!!!!!!!!!!!!!!!!!!

 Setting soft-AP ... Ready
 Soft-AP IP address = 192.168.4.1
 Stations connected to soft-AP = 1