查看: 478|回复: 1

[Arduino] ESP32 Arduino教程:通过软接入点(soft AP)实现HTTP服务器

[复制链接]
在本ESP32教程中,我们将检查如何设置一个异步HTTP web服务器,该设备作为软访问点运行。
本ESP32教程的测试是使用集成在FireBeetle ESP32开发板中的DFRobotESP-WROOM-32设备进行的。


引言
在这一篇ESP32教程中,我们将介绍在设备作为软接入点运行时如何设置异步HTTP网络服务器。
这样,为使客户端能够连接到HTTP服务器,我们就不需要连接路由器,而只需连到ESP32上面的Wi-Fi网络即可。
在工作于软接入点模式的ESP32上设置HTTP服务器是非常有用的,因为在实际的应用场景中,IoT设备可能部署在Wi-Fi网络中,而在代码编译时是无从知晓Wi-Fi网络认证信息的。
因此,我们就需要以一定的方式对这些认证信息进行设置,以使ESP32能够连接到Wi-Fi网络。
尽管可以通过串行通讯实现连接Wi-Fi网络的目的,但是在有些商业应用中却并不现实,因为往往需要最终用户对设备进行初始配置以开始运行。
因此,一种解决办法就是在首次连接时,让ESP32作为软接入点运行,并启动一个HTTP服务器作为配置HTML页面,以便用户输入Wi-Fi网络名称和密码,从而使得设备能够连接到因特网运行。
IoT温控器就是一个很好的例子,它会对环境温度进行测量,并将结果发送到网上。在这种情况下,每个用户都需要在家里对该产品进行配置,因此上面提到的初始配置方法就是一种理想的解决方案。
当然,这种接口类型的设计是非常复杂的,因此在这篇入门级的例子中,我们只会让服务器简单地返回一条“hello world”消息。
尽管如此,在运行于软接入点模式的ESP32开发板上,仍然可以对前几篇帖子里介绍的HTTP服务器示例进行测试,而且它们已经包含了关于处理HTML和JavaScript的教程。更多详细信息请参见“相关帖子”一节。
如果你还没有配置设置异步HTTP网络服务器所需要的ESP32 Arduino库,那么请参考此处了解如何进行配置。
本ESP32教程的测试是在ESP32 FireBeetle板中集成的DFRobot ESP-WROOM-32设备上进行的。
如果你更喜欢视频教程,可以看这个:



代码
在编写代码方面,本例将以之前有关Arduino环境的两篇教程为基础。第一篇主要介绍了如何设置软接入点:(参见:ESP32 IDF教程:设置软AP,另一篇则介绍了如何在ESP32上配置HTTP网络服务器(请参见:ESP32 Arduino教程:异步HTTP网络服务器)。
有一点需要特别注意,HTTP服务器的配置方式跟之前教程中将ESP连接到路由器Wi-Fi网络时是完全一样的。
所以,在实现方面,我们用于配置服务器的接口并不需要知道所使用的是何种Wi-Fi网络。
在编码方面,首先当然是包含相关的头文件。要设置软接入点,我们需要包含Wi-Fi.h和 ESPAsyncWebServer.h库。

[AppleScript] 纯文本查看 复制代码
#include "WiFi.h"
#include "ESPAsyncWebServer.h"

为了使其他设备能够连接到软接入点,我们需要指定其SSID(网络名称)和密码。这些认证信息都将被声明为全局变量。

[AppleScript] 纯文本查看 复制代码
const char *ssid = "MyESP32AP";
const char *password = "testpassword";

在全局声明最后,我们需要AsyncWebServer 类的一个实例,它提供了配置网络服务器所需的高级API。
在之前的教程中讲过,这个类的构造函数需要一个参数,那就是服务器监听HTTP请求的端口。跟往常一样,我们使用默认的HTTP端口(80)。

[AppleScript] 纯文本查看 复制代码
AsyncWebServer server(80);

在设置函数中,首先需要打开一个串行连接,因为我们需要将ESP32的IP输出给客户端,以使其能够正常连接。

[AppleScript] 纯文本查看 复制代码
Serial.begin(115200);

要启动软接入点,我们只需要调用Wi-Fi外部变量的softAP方法即可(这是我们将ESP32连接到Wi-Fi网络时所使用的同一个变量)。
该方法需要两个输入参数,第一个参数是我们要设置的Wi-Fi网络名称,第二个是网络密码。不需要强制设置密码,而且为了实现开放接入点,最好不要设置密码。

[AppleScript] 纯文本查看 复制代码
WiFi.softAP(ssid, password);

如前所述,我们需要知道ESP32的IP,以使客户端能够连接到网络并发送请求。我们可以调用同一个Wi-Fi变量上的softAP方法来获取IP。
[AppleScript] 纯文本查看 复制代码
Serial.print("IP address: ");
Serial.println(WiFi.softAPIP());

这样Wi-Fi网络部分就设置好了,接下来需要对服务器进行设置。只需要将一个路径绑定到相关的处理函数即可,这样当HTTP请求发送到这个路径时,相应的处理函数就会被执行。
我们使用的是“/hello”路径,并让服务器监听该路径上的HTTP GET请求。
路径处理函数仅返回一个HTTP OK代码(200)和一条“Hello World”消息。
相关的配置代码如下所示。如果需要关于配置代码中所有参数和函数的详细说明,请参见这篇帖子:ESP32 Arduino教程:异步HTTP网络服务器

[AppleScript] 纯文本查看 复制代码
server.on("/hello", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(200, "text/plain", "Hello World");
});

为了启动服务器,我们需要调用服务器对象上的begin方法,这样它就会监听并处理接收到的请求。
到此为止,设置函数就完成了,服务器开始异步运行,Arduino循环暂时可以为空。最终的源代码如下所示。
[AppleScript] 纯文本查看 复制代码
#include "WiFi.h"
#include "ESPAsyncWebServer.h"
const char *ssid = "MyESP32AP";
const char *password = "testpassword";
AsyncWebServer server(80);
void setup(){
  Serial.begin(115200);
  WiFi.softAP(ssid, password);
  Serial.println();
  Serial.print("IP address: ");
  Serial.println(WiFi.softAPIP());
  server.on("/hello", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(200, "text/plain", "Hello World");
  });
  server.begin();
}
void loop(){}


测试代码
只需将编译好的代码上传到你的ESP设备上,并打开Arduino IDE串口监测器,即可对代码进行测试。软接入点设置好后,ESP32的IP就会在监测器上显示出来,如图1所示。把这个IP地址复制下来。
esp32-soft-ap-on-windows-8.png

图1-ESP32的IP。

此时,你的电脑应该能够检测到Wi-Fi网络。在可用的Wi-Fi网络中找到它,并使用代码中定义的密码连接到这个Wi-Fi网络。图2所示是windows 8电脑检测到的网络。

2esp32-websocket-server-python-client-over-soft-ap.png
图2 - Windows 8电脑检测到ESP32上的Wi-Fi网络。

最后,在连接到Wi-Fi网络之后,打开你的网络浏览器,并在地址栏输入以下内容,将 #yourEspIp# 改为你从串口监测器上复制的数值。

[AppleScript] 纯文本查看 复制代码
http://#yourEspIp#/hello

输出结果如图3所示,其中显示了服务器所返回的“Hello world”消息。


3e.png
图3 - ESP32服务器向客户端返回消息。



注:本文作者是Nuno Santos,他是一位和蔼可亲的电子和计算机工程师,住在葡萄牙里斯本 (Lisbon)。
他写了200多篇有关ESP32、ESP8266的有用的教程和项目。

查看更多ESP32/ESP8266教程和项目:
中文版教程 : ESP32教程 合集
英文版教程 : ESP32 tutorial 合集

gada888  版主

发表于 2019-6-4 17:55:55

不错
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2019 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail