ESP8266 Web服务器可以处理多少个同时/连续的连接?

时间:2016-05-24 16:55:13

标签: websocket arduino webserver client-server esp8266

所以我使用 ESP8266WebServer ESP8266WiFiMulti 库来运行带有 websockets 的网页,我试图尝试弄清楚我可以拥有多少客户端连接,以及是否有任何方法可以增加连接限制?

现在似乎我可以从单独的IP 成功创建三个连接,然后在启动第四个连接时,它会失败(服务器不会在串行模型中崩溃,但第四个连接不会加载网页)。

我还注意到,如果我刷新自己的单数连接一定次数(不一致),它也将无法加载网页。我还没有能够解释这是否与连续连接数太多有关或者我是否通过尝试使服务器负担过重在一个很短的时间内重新连接?

总的来说,它似乎相当不稳定,我可以真正使用一些帮助来弄清楚原因。

这是我目前的代码:

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <WebSocketsServer.h>
#include <Hash.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

static const char ssid[] = "********";
static const char password[] = "********";
MDNSResponder mdns;

static void writeLED(bool);

ESP8266WiFiMulti WiFiMulti;

IPAddress ipAddressTest = (99,99,99,99);

ESP8266WebServer server(80);
WebSocketsServer webSocket = WebSocketsServer(81);

uint8_t pageHitCounter = 0;
IPAddress ipAddressOne = (99,99,99,99); 
IPAddress ipAddressTwo = (99,99,99,99); 
IPAddress ipAddressThree = (99,99,99,99); 
IPAddress ipAddressFour = (99,99,99,99); 

uint8_t rxBuff[256];
uint8_t som = 0x11; 
uint8_t eom = 0x12; 
uint8_t subsys; 
uint8_t receivedSubsys;
uint8_t rx_byte = 0x00;
uint8_t messageLength = 0;
uint8_t receivedMessageLength = 0;
uint8_t messageContent;
uint8_t serialCurrent; 

int initialCounter = 0;
boolean messageBegun = false; 
boolean messageInProgress = false;

int currNumRefresh = 0;
int currMicroC = 0;
int currMicroD = 0;
int currMicroE = 0;
int currPressureC = 0; 
int currPressureD = 0; 
int currPressureE = 0; 
int currValveStatusNumC = 0; 
int currValveStatusNumD = 0; 
int currValveStatusNumE = 0;
int currFluid = 0;

char statusbuf[256]; 
char status[] = "";
int statusIndex = 0;

String valveStatusC = "Closed";
String valveTubePropsC = "175px solid #00ADEF";
String valveColorC = "red";

String valveStatusD = "Closed";
String valveTubePropsD = "175px solid #00ADEF";
String valveColorD = "red";

String valveStatusE = "Closed";
String valveTubePropsE = "175px solid #00ADEF";
String valveColorE = "red";

uint8_t currCountdown = 0;
long prevTimeCountdown = 0; 
long countdownInterval = 1000; 
long countdownPostInterval = 100;
bool countdownFlag = true;

bool teensyPOWER = false;
bool pumpPOWER = false;
bool teensyLED = false;

void switchPOWERon() {

//Serial.println("TEST POWER ON");

int powerStatusLength = 1;

subsys = 0x10; 

//Account for the end of message
messageLength = powerStatusLength + 2;

messageContent = 1;

Serial.write(som);
Serial.write(messageLength);
Serial.write(subsys);
Serial.write(messageContent);
Serial.write(eom);
//Serial.println("");
//Serial.println("TURN POWER ON|");
//teensyLED = true;
} //end switchPOWERon

void switchPOWERoff() {
/*Very similar to switchPoweron(), removed for char space*/
} //end switchPOWERoff

void pumpPOWERon() {

//Serial.println("TEST POWER ON");

int pumpPowerStatusLength = 1;

subsys = 0x13; 

//Account for the end of message
messageLength = pumpPowerStatusLength + 2;

messageContent = 1;

Serial.write(som);
Serial.write(messageLength);
Serial.write(subsys);
Serial.write(messageContent);
Serial.write(eom);
//Serial.println("");
//Serial.println("TURN POWER ON|");
//teensyLED = true;
} //end switchPOWERon

void pumpPOWERoff() {

/*Very similar to pumpPoweron(), removed for char space*/
} //end switchPOWERoff

