Esp8266 Web Server 应用实例 - Simple Web Console

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Esp8266 Web Server 应用实例 - Simple Web Console相关的知识,希望对你有一定的参考价值。

Esp8266 Web Server 应用实例 - Simple Web Console
本文旨在向读者介绍使用Esp8266 WiFi板搭建Web Server应用的原理。示例向读者展示了如何创建Web Console,以及如何使Web Console与NodeMcu进行交互。

硬件准备:

NodeMcu

开发环境:

Arduino IDE(1.8.4),IE11

技术图片

结果预览:

IE11浏览器:
技术图片
微信浏览器:
技术图片
NodeMcu串口输出信息:
技术图片
演示:
技术图片

核心代码:

wifi_test.ino 代码:

#include "GetCmd.h"
#include <ESP8266WiFi.h>

#define DEBUG

#ifdef DEBUG
#define DBG_PRINT(x)    Serial.print(x)
#define DBG_PRINTLN(x)  Serial.println(x)
#else
#define DBG_PRINT(x)
#define DBG_PRINTLN(x)
#endif

#define REQ_HEAD "GET /_cmd_"
#define REQ_TAIL " HTTP"
#define WEB_CONSOLE_BUFFER_SIZE 10240

#ifndef STASSID
#define STASSID "ASUS_24G6"
#define STAPSK  "12345678"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;
String web_console;

const String pagePart1 = String("HTTP/1.1 200 OK
Content-Type: text/html

") +
"<!DOCTYPE html>"+
"<html>"+
"<head>"+
"    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">"+
"    <meta http-equiv="Expires" content="0">"+
"    <meta http-equiv="Pragma" content="no-cache">"+
"    <meta http-equiv="Cache-control" content="no-cache">"+
"    <meta http-equiv="Cache" content="no-cache">"+
"    <title>CONSOLE</title>"+
"</head>"+
"<body onload="document.getElementById("cmdline").focus();">"+
"<form>"+
"    <table>"+
"        <tbody>"+
"            <tr>"+
"                <td>Cmdline:<input type="text" id="cmdline" style="width:466px" onkeydown="if(event.keyCode==13) {event.preventDefault();test();}"></td>"+
"                <td><input type="button" onclick="test()" value="enter"></td>"+
"            </tr>"+
"        </tbody>"+
"    </table>"+
"</form>"+
"<textarea id="con_out" style="color:#00FF00;background-color:#000000" rows="40" cols="80" readonly="readonly">";
//WEB CONSOLE OUTPUT
const String pagePart2 = String("</textarea>")+
"<p>Create By <a href="mailto:firswof@163.com">FIRSWOF</a></p>"+
"<script language="javascript">"+
"xmlHttp=null;"+
"function test()"+
"{"+
"    if (document.getElementById("cmdline").value.length ==0)"+
"    return;"+
"    try"+
"    {"+
"        xmlHttp=new XMLHttpRequest();"+
"    } "+
"    catch(e)"+
"    {"+
"        try"+
"        {"+
"            xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");"+
"        }"+
"        catch(e)"+
"        {"+
"            alert ("Your browser does not support XMLHTTP!");"+
"            return;"+
"        }"+
"    }"+
"    xmlHttp.open("GET","_cmd_" + document.getElementById("cmdline").value,false);"+
"    xmlHttp.setRequestHeader("If-Modified-Since","0");"+
"    xmlHttp.setRequestHeader("Cache-Control","no-cache");"+
"    xmlHttp.send(null);"+
"    document.getElementById("con_out").innerHTML=xmlHttp.responseText;"+
"    document.getElementById("cmdline").value="";"+
"    document.getElementById("cmdline").focus();"+
"}"+
"</script>"+
"</body>"+
"</html>";

// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);

//Web Console Output
void WebPrintln()
{
    web_console += ‘
‘;
}
template<typename T>
void WebPrint(T msg)
{
    web_console += msg;
}
template<typename T>
void WebPrintln(T msg)
{
    web_console += msg;
    web_console += ‘
‘;
}

void HtmlHexValueToChar(String &src)
{
    String tmp;

    for(int i=0;i<src.length();i++)
    {
        if (src[i] == ‘%‘ && i+2<src.length())
        {
            if(((src[i+1]>=‘0‘ && src[i+1] <=‘9‘) || (src[i+1]>=‘A‘ && src[i+1] <=‘F‘)|| (src[i+1]>=‘a‘ && src[i+1] <=‘f‘)) &&
                ((src[i+2]>=‘0‘ && src[i+2] <=‘9‘) || (src[i+2]>=‘A‘ && src[i+2] <=‘F‘)|| (src[i+2]>=‘a‘ && src[i+2] <=‘f‘)))
            {
                tmp += (char)(strtol((String("0x") + src.substring(i+1,i+3)).c_str(), 0, 16) & 0xff);
                i+=2;
            }
            else
                tmp += src[i];
        }
        else
            tmp += src[i];
    }

    src = tmp;
}

