WiFi-ESP8266入门开发(十六)-HTTP服务器

注:对于ESP8266开源技术感兴趣的可以加群,我们一起探索交流学习,群号:579932824。群名:ESP8266开源技术交流群。

介绍

超文本传输​​协议(HTTP)是标准的应用层协议,用作服务器和客户端之间的请求响应协议。

它被广泛应用于物联网(IoT)嵌入式应用,每个传感器都连接到一个服务器,我们可以通过互联网进行控制。

NodeMCU具有可用的Wi-Fi功能。通过这种Wi-Fi功能,NodeMCU可以作为客户端连接到任何Wi-Fi网络,也可以创建其他支持Wi-Fi的设备连接的网络。

NodeMCU作为Wi-Fi使用AP模式的HTTP Server

NodeMCU wi-fi具有接入点(AP)模式,通过它可以创建无线LAN,任何支持Wi-Fi的设备都可以连接,如下图所示。

WiFi-ESP8266入门开发(十六)-HTTP服务器_第1张图片

NodeMCU作为使用Wi-Fi AP模式的HTTP Server

我们可以设置AP模式下的SSID和密码,这个模式用来连接到其他设备。

NodeMCU作为Wi-Fi使用STA模式的HTTP Server

NodeMCU具有Station(STA)模式,可以使用该模式连接到现有的Wi-Fi网络,并可以充当该网络分配的IP地址的HTTP服务器。

WiFi-ESP8266入门开发(十六)-HTTP服务器_第2张图片

NodeMCU作为使用Wi-Fi STA模式的HTTP Server

NodeMCU从连接的Wi-Fi路由器获取IP。使用此IP地址,它可以充当任何Wi-Fi设备可以连接的HTTP服务器。

让我们编写Arduino Sketch,使NodeMCU成为具有Wi-Fi STA / AP模式的HTTP服务器,并控制从客户端连接到服务器端的LED。

在这里,我们已经连接LED到引脚号。2即NodeMCU板上的D2引脚,如下图所示。

WiFi-ESP8266入门开发(十六)-HTTP服务器_第3张图片

客户端的HTML页面

由于我们正在开发用于LED开/关功能的HTTP服务器,因此我们将制作一个简单的HTML页面,这个页面将在客户端可见,并且能够接通/断开LED的用户输入。这是用户友好的按钮输入代表,从用户点击输入。

我们需要为LED ON和LED OFF状态编写两个HTML页面,即当客户点击LED ON按钮时,下一步我们需要提供LED OFF的选项。以下是LED ON和LED OFF状态显示的两个HTML代码片段。

用于LED的HTML代码片段



</span>LED Control<span style="color:#0000ff;">

LED

Click to switch LED on and off.

method="get"> type="button" value="LED ON" onclick="window.location.href='/ledon'">

关闭LED的HTML代码片段



</span>LED Control<span style="color:#0000ff;">

LED

Click to switch LED on and off.

method="get"> type="button" value="LED OFF" onclick="window.location.href='/ledoff'">

从上面的两个HTML代码片断中,我们可以看到只有LED ON和LED OFF状态的形式不同。

我们来看看HTML行

<!DOCTYPE html>:该声明将该文档定义为HTML,并帮助浏览器正确显示网页。它只能出现一次,在页面的顶部。

:这个元素是HTML页面的根元素

:这个元素包含关于文档的元信息