void switchLEDon() {

//Serial.println("TEST LED ON");

int ledStatusLength = 1;

subsys = 0x14; 

//Account for the end of message
messageLength = ledStatusLength + 2;

messageContent = 1;

Serial.write(som);
Serial.write(messageLength);
Serial.write(subsys);
Serial.write(messageContent);
Serial.write(eom);
//Serial.println("");
//Serial.println("TURN LED ON|");
//teensyLED = true;
} //end switchLEDon

void switchLEDoff() {

/*Very similar to switchLEDon(), removed for char space*/
} //end switchLEDoff

void statusUpdate(uint8_t num) {

//Valve C
if(currValveStatusNumC == 0)
{
    valveColorC = "red";
    valveTubePropsC = "175px solid #00ADEF";
    valveStatusC = "Closed";
} //end if
else if(currValveStatusNumC == 1)
{
    valveColorC = "green";
    valveTubePropsC = "350px solid #00ADEF"; 
    valveStatusC = "Open";
} //end else if

/*Valves D/E removed for char space, very similar to Valve C*/

String test = ""; 
test += currNumRefresh;
test += ",";
/*Preparing more variables to send to the webpage, removed for char space*/
test += ",";
test += ipAddressTest;

//Serial.print("TEST: ");
//Serial.println(ipAddressTest);

test.toCharArray(statusbuf, 256);
webSocket.sendTXT(num, statusbuf, strlen(statusbuf));
}

static const char PROGMEM INDEX_HTML[] = R"rawliteral(
<!DOCTYPE html> 
<html>
<head>
    <title>Adafruit HUZZAH ESP8266</title>

<style type='text/css'>   
/*CSS removed to fit maximum number of allowed characters*/
</style>
<script>

var currPressureTest = 0;
var currFluidTest = 0;                                               

function POWERswitch(){
var POWERswitchCheck = document.getElementById('switch1').checked;        

if(POWERswitchCheck){
    websock.send("teensyPOWERon");      
}
else if(!POWERswitchCheck) {
    websock.send("teensyPOWERoff");
}
}

function FLUSHbegin(){
websock.send("pumpPOWERon");            
}

function FLUSHend(){
websock.send("pumpPOWERoff");
}

function LEDswitch(){
var LEDswitchCheck = document.getElementById('myonoffswitch').checked;        

if(LEDswitchCheck){
    websock.send("teensyLEDon");      
}
else if(!LEDswitchCheck) {
    websock.send("teensyLEDoff");
}
}

var websock;
var test = "open";
var webpageHitCounter = 20; 

function start() {
websock = new WebSocket('ws://' + window.location.hostname + ':81/');
websock.onopen = function(evt) { 
    console.log('websock open'); 
    statusUpdate();
};
websock.onclose = function(evt) { 
    console.log('websock close'); 
};
websock.onerror = function(evt) { 
    console.log(evt); 
};
websock.onmessage = function(evt) {
    console.log(evt);
    var e = document.getElementById('ledstatus');
    var te = document.getElementById('myonoffswitch');
    var pe = document.getElementById('switch1');


    if(evt.data === 'teensyPOWERon')
    {
        pe.checked = 'checked';
    }
    else if(evt.data === 'teensyPOWERoff')
    {
        pe.checked = '';
    }
    else if(evt.data === 'pumpPOWERon')
    {

    }
    else if(evt.data === 'pumpPOWERoff')
    {

    }
    else if(evt.data === 'teensyLEDon')
    {
        te.checked = 'checked';
    }
    else if(evt.data === 'teensyLEDoff')
    {
        te.checked = '';
    }
    else if(evt.data === 'Update Status')
    {

    }
    else {
      console.log('status event');

      var totalStatus = evt.data;                                              
      var splitStatus = totalStatus.split(',');                                                                                     

      //Num Refresh
      document.getElementById("demo").innerHTML = splitStatus[0];                 

      /*Setting more variables from splitStatus[], removed for char space*/

      }
  };
  }

  function statusUpdate() {
  websock.send("Update Status");
  setTimeout('statusUpdate()', 5000);  
  }

    </script>                  
</head>

<body style='background-color:#4a4a4c;' onload="start();">

    <div style='text-align:center;'>
        <h1 style='text-decoration: underline; color:white;'>Adafruit HUZZAH ESP8266</h1>
    </div>

    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">

    <div style="clear:both;"></div>     

    <div class='counterContainer'>
        <span id="counterText" style="color:white;"></span>
    </div>

    <div id='adminControls' class='adminControlsRow'>

        <h2>Administrator Controls</h2>

        <div id='Newbtn' class='powerSwitchContainer'>
            <h2>HHIO PTT Power</h2>

            <span class="switch">
               <span class="switch-border1">
                    <span class="switch-border2">
                       <input id="switch1" type="checkbox" onclick='POWERswitch()' checked />
                       <label for="switch1"></label>
                       <span class="switch-top"></span>
                       <span class="switch-shadow"></span>
                       <span class="switch-handle"></span>
                       <span class="switch-handle-left"></span>
                       <span class="switch-handle-right"></span>
                       <span class="switch-handle-top"></span>
                       <span class="switch-handle-bottom"></span>
                       <span class="switch-handle-base"></span>
                       <span class="switch-led switch-led-green">
                          <span class="switch-led-border">
                             <span class="switch-led-light">
                                <span class="switch-led-glow"></span>
                             </span>
                          </span>
                       </span>
                       <span class="switch-led switch-led-red">
                          <span class="switch-led-border">
                            <span class="switch-led-light">
                                <span class="switch-led-glow"></span>
                             </span>
                          </span>
                       </span>
                    </span>
               </span>
            </span>
        </div>
        <div class='flushBtnContainer'>
            <h2>Fluid Reservoir</h2>
            <button id='flushBtn' onmousedown="FLUSHbegin();" onmouseup="FLUSHend();">Flush</button>
        </div>
    </div>

    <div style='background-color:#1E1E20; clear:both;'>
        <h2 style='color: white;'>LED Controls</h2>                            
        <div id='LEDbtn' class='onoffswitch'>                             
            <input type='checkbox' name='onoffswitch' class='onoffswitch-checkbox' id='myonoffswitch' onclick='LEDswitch()'>                            
            <label class='onoffswitch-label' for='myonoffswitch'>
                <span class='onoffswitch-inner'></span>
                <span class='onoffswitch-switch'></span>
            </label>
        </div>
    </div>              

    <div style='background-color:#1E1E20; color: white;'>
        <h2>Num Refresh Test</h2>    
        <div id="demo"><h2>Let WEBSOCKET change this text</h2></div>
    </div>

    <div class='headerRow'>
        /*Headers removed for char space*/
    </div>

    <div class='microswitchRow'>
        <div class="microswitchContainer">
          <div class="microswitch white">
             <input type="radio" name="switchC" class="microswitchRadio" id="switchOffC" checked>
             <input type="radio" name="switchC" class="microswitchRadio" id="switchOnC">

             <label for="switchOffC">Detached</label>
             <label for="switchOnC">Attached</label>

             <span class="toggle"></span>
          </div>
        </div>
        <div class="microswitchContainer">
          <div class="microswitch white">
             <input type="radio" name="switchD" class="microswitchRadio" id="switchOffD" checked>
             <input type="radio" name="switchD" class="microswitchRadio" id="switchOnD">

             <label for="switchOffD">Detached</label>
             <label for="switchOnD">Attached</label>

             <span class="toggle"></span>
          </div>
        </div>
        <div class="microswitchContainer">
          <div class="microswitch white">
             <input type="radio" name="switchE" class="microswitchRadio" id="switchOffE" checked>
             <input type="radio" name="switchE" class="microswitchRadio" id="switchOnE">

             <label for="switchOffE">Detached</label>
             <label for="switchOnE">Attached</label>

             <span class="toggle"></span>
          </div>
        </div>
    </div>

    <div class='pressureRow'>
        <div class='pressureContainer'>
            <div class='gauge-a'></div>
            <div class='gauge-b'></div>
            <div class='gauge-c'></div>
            <div class='gauge-data'><h1 id='pressurePercentC'>0%</h1></div>
        </div>
        <div class='pressureContainer'>
            <div class='gauge-a'></div>
            <div class='gauge-b'></div>
            <div class='gauge-d'></div>
            <div class='gauge-data'><h1 id='pressurePercentD'>0%</h1></div>
        </div>
        <div class='pressureContainer'>
            <div class='gauge-a'></div>
            <div class='gauge-b'></div>
            <div class='gauge-e'></div>
            <div class='gauge-data'><h1 id='pressurePercentE'>0%</h1></div>
        </div>
    </div>           

    <div class='valveRow'>
        <div class='valveContainer'>
            <div class="valveTube-c"></div>
            <div class="valve-c"></div>
            <div class='valve-data'><h1 id='valveStatus-c'>Closed</h1></div>
        </div>
        <div class='valveContainer'>
            <div class="valveTube-d"></div>
            <div class="valve-d"></div>
            <div class='valve-data'><h1 id='valveStatus-d'>Closed</h1></div>
        </div>
        <div class='valveContainer'>
            <div class="valveTube-e"></div>
            <div class="valve-e"></div>
            <div class='valve-data'><h1 id='valveStatus-e'>Closed</h1></div>
        </div>
    </div>

    <div class='fluidContainer'>
        <meter class='fluidMeter' max='100' value='50' low='25' high='75' optimum='100'></meter> 
        <div class='fluid-data'><h1 id='fluidPercent'>0%</h1></div>
    </div>

    </body>