//Web Cmd Functions
//Class GetCmd‘s friend function
void SYS_GetCmdList(char** param, uint8_t parCnt)
{
    uint8_t idx = 0;

    while (getCmd.Cmds[idx].cmdFunc != NULL)
    {
        WebPrintln(getCmd.Cmds[idx].cmdName);
        idx++;
    }
}

void CMD_Clear(char** param, uint8_t parCnt)
{
    web_console = "";
}

void CMD_GetMillis(char** param, uint8_t parCnt)
{
    unsigned long time = millis();
    WebPrint(time);
}

void CMD_Echo(char** param, uint8_t parCnt)
{
    for(int i=0;i<parCnt;i++)
    {
        WebPrint("arg[");
        WebPrint(i);
        WebPrint("]:");
        WebPrint(param[i]);
        WebPrintln();
    }
}

void CMD_Network(char** param, uint8_t parCnt)
{
    bool bSucc = false;

    if (parCnt >= 1)
    {
        if (strcmp(param[0], "show")==0)
        {
            if (parCnt == 1 || ( parCnt > 1 && strcmp(param[1], "all")==0))
            {
                WebPrint("SSID:	");
                WebPrintln(STASSID);
                WebPrint("PWD:	");
                WebPrintln(STAPSK);
                bSucc = true;
            }
        }
    }

    if (!bSucc)
        WebPrintln("Usage: network [show [all]]");
}

void CMD_Ver(char** param, uint8_t parCnt)
{
    WebPrintln("Ver:20200812.01");
    WebPrintln("Create By FIRSWOF");
}

void setup()
{
    Serial.begin(115200);
    Serial.println("system running...");
    // prepare LED
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, 0);

    //Connect to WiFi network
    Serial.println();
    Serial.println();
    Serial.print(F("Connecting to "));
    Serial.println(ssid);

    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED)
    {
      delay(500);
      Serial.print(F("."));
    }
    Serial.println();
    Serial.println(F("WiFi connected"));

    // Start the server
    server.begin();
    Serial.println(F("Server started"));

    // Print the IP address
    Serial.println(WiFi.localIP());

    getCmd.AddCommand("ls", SYS_GetCmdList);
    getCmd.AddCommand("clear", CMD_Clear);
    getCmd.AddCommand("echo", CMD_Echo);
    getCmd.AddCommand("millis", CMD_GetMillis);
    getCmd.AddCommand("network", CMD_Network);
    getCmd.AddCommand("ver", CMD_Ver);

    WebPrint("
#NodeMcu>");
}

void loop()
{
    // Check if a client has connected
    WiFiClient client = server.available();
    if (!client)  return;

    client.setTimeout(3000); // default is 1000

    //Wait until the client sends some data
    //~ DBG_PRINTLN("new client");
    unsigned long timeout = millis() + 3000;
    do
    {
        delay(1);
    } while (!client.available() && millis() < timeout);
    if (millis() > timeout)
    {
        Serial.println("timeout");
        return;
    }

    if (web_console.length() > WEB_CONSOLE_BUFFER_SIZE)
        web_console = "";

    // Read the first line of the request
    String req = client.readStringUntil(‘
‘);
    DBG_PRINT(F("raw request:"));
    DBG_PRINTLN(req);

    // Match the request
    int from, end;
    from = req.indexOf(F(REQ_HEAD));
    end = req.indexOf(F(REQ_TAIL));
    if(req.length() == 0)
    {
        client.flush();
        client.stop();
        return;
    }
    else if(req.startsWith("GET / HTTP/1.1"))
    {
        DBG_PRINTLN("answer ‘GET / HTTP/1.1‘");
        client.flush();
        client.print(pagePart1 + web_console + pagePart2);
        //~ DBG_PRINTLN(web_console);
    }
    else if(req.startsWith("GET /favicon.ico HTTP/1.1"))
    {
        client.flush();
        client.print("HTTP/1.1 200 OK
");
        from = -1;
    }

    if (from != -1 && end != -1 && end > from + strlen(REQ_HEAD))
    {
        req = req.substring(from + strlen(REQ_HEAD), end);
        HtmlHexValueToChar(req);
        Serial.print(F("request:"));
        Serial.println(req);
        WebPrintln(req);
        if(!getCmd.CmdParser(req.c_str()))
        {
            WebPrint("invalid cmd");
        }
        WebPrint("
#NodeMcu>");
        client.flush();
        client.print(web_console);
        //~ DBG_PRINTLN(web_console);
    }
}

以上是关于Esp8266 Web Server 应用实例 - Simple Web Console的主要内容,如果未能解决你的问题,请参考以下文章

ESP8266 Web Server实现基本的按键控制IO引脚

ESP32/ESP8266 WebSocket Server:控制引脚输出

ESP8266 WebSocket Server:控制引脚输出

ESP8266 Web Server (WebSocket) 实现多控件多引脚调节(PWM)

ESP8266 Web Server 使用 SPIFFS(SPI Flash File System)

ESP8266Web配网+获取网络时间