利用ESP32搭建网络服务器(一)
基本网络服务器
我们在使用ESP32接触网络服务器功能的时候我们先了解一下客户端与服务器在通信中的作用,以及他们各自所主要实现的功能,下面是百度查资料加上个人见解仅做参考,欢迎大佬指正
客户端:客户端我们可以理解为两者中提出需求的一方,客户端向服务端提出需要什么样的资源,这个资源可能是图片、视频、文档等等,我们理解为客户端请求
服务端:前面描述客户端的时候我们知道客户端会提出他的需求,我们这里服务端就是用来响应需求的,客户端需要图片服务端会发送一张图片给客户端,文档就发文档
如果我们没有这个资源或者因为种种原因不能发给客户端,那么这里就会有两种情况出现
一种 是客户端需要这张图片服务端正好有并且可以发给客户端,那么就可以发送过去
第二种 情况就是服务端没有这张图片或者这张图片是不能发出去的,这个时候就会出现404等错误了,这里我们理解为服务端的响应
服务器响应与客户端请求
本期我们学习的目的是使用ESP32作为服务器去响应来自客户端的请求,这里的客户端我们选择使用电脑去请求ESP32的数据,请求的数据以 “ Hello world!” 为例,较为复杂一些的图片视频之类的我们后面再慢慢接触
下面我们将以电脑作为客户端使用浏览器请求ESP32建议的数据,我们在ESP32端需要做的就是对电脑的请求作出回应
程序流程
建立连接
程序开始我们先要选择一种方式与电脑建立连接,电脑发出热点使用ESP32去连接或者ESP32发出热点用电脑去连接,当然也可以都接到路由器上,我们这里选择电脑去连接ESP32的热点,ESP32发出热点参考代码如下(关于程序串口通信部分我们这里不做说明)
const char *AP_SSID="OnePlus 8 Pro";
const char *AP_Password="122232542jxl";
WiFi.softAP(wifi_SSID,wifi_Password); //设置AP模式热点的名称和密码,密码可不填则发出的热点为无密码热点
Serial.print("\n ESP32建立的wifi名称为:");
Serial.print(wifi_SSID); //串口输出ESP32建立的wifi的名称
Serial.print("\nESP32建立wifi的IP地址为:");
Serial.print(WiFi.softAPmacAddress()); //串口输出热点的IP地址
主要代码为WiFi.softAP(wifi_SSID,wifi_Password);
,函数功能为开启ESP32的热点,其中wifi_SSID
,wifi_Password
分别为开启热点的名称和密码,可以自行去定义也可参考前面的文章
关于后面的Serial.print()
语句均为我们需要的一些调试信息,看代码可以看出输出信息为热点名称与ESP32的IP地址
完成上面的步骤之后我们就可以通过电脑连接ESP32的热点来进行连接了,下面我们将开启网络服务器的功能
开启网络服务器
网络服务器部分是我们新接触到的内容,在本次例程中我们需要了解使用的WebServer.h库中的一些函数,也可以直接参考库文件,当然使用这个库之前我们在程序中同样要调用这个库
virtual void begin()
函数功能:启动服务器
void on(const String &uri, HTTPMethod method, THandlerFunction fn)
函数功能:当建立网络服务器之后,有客户端做出HTTP请求,用这个函数来设置对应请求的回调函数
参数 :
uri
:客户端所请求的资源
method
:用来设置响应客户端请求是的方法,可选方法如下
HTTP_ANY
HTTP_GET
HTTP_POST
HTTP_PUT
HTTP_PATCH
HTTP_DELETE
HTTP_OPTIONS
fn
:接收的请求对应的回调函数
void onNotFound(THandlerFunction fn)
函数功能:当客户端请求的资源地址无效或者说没有的时候,这个函数会做出响应,并用该函数来设置对应的回调函数
参数:
fn
:接收的请求对应的回调函数
void send(int code, char* content_type, const String& content)
函数功能:使用该函数可以向客户端发送信息
参数:
code
:发送给客户端的HTTP响应状态码,可以参考HTTP协议资料中关于响应状态码部分
content_type
:响应内容的类型,同样可参考HTTP协议中的定义
content
:响应给客户端的内容
virtual void handleClient()
函数功能:处理客户端的请求,当该函数执行一次时会检查一次是否有客户端请求未处理并进行响应的处理
有以上几个函数我们就可以建立基础的网络服务器并进行响应了,下面我们看到写好的网络服务器部分的代码
#include<WebServer.h>
WebServer esp32_server(80); //声明一个 WebServer 的对象,对象的名称为 esp32_server
//设置网络服务器响应HTTP请求的端口号为 80
esp32_server.begin(); //启动网络服务器
esp32_server.on("/HolleWorld",HTTP_GET,handleRoot); //函数处理当有HTTP请求 "/HolleWorld" 时执行函数 handleRoot
esp32_server.onNotFound(handleFound); //当请求的网络资源不在服务器的时候,执行函数 handleFound
上面的部分代码中#include<WebServer.h>
调用库应该放在程序头部
后面函数esp32_server.begin();
用于启动初始化服务器功能
函数esp32_server.on("/",HTTP_GET,handleRoot);
中 /HolleWorld
为请求的资源,HTTP_GET
为响应请求时使用的方法,这部分具体可参照HTTP协议
相关资料,handleRoot
为响应请求时调用的函数,也就是说当有接收到 http://ESP32IP地址/HolleWorld
这个请求时将会执行后面我们建立的函数名为handleRoot
的函数
esp32_server.onNotFound(handleFound);
这个函数与前面的非常类似,在客户请求的地址或者说资源没有时将执行函数handleFound
下面我们看到响应的两个函数handleRoot
和handleFound
响应的内容
void handleRoot() //该函数内为处理网站根目录 “/” 时所执行的内容
{
esp32_server.send(200,"text/plain","Holle World!"); //用函数 send 向浏览器发送信息,200表示正常状态码,text/plain表示发送的内容为纯文本类型 text/html为HTML的网页信息,"Holle World!"为发送的内容
}
void handleFound()
{
esp32_server.send(404,"text/plain","404:Not Found!"); //用函数 send 向浏览器发送信息,404表示服务器上找不到请求的资源,text/plain表示发送的内容为纯文本类型,"404:Not Found!"为发送的内容
}
上面两个函数对不同的客户端请求做出不同的响应从而在客户端浏览器上显示不同的内容
服务器需要不停的检查是否有客户端请求并做出响应的回应,因此我们需要在loop
函数中一直循环调用handleClient()
函数以检查是否有客户端请求,下面为loop函数示例,较为简单
void loop() {
// put your main code here, to run repeatedly:
esp32_server.handleClient();
}
客户端验证
完整的源码会贴在文章末尾,有需要的可以复制也可以留言邮箱获取资料文件,学习完上面相关的之后编写程序并烧录到ESP32开发板,打开串口监视器并按下复位键,将会在串口监视器看到返回的调试信息
我们看到获取到的IP地址为192.168.4.1
,ESP32默认的这个参数是这个IP,可能部分人会不一样以自己的为准,下面我们用电脑连接wifi,并在浏览器中输入 192.168.4.1/HolleWorld
打开之后我们会发现浏览器界面出现一段文字HolleWorld!
,如果出现了那么我们的函数esp32_server.on("/HolleWorld",HTTP_GET,handleRoot);
得到了成功调用,之后我们再输入 192.168.4.1/xxx
xxx随便填,只要不是HolleWorld
,观察浏览器界面是否出现404:Not Found!
以验证esp32_server.onNotFound(handleFound);
相关程序是否正确,请记住上传完程序之后的所有操作都需要建立在电脑已经连接到ESP32热点的前提下操作
总结
本次使用ESP32搭建基础网络服务器相较于前文关于HTTP数据类型,状态码等地方可能会有部分同学觉得比较难以理解,可以百度相关HTT协议格式进行了解之后理解起来会比较容易,需要代码资料的同学可以在下方留言邮箱,也可在下方沟通交流,大家互相学习互相进步!
完整代码
#include<WiFi.h>
#include<WebServer.h>
WebServer esp32_server(80); //声明一个 WebServer 的对象,对象的名称为 esp32_server
//设置网络服务器响应HTTP请求的端口号为 80
const char *AP_SSID="OnePlus 8 Pro";
const char *AP_Password="122232542jxl";
void setup() {
// put your setup code here, to run once:
Serial.begin(115200); //初始化串口通信并设置波特率为115200
WiFi.softAP(AP_SSID,AP_Password); //设置AP模式热点的名称和密码,密码可不填则发出的热点为无密码热点
Serial.print("\n ESP32建立的wifi名称为:");
Serial.print(AP_SSID); //串口输出ESP32建立的wifi的名称
Serial.print("\nESP32建立wifi的IP地址为:");
Serial.print(WiFi.softAPIP()); //串口输出热点的IP地址
esp32_server.begin(); //启动网络服务器
esp32_server.on("/HolleWorld",HTTP_GET,handleRoot); //函数处理当有HTTP请求 "/" 时执行函数 handleRoot
esp32_server.onNotFound(handleFound); //当请求的网络资源不在服务器的时候,执行函数 handleFound
void loop() {
// put your main code here, to run repeatedly:
esp32_server.handleClient();
}
void handleRoot() //该函数内为处理网站根目录 “/” 时所执行的内容
{
Serial.print("客户端访问!");
esp32_server.send(200,"text/plain","Holle World!"); //用函数 send 向浏览器发送信息,200表示正常状态码,text/plain表示发送的内容为纯文本类型 text/html为HTML的网页信息,"Holle World!"为发送的内容
}
void handleFound()
{
esp32_server.send(404,"text/plain","404:Not Found!"); //用函数 send 向浏览器发送信息,404表示服务器上找不到请求的资源,text/plain表示发送的内容为纯文本类型,"404:Not Found!"为发送的内容
}