</html>
)rawliteral";

const int LEDPIN = 0;

// Current POWER status
bool POWERStatus;

// Current LED status
bool LEDStatus;

// Commands sent through Web Socket
/*command array declarations removed for char space*/

const char statusIdentifier[] = "Update Status";

void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length)
{
  //Serial.printf("webSocketEvent(%d, %d, ...)\r\n", num, type);
  switch(type) {
    case WStype_DISCONNECTED:
  //Serial.printf("[%u] Disconnected!\r\n", num);
  break;
    case WStype_CONNECTED:
  {
    IPAddress ip = webSocket.remoteIP(num);
    //Serial.printf("[%u] Connected from %d.%d.%d.%d url: %s\r\n", num, ip[0], ip[1], ip[2], ip[3], payload);

    // Send the current LED status
    if (LEDStatus) {
      webSocket.sendTXT(num, LEDON, strlen(LEDON));
    }
    else if(!LEDStatus) {
      webSocket.sendTXT(num, LEDOFF, strlen(LEDOFF));
    }
    else if(teensyPOWER) {
      webSocket.sendTXT(num, teensyPOWERON, strlen(teensyPOWERON));
    }
    else if(!teensyPOWER) {
      webSocket.sendTXT(num, teensyPOWEROFF, strlen(teensyPOWEROFF));
    }  
    else if(pumpPOWER) {
      webSocket.sendTXT(num, teensyPOWERON, strlen(teensyPOWERON));
    }
    else if(!pumpPOWER) {
      webSocket.sendTXT(num, pumpPOWEROFF, strlen(pumpPOWEROFF));
    }  
    else if(teensyLED) {
      webSocket.sendTXT(num, teensyLEDON, strlen(teensyLEDON));
    }
    else if(!teensyLED) {
      webSocket.sendTXT(num, teensyLEDOFF, strlen(teensyLEDOFF));
    }
  }
  break;
case WStype_TEXT:
  //Serial.printf("[%u] get Text: %s\r\n", num, payload);

  if (strcmp(LEDON, (const char *)payload) == 0) {
    writeLED(true);
  }
  else if (strcmp(LEDOFF, (const char *)payload) == 0) {
    writeLED(false);
  }
  else if(strcmp(teensyPOWERON,  (const char *)payload) == 0) {
      switchPOWERon();
  }
  else if(strcmp(teensyPOWEROFF,  (const char *)payload) == 0) {
      switchPOWERoff();
  }
  else if(strcmp(pumpPOWERON,  (const char *)payload) == 0) {
      pumpPOWERon();
  }
  else if(strcmp(pumpPOWEROFF,  (const char *)payload) == 0) {
      pumpPOWERoff();
  } 
  else if(strcmp(teensyLEDON,  (const char *)payload) == 0) {
      switchLEDon();
  }
  else if(strcmp(teensyLEDOFF,  (const char *)payload) == 0) {
      switchLEDoff();
  }
  else if(strcmp(statusIdentifier, (const char *)payload) == 0) {
      statusUpdate(num);
  }
  else {
    //Serial.println("Unknown command");
  }
  // send data to all connected clients
  webSocket.broadcastTXT(payload, length);
  break;
case WStype_BIN:
  //Serial.printf("[%u] get binary length: %u\r\n", num, length);
  hexdump(payload, length);

  // echo data back to browser
  webSocket.sendBIN(num, payload, length);
  break;
default:
  //Serial.printf("Invalid WStype [%d]\r\n", type);
  break;
  }
}