</strong>:这个元素指定文档的标题</p> <p><strong><body></strong>:这个元素包含可见的页面内容,即文档的主体</p> <p><strong><h1></strong>:这个元素定义了标题的最大字体大小。同样的,我们可以使用<h2> / <h3>等来标题的较小的字体大小。</p> <p><strong><p></strong>:这个元素定义了一个段落。</p> <p><strong><form></strong>:这个元素定义了一个用来收集用户输入的表单</p> <p><strong>window.location.href</strong>:这是一个属性,会告诉我们当前的URL位置。更改属性的值将重定向页面。</p> <p>比如<code>window.location.href='/ledon'</code>将当前页面重定向到URL <code>current_url/ledon </code>页面。如果当前位置是<code>http://192.168.0.1</code>那么它将重定向到<code>http://192.168.0.1/ledon </code>页面。页面重定向动作是在点击事件(例如点击按钮)上进行的。  </p> <p>这里我们使用上面提到的概念(页面重定向)将客户端从LED ON页面重定向到LED OFF页面,反之亦然。</p> <p>要了解有关HTML的更多信息,请参阅https://www.w3schools.com/html/default.asp</p> <p>现在,我们可以发送上面的HTML片段,当客户端连接到服务器,也当客户端点击按钮。</p> <p> </p> <p><strong>程序</strong></p> <p>在Wi-Fi接入点(AP)模式下,NodeMCU创建服务器,因此我们可以设置其IP地址,IP子网掩码和IP网关。</p> <p> </p> <p>我们来看下SSID,密码加入网络和AP模式的地址</p> <ul> <li>SSID =“NodeMCU”</li> <li>密码=“12345678”</li> <li>IP =“192.168.2.1”</li> <li>Sub netmask =“255.255.255.0”</li> <li>网关=“192.168.2.1”</li> </ul> <h1>带有Wi-Fi AP模式的HTTP服务器的Arduino Sketch</h1> <pre style="margin-left:0px;"><code class="language-objectivec"><span style="color:#2b91af;">#include <ESP8266WiFi.h></span> <span style="color:#2b91af;">#include <ESP8266WebServer.h></span> <span style="color:#008000;">/* Put your SSID & Password */</span> <span style="color:#0000ff;">const</span> <span style="color:#0000ff;">char</span>* ssid = <span style="color:#a31515;">"NodeMCU"</span>; <span style="color:#008000;">// Enter SSID here</span> <span style="color:#0000ff;">const</span> <span style="color:#0000ff;">char</span>* password = <span style="color:#a31515;">"12345678"</span>; <span style="color:#008000;">//Enter Password here</span> <span style="color:#008000;">/* Put IP Address details */</span> IPAddress local_ip(<span style="color:#ad009e;">192</span>,<span style="color:#ad009e;">168</span>,<span style="color:#ad009e;">2</span>,<span style="color:#ad009e;">1</span>); IPAddress gateway(<span style="color:#ad009e;">192</span>,<span style="color:#ad009e;">168</span>,<span style="color:#ad009e;">2</span>,<span style="color:#ad009e;">1</span>); IPAddress subnet(<span style="color:#ad009e;">255</span>,<span style="color:#ad009e;">255</span>,<span style="color:#ad009e;">255</span>,<span style="color:#ad009e;">0</span>); ESP8266WebServer server(<span style="color:#ad009e;">80</span>); uint8_t LEDpin = D2; <span style="color:#0000ff;">bool</span> LEDstatus = LOW; <span style="color:#0000ff;">void</span> setup() { Serial.begin(<span style="color:#ad009e;">9600</span>); pinMode(LEDpin, OUTPUT); WiFi.softAP(ssid, password); WiFi.softAPConfig(local_ip, gateway, subnet); delay(<span style="color:#ad009e;">100</span>); server.on(<span style="color:#a31515;">"/"</span>, handle_OnConnect); server.on(<span style="color:#a31515;">"/ledon"</span>, handle_ledon); server.on(<span style="color:#a31515;">"/ledoff"</span>, handle_ledoff); server.onNotFound(handle_NotFound); server.begin(); Serial.println(<span style="color:#a31515;">"HTTP server started"</span>); } <span style="color:#0000ff;">void</span> loop() { server.handleClient(); <span style="color:#0000ff;">if</span>(LEDstatus) digitalWrite(LEDpin, HIGH); <span style="color:#0000ff;">else</span> digitalWrite(LEDpin, LOW); } <span style="color:#0000ff;">void</span> handle_OnConnect() { LEDstatus = LOW; server.send(<span style="color:#ad009e;">200</span>, <span style="color:#a31515;">"text/html"</span>, SendHTML(<span style="color:#a31515;">false</span>)); } <span style="color:#0000ff;">void</span> handle_ledon() { LEDstatus = HIGH; server.send(<span style="color:#ad009e;">200</span>, <span style="color:#a31515;">"text/html"</span>, SendHTML(<span style="color:#a31515;">true</span>)); } <span style="color:#0000ff;">void</span> handle_ledoff() { LEDstatus = LOW; server.send(<span style="color:#ad009e;">200</span>, <span style="color:#a31515;">"text/html"</span>, SendHTML(<span style="color:#a31515;">false</span>)); } <span style="color:#0000ff;">void</span> handle_NotFound(){ server.send(<span style="color:#ad009e;">404</span>, <span style="color:#a31515;">"text/plain"</span>, <span style="color:#a31515;">"Not found"</span>); } String SendHTML(uint8_t led){ String ptr = <span style="color:#a31515;">"<!DOCTYPE html>\n"</span>; ptr +=<span style="color:#a31515;">"<html>\n"</span>; ptr +=<span style="color:#a31515;">"<head>\n"</span>; ptr +=<span style="color:#a31515;">"<title>LED Control\n"; ptr +="\n"; ptr +="\n"; ptr +="

