在WIFI_AP_STA中设置AP和STA之间的路由

时间:2018-07-27 11:40:43

标签: c++ esp8266

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

DROP PROCEDURE IF EXISTS products;

DELIMITER $$

CREATE PROCEDURE products(
IN p_ProductName,
IN p_ProductType,
IN p_ProductLevel
)

BEGIN

   SELECT * FROM ProductTable WHERE ProductName LIKE '%p_ProductName%', ProductType LIKE '%p_ProductType%' , ProductLevel LIKE '%p_ProductLevel%';

END$$

我可以将ESP连接到我的Wifi,也可以将某些电台连接到ESP。但是不幸的是,我没有运气在ESP客户端和Internet之间传输请求和响应。

问题:在上一节中, #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); } } 没有得到打印,这意味着客户返回的是false。但是根据这一部分

checkpoint 0

客户端正在建立连接。为什么会这样?

输出:

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

代理比您想象的要复杂得多。 HTTP需要添加代理标头。代理加密连接也更加复杂,并且需要侦听端口443。并且必须将客户端配置为知道要连接到代理服务器,代理服务器必须能够检查原始请求才能知道连接到哪里。 / p>

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

Wifi客户端和TCP客户端之间有区别。我希望Arduino和ESP8266 SDK在这里的命名更加清晰。 SQL> CREATE OR REPLACE TYPE "AsT" AS VARRAY(255) OF varchar2(100); 2 / Type created SQL> CREATE OR REPLACE PACKAGE ABC IS 2 FUNCTION F_PRODUCT_NAME(P_ATTRIBUTE_UA_NAME IN PRODUCT.Attribute_Ua_Name%TYPE) RETURN AST; 3 END ABC; 4 / Warning: Package created with compilation errors SQL> show err; Errors for PACKAGE MYSCHEMA.ABC: LINE/COL ERROR -------- -------------------------------------------- 2/89 PLS-00201: identifier 'AST' must be declared 2/3 PL/SQL: Declaration ignored SQL> CREATE OR REPLACE TYPE "AST" AS VARRAY(255) OF varchar2(100); 2 / Type created SQL> CREATE OR REPLACE PACKAGE ABC IS 2 FUNCTION F_PRODUCT_NAME(P_ATTRIBUTE_UA_NAME IN PRODUCT.Attribute_Ua_Name%TYPE) RETURN AST; 3 END ABC; 4 / Package created 实际上与WiFi无关-它是TCP服务器。

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

这是一个不错的尝试,但不幸的是ESP8266不适合这种用途。