void handleRoot()
{

  server.send(200, "text/html", INDEX_HTML);

  if(ipAddressTest != (0,0,0,0))
  {
  if(ipAddressOne == (99,99,99,99))
  {
      ipAddressOne = ipAddressTest;
      pageHitCounter++;
      //server.send(200, "text/html", INDEX_HTML);

      Serial.print("1st NEW IP: ");
      Serial.println(ipAddressTest);
      }

      else if(ipAddressTwo == (99,99,99,99))
      {
      if(ipAddressOne == ipAddressTest)
      {
          Serial.print("Old Connection-1 currently connected; Current Connection: ");
          Serial.println(ipAddressTest);
          //server.send(200, "text/html", INDEX_HTML);
      }
      else
      {
          ipAddressTwo = ipAddressTest;
          pageHitCounter++;
          //server.send(200, "text/html", INDEX_HTML);

          Serial.print("2nd NEW IP: ");
          Serial.println(ipAddressTest);
      }
      }

      else if(ipAddressThree == (99,99,99,99)) 
      {
      if(ipAddressOne == ipAddressTest || ipAddressTwo == ipAddressTest)
      {
           Serial.print("Old Connection-2 currently connected; Current Connection: ");
           Serial.println(ipAddressTest);
           //server.send(200, "text/html", INDEX_HTML);
      }
      else
      {
          ipAddressThree = ipAddressTest;
          pageHitCounter++;
          //server.send(200, "text/html", INDEX_HTML);

          Serial.print("3rd NEW IP: ");
          Serial.println(ipAddressTest);
      }
      }

      else if(ipAddressFour == (99,99,99,99))
      {
      if(ipAddressOne == ipAddressTest || ipAddressTwo == ipAddressTest || ipAddressThree == ipAddressTest)
      {
           Serial.println("Old Connection-3 currently connected; Current Connection: ");
           Serial.println(ipAddressTest);
           //server.send(200, "text/html", INDEX_HTML);
      }
      else
      {
          ipAddressFour = ipAddressTest;
          pageHitCounter++;
          //server.send(200, "text/html", INDEX_HTML);

          Serial.print("4th NEW IP: ");
          Serial.println(ipAddressTest);
      }
      }

      else
      {
      if(ipAddressOne == ipAddressTest || ipAddressTwo == ipAddressTest || ipAddressThree == ipAddressTest || ipAddressFour == ipAddressTest)
      {
           Serial.println("Old Connection-4 currently connected; Current Connection: ");
           Serial.println(ipAddressTest);
           //server.send(200, "text/html", INDEX_HTML);
      }
      else
      {
          Serial.print("Too many connections! Attempting to Connect: ");
          Serial.println(ipAddressTest);
      }
      }
  }



}

void handleNotFound()
{
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET)?"GET":"POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i=0; i<server.args(); i++){
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}

static void writeLED(bool LEDon)
{
  LEDStatus = LEDon;
  // Note inverted logic for Adafruit HUZZAH board
  if (LEDon) {
    digitalWrite(LEDPIN, 0);
  }
  else {
    digitalWrite(LEDPIN, 1);
  }
}

void setup()
{
  pinMode(LEDPIN, OUTPUT);
  writeLED(false);

  Serial.begin(115200);

  //Serial.setDebugOutput(true);

  Serial.println();
  Serial.println();
  Serial.println();

  currCountdown = 4; 

  for(uint8_t t = 4; t > 0; t--) {

unsigned long currTime = millis();

if(countdownFlag == true)
{
    Serial.printf("[SETUP] BOOT WAIT %d...\r\n", t);
    Serial.flush();
    countdownFlag = false; 
}


if(currTime - prevTimeCountdown > countdownInterval)
{
    prevTimeCountdown = currTime; 
    countdownFlag = true; 
} //end if

else
{
    t++;
} //end else

  } //end for

  WiFiMulti.addAP(ssid, password);
/*
  prevTimeCountdown = 0;
  countdownFlag = true;
*/   
  while(WiFiMulti.run() != WL_CONNECTED) {
  /*
  unsigned long currTime = millis();

  if(countdownFlag == true)
  {
      Serial.print(".");
      countdownFlag = false; 
  } //end if

  if(currTime - prevTimeCountdown > countdownInterval)
  {
      prevTimeCountdown = currTime; 
      countdownFlag = true; 
  } //end if
  */
  Serial.print(".");
  delay(1000);

  } //end while

  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (mdns.begin("espWebSock", WiFi.localIP())) {
    Serial.println("MDNS responder started");
    mdns.addService("http", "tcp", 80);
    mdns.addService("ws", "tcp", 81);
  }
  else {
    Serial.println("MDNS.begin failed");
  }
  Serial.print("Connect to http://espWebSock.local or http://");
  Serial.println(WiFi.localIP());

  server.on("/", handleRoot);
  server.onNotFound(handleNotFound);

  server.begin();

  webSocket.begin();
  webSocket.onEvent(webSocketEvent);
    }