LED

\n"; ptr +="

Click to switch LED on and off.

\n"
; ptr +="
\n"; if(led) ptr +="\n"; else ptr +="\n"; ptr +="\n"
; ptr +="\n"; ptr +="\n"; return ptr; }

注意:成功上传以上草图客户端需要先连接到NodeMCU创建的网络。

从wifi连接到NodeMCU网络后,在浏览器中输入服务器地址,http://server_ip_address例如在我们的情况下http://192.168.2.1按Enter键后,我们可以看到服务器的HTML页面响应,如下图所示。现在只需点击按钮来改变LED的状态。

WiFi-ESP8266入门开发(十六)-HTTP服务器_第4张图片

现在,让我们使用Wi-Fi站模式对NodeMCU执行HTTP服务器。

在Wi-Fi Station(STA)模式下,NodeMCU从Wi-Fi路由器(接入点)获取IP地址。如果我们也在同一个网络中,那么我们可以直接使用IP地址连接到NodeMCU HTTP Server。

带有Wi-Fi STA模式的HTTP服务器的Arduino Sketch

#include 
#include 

/*Put your SSID & Password*/
const char* ssid = "ssid";  // Enter SSID here
const char* password = "password";  //Enter Password here

ESP8266WebServer server(80);

uint8_t LEDpin = D2;
bool LEDstatus = LOW;

void setup() {
  Serial.begin(9600);
  delay(100);
  pinMode(LEDpin, OUTPUT);

  Serial.println("Connecting to ");
  Serial.println(ssid);

  //connect to your local wi-fi network
  WiFi.begin(ssid, password);

  //check wi-fi is connected to wi-fi network
  while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected..!");
  Serial.print("Got IP: ");  Serial.println(WiFi.localIP());

  server.on("/", handle_OnConnect);
  server.on("/ledon", handle_ledon);
  server.on("/ledoff", handle_ledoff);
  server.onNotFound(handle_NotFound);

  server.begin();
  Serial.println("HTTP server started");
}
void loop() {
  server.handleClient();
  if(LEDstatus)
  digitalWrite(LEDpin, HIGH);
  else
  digitalWrite(LEDpin, LOW);
}

void handle_OnConnect() {
  LEDstatus = LOW;
  server.send(200, "text/html", SendHTML(false)); 
}

void handle_ledon() {
  LEDstatus = HIGH;
  server.send(200, "text/html", SendHTML(true)); 
}

void handle_ledoff() {
  LEDstatus = LOW;
  server.send(200, "text/html", SendHTML(false)); 
}

void handle_NotFound(){
  server.send(404, "text/plain", "Not found");
}

String SendHTML(uint8_t led){
  String ptr = "\n";
  ptr +="\n";
  ptr +="\n";
  ptr +="LED Control\n";
  ptr +="\n";
  ptr +="\n";
  ptr +="

LED

\n"
; ptr +="

Click to switch LED on and off.

\n"
; ptr +="
\n"; if(led) ptr +="\n"; else ptr +="\n"; ptr +="\n"
; ptr +="\n"; ptr +="\n"; return ptr; }

注意:在Wi-Fi站模式下,我们需要输入现有网络的ssid和密码。连接到WiFi网络后,在浏览器中输入服务器地址即http://assigned_ip_address按下回车键后,我们可以在浏览器中看到服务器的HTML页面响应,如上图所示


支持文件

源代码

  • NodeMCU HTTP服务器Arduino草图 下载  

      95

你可能感兴趣的:(ESP8266,ESP8266入门到实战开发)