void loop()
{
//Communication Protocol
if(Serial.available() > 0)
{
    //Serial.print("SERIAL.AVAILABLE: ");
    //Serial.println(Serial.available());

    if(initialCounter == 0)
    {
        rx_byte = Serial.read();
    /*
        //Print Start of Message
        Serial.print("0x");
        if(rx_byte<0x10)
        {
            Serial.print("0");
        }
        Serial.println(rx_byte, HEX);
    */
        //Serial.println(rx_byte, BIN);
        //Serial.println(rx_byte);

        initialCounter++;
    }


    if((!messageBegun) && (rx_byte == som))
    {
        messageBegun = true;

        //Serial.println("MESSAGE BEGUN TRUE");
    } //end if (messageInProgress && rx_byte)

    if((messageBegun) && (!messageInProgress))
    {
        serialCurrent = Serial.available();

        if(serialCurrent > 0)
        {      
            receivedMessageLength = (uint8_t)Serial.read();
        /*
            Serial.print("MESSAGE LENGTH: ");
            Serial.println(receivedMessageLength);
        */
            messageBegun = false;

            messageInProgress = true;

            //Serial.println("MESSAGE IN PROGRESS TRUE");

        } //end if (serialCurrent)
    } //end if (messageBegun && messageInProgress)

    if(messageInProgress)
    {
        serialCurrent = Serial.available(); 

        if(serialCurrent >= receivedMessageLength)
        {

            Serial.readBytes(rxBuff, receivedMessageLength);

            if((byte)rxBuff[receivedMessageLength-1] != eom)
            {
                //Serial.println("ERROR");
                //Serial.write(Serial.read());
            } //end if (rxBuff != eom)

            else
            {
                messageInProgress = false; 

                for(int i=0; i<receivedMessageLength; i++)
                {
                    if(rxBuff[i] == eom)
                    {
                    /*
                        //Print End of Message
                        Serial.print("0x");
                        if(rx_byte<0x10)
                        {
                            Serial.print("0");
                        }
                        Serial.println(rxBuff[i], HEX);
                    */
                        initialCounter = 0;

                        receivedMessageLength = 0;

                    } //end if

                    else if(i == 0)
                    {
                        receivedSubsys = rxBuff[i]; 
                    /*
                        //Print Subsystem
                        Serial.print("0x");
                        if(rx_byte<0x10)
                        {
                            Serial.print("0");
                        }
                        Serial.println(rxBuff[i], HEX);
                    */
                    } //end if
                    else
                    {
                        if(receivedSubsys == 0x14)
                        {
                            currNumRefresh = rxBuff[i];
                        } //end if

                        /*Other subsystems removed for char space*/
            } //end else

        } //end if (serialCurrent)

    } //end if (messageInProgress)
} //end if (Serial.available)

  webSocket.loop();
  ipAddressTest = server.handleClient();
}

P.S。我略微修改了 ESP8266WebServer.cpp的handleClient()函数来返回当前的IP地址以便跟踪单个用户,但有时我得到 0.0.0.0 IP地址,我不知道为什么或如何判断该IP是否是新的IP。

3 个答案:

答案 0 :(得分:1)

您必须小心使用FS.h上传的文件的大小。根据大小生成页面时会产生一些问题

答案 1 :(得分:0)

我认为Espressif文档建议最多5个UDP / TCP连接,这是每个人总是提到的。我查一下,但我现在正在防火墙后面:)

你没有提到你正在使用的环境,但我猜的是基于Arduino。

我不知道为什么你达到了3而不是5的限制,难道你是否正在使用其他协议的连接?我不确定MDNS的功能是什么,所以也许就是这样。此外,您的浏览器可能会打开更多的连接(使用浏览器调试功能进行调试,例如f12?)。

像往常一样,将代码最小化到最小的示例会有所帮助,只需尝试使用网络服务器,看看你是否接近5:)

答案 2 :(得分:0)

好吧所以我似乎已经通过使用FS.h库和一个实际的文件系统解决了这个问题,其中包含我可以拥有实际html / css / js文件的目录。这似乎解决了稳定性问题。

相关问题