WifiClient 和WebServe有啥区别?
(14 封私信 / 1 条消息) httpclient 和webservice有啥区别? - 知乎 (zhihu.com)
1.Webservice两大核心:soap(理解为要传输的数据)、wsdl(理解为传输数据xml的说明)
soap = xml + http,数据格式只能是:xml
soap协议是面向对象编程的,使用wdsl可以生成客户端调用的代码
httpclient传递的是json数据,需要将对象转换成json再进行调用
json比html更为精简,传递效率更高。
httpClient是基于http协议的,只能传递json数据,也就是调用完服务端方法返回json数据,客户端需要自己解析json数据。
webservice是基于soap(=http+xml)协议的,是面向对象编程的,可以直接传输一个对象,客户端有了这个对象就可以像调用本地的方法一样调用服务端方法。
ESP32
#include <WiFi.h>
#include <WebServer.h>
const int LED = 2; //设置LED引脚
const char* AP_SSID = "ESP32"; //设置AP热点名称
const char* AP_PASS = "123456789"; //设置AP热点密码
IPAddress apIP(192, 168, 4, 1); //设置AP的IP地址
const int webPort = 80; //设置Web端口号
WebServer server(webPort); //开启web服务, 创建TCP SERVER,参数: 端口号,最大连接数
WiFi.mode(WIFI_AP); //配置为AP模式
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); //设置AP热点IP和子网掩码
#include <Arduino.h>
#include <WiFi.h>
#include <WebServer.h>
const char *AP_SSID = "ESP32_AP";
const char *AP_Password = ""; // 不填写,则代表无密码
WebServer server(80);
String command; // String to store app command state.
void handleRoot() // 处理网站根目录"/"的访问请求
{
if (server.hasArg("State"))
{
Serial.println(server.arg("State"));
}
server.send(200, "text/html", "");
delay(1);
}
void handleNotFound()
{
server.send(404, "text/plain", "404: Not found");
}
void goForword() {}
void setup()
{
Serial.begin(115200);
WiFi.softAP(AP_SSID, AP_Password);
Serial.print("AP模式建立的WIFI名称:");
Serial.println(AP_SSID);
Serial.print("AP模式建立的IP地址:");
Serial.println(WiFi.softAPIP());
// Starting WEB-server
server.begin(); // start esp32 server
server.on("/", handleRoot); // 告诉MCU如何处理浏览器的HTTP请求
server.onNotFound(handleNotFound);
}
void loop()
{
server.handleClient(); // 检测有没有设备通过网络向MCU发送请求
command = server.arg("State");
Serial.println(command);
if (command == "F")
goForword();
}
WebServer库函数
WebServer是非常常用的一个功能,在设备上使用该功能用户就可以不依赖app直接通过浏览器访问和操作设备。另外即使是用app的,对于app开发来说直接访问webapi也比处理tcp/udp要方便些。
(10条消息) 使用Arduino开发ESP32(09):WebServer使用演示与说明_Naisu Xu的博客-CSDN博客
WebServer简单点理解就是网页服务器,主要干的活就是用户访问链接的时候执行相应的动作,对于开发来说主要处理的就是注册链接并编写用户访问该链接时需要执行的操作。
- 引入相应库
#include <WebServer.h>
;- 声明
WebServer对象
并设置端口号,一般WebServer端口号使用80
;- 使用
on()
方法注册链接与回调函数;- 使用
begin()
方法启动服务器进行请求监听;- 使用
handleClient()
处理来自客户端的请求;
#include <WiFi.h>
#include <WebServer.h> //引入相应库
const char *ssid = "********";
const char *password = "********";
WebServer server(80); //声明WebServer对象
void handleRoot() //回调函数
{
server.send(200, "text/plain", "这是根页面");
}
void handleP1() //回调函数
{
server.send(200, "text/plain", "这是P1页面");
}
void setup()
{
Serial.begin(115200);
Serial.println();
WiFi.mode(WIFI_STA);
WiFi.setSleep(false);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("Connected");
Serial.print("IP Address:");
Serial.println(WiFi.localIP());
server.on("/", handleRoot); //注册链接"/"与对应回调函数
server.on("/p1", handleP1); //注册链接"/p1"与对应回调函数
server.on("/p2", []() { //注册链接"/p2",对应回调函数通过内联函数声明
server.send(200, "text/plain", "这是P2页面,由内联函数声明");
});
server.begin(); //启动服务器
Serial.println("Web server started");
}
void loop()
{
server.handleClient(); //处理来自客户端的请求
}
ESP8266
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
//SSID and Password to your ESP Access Point
const char* ssid = "Robot Wifi";
const char* password = "*******";
#define Light 16 // Light GPIO16(D0).
ESP8266WebServer server(80); // 网络服务器标准http端口号为80,因此这里使用80为端口号
接入点模式(Access Point, 也称 AP)
void setup{
//--------"启动网络服务功能"程序部分开始-------- // 此部分为程序为本示例程序重点1
esp8266_server.begin(); // 详细讲解请参见太极创客网站《零基础入门学用物联网》
esp8266_server.on("/", handleRoot); // 第3章-第2节 ESP8266-NodeMCU网络服务器-1
esp8266_server.onNotFound(handleNotFound);
//--------"启动网络服务功能"程序部分结束--------
}
void loop(void){
esp8266_server.handleClient(); // 处理http服务器访问
}
/* 以下两个函数为本示例程序重点2
详细讲解请参见太极创客网站《零基础入门学用物联网》
第3章-第2节 3_2_1_First_Web_Server 的说明讲解*/
void handleRoot() { //处理网站根目录“/”的访问请求
esp8266_server.send(200, "text/plain", "Hello from ESP8266"); // NodeMCU将调用此函数。
}
// 设置处理404情况的函数'handleNotFound'
void handleNotFound(){ // 当浏览器请求的网络资源无法在服务器找到时,
esp8266_server.send(404, "text/plain", "404: Not found"); // NodeMCU将调用此函数。
}
esp8266_server.begin();
使用了ESP8266WebServer库中的begin函数,这个函数的作用是让单片机启动网络服务功能,该函数无需任何参数。
esp8266_server.on("/", handleRoot)
调用了ESP8266WebServer库中的on函数,该函数的作用是指挥ESP8266来如何处理浏览器的HTTP请求。on函数一共有两个参数,第一个参数是字符串”/”,第二个参数是一个执行函数的名称handleRoot。
参数”/”的作用:一个网站有很多页面,为了加以区分,这些页面都有各自的名称
handlRoot
函数的主要作用是告诉NodeMCU该如何生成和发送网站首页给浏览器。
esp8266_server.on("/", handleRoot)
。它的作用就是告诉NodeMCU,当有浏览器请求网站首页时,请执行handlRoot函数来生成网站首页内容然后发送给浏览器。
当在浏览器地址栏只输入IP地址而没有任何附加信息时,浏览器就会知道我们要获取一个网站首页信息。
esp8266_server.onNotFound(handleNotFound)
esp8266_server.onNotFound(handleNotFound)
使用了onNotFound
函数。它的作用是指挥NodeMCU在收到无法满足的http请求时应该如何处理。
函数就是用来告诉NodeMCU如果出现无法满足的http请求时该如何进行处理。onNotFound
onNotFound
函数有一个参数,这个参数的内容是函数handleNotFound
的名字。
esp8266_server.send(404, "text/plain", "404: Not found")
这条语句调用了ESP8266WebServer库中的send
函数。该函数的作用是生成并且发送http响应信息。也就是说,电脑浏览器所收到的网页信息都是通过send
函数生成并且发送的。
404是一个服务器状态码,含义:客户端的请求有错误。send
函数的最后一个参数使用了一个字符串”404: Not found”。这个字符串的内容才是真正显示在浏览器中供我们阅读的内容。你可以任意的改变这个字符串的内容。
send
函数还有一个字符串参数“text/plain”。它的作用是说明http响应体的信息类型。在这段示例中,我们用“text/plain”的原因是要告诉浏览器后面的”404: Not found”为一段纯文本信息。这里当然也可以使用其它类型的信息。
send函数一共有3个参数:第一个参数为服务器状态码,通常为404或200,200表示成功接收请求。第二个参数:说明http响应信息类型“text/plain”。第三个参数为响应体的具体信息。
setHeader:响应数据头
Content-Type:内容类型
text/plain:普通文本类型
text/html:解析html格式类型
application/x-jpg:下载图片的
image/jpeg:直接显示图片
charset=utf-8:编码是utf-8
void handleRoot() {
esp8266_server.send(200, "text/plain", "Hello from ESP8266");
}
用于生成和发送首页信息的函数:handleRoot
。
void loop(){
esp8266_server.handleClient();
}
loop函数中唯一的一条语句,这句程序调用了handleClient
函数。它的主要作用之一是检查有没有设备通过网络向NodeMCU发送请求。函数handleClient
每次被调用时,NodeMCU都会检查一下是否有人发送http请求。因此我们需要把它放在loop函数中,从而确保它能经常被调用。假如我们的loop函数里有类似delay一类的函数延迟程序运行,那么这时候就一定要注意了。如果handleClient
函数长时间得不到调用,NodeMCU的网络服务会变得很不稳定。因此在使用NodeMCU执行网络服务功能的时候,一定要确保handleClient
函数经常得以调用。我在这里反复强调这一点是因为这一点非常关键,请务必注意!
void HTTP_handleRoot(void)
{
if (server.hasArg("State"))
{
Serial.println(server.arg("State"));
}
server.send(200, "text/html", "");
delay(1);
}
ESP8266 – ESP8266WebServer库 – send
- 说明:在MCU所建立的物联网服务器在运行过程中,如果有客户端向ESP8266服务器发送HTTP请求,ESP8266服务器可使用本函数向客户端发送响应信息。
- 语法:send(responseCode, contentType, responseContent)
- responseCode: 响应状态码(类型:int)
- contentType: 响应内容类型,本参数为可选参数,如不使用本参数则默认为空NULL(可使用字符串类型),例如:"text/html" 、"text/plain"
- responseContent: 响应内容,本参数为可选参数,如不使用本参数则默认为空字符串(可使用字符串类型)
ESP8266 – ESP8266WebServer库 – streamFile
ESP8266 – ESP8266WebServer库 – streamFile – 太极创客 (taichi-maker.com)
- 说明:在所建立的物联网服务器运行中,如果有客户端向服务器发送HTTP请求,服务器将会对客户端发送响应信息。本函数可用于向服务器响应体中添加自定义信息。可以实现此功能的函数共有3个:sendContent、sendContent_P、streamFile。这三个函数虽然功能相同,但是他们所发送的信息存储位置有很大的区别。
- sendContent函数:发送的信息通常是程序中的一个字符串。优点:直接调用程序内字符串,这个操作比起另外两种方法来说更加简单直接。但是其缺点是,由于存储发送信息的字符串是在程序中的,这会占用开发板的动态内存空间。因此,使用sendContent函数时,发送信息的大小受到了限制。
- sendContent_P:发送的响应信息必须存储在程序存储空间,这一特点大大优化了程序内存占用问题。使用此函数对发送较大的响应信息时非常有帮助。缺点:sendContent_P的信息仍是写在程序中,如果发送的信息需要分为多个文件存储,使用此函数是无法胜任的。
- streamFile:使用streamFile函数来发送响应信息是最推荐的操作方法。因为此函数利用了MCU的闪存文件系统来存储发送的信息内容(看一下物联网教程关于闪存操作的这一节)。此函数既可以节省程序内存空间,又运行将需要发送的信息分为多个文件进行保存。但是使用streamFile时需要我们使用Arduino IDE的闪存文件上传工具预先将文件上传到闪存中。
语法:streamFile(file, contentType) - 参数:file – 存储有响应信息的闪存文件对象,contentType(可选参数) – 响应信息系类型 (const String& )3-3 ESP8266 NodeMCU 闪存文件系统(SPIFFS) – 太极创客 (taichi-maker.com)
ESP8266 – ESP8266WebServer库 – hasArg
说明:ESP8266 – ESP8266WebServer库 – hasArg – 太极创客 (taichi-maker.com)
使用此函数,可以获取客户端向ESP8266物联网服务器发送的请求信息中有无指定的参数。
语法:server.hasArg(name)
参数:name,需要确认的请求体中的参数名(参数类型: String)
返回值:返回是否存在指定参数(类型bool)
假设您的开发板IP地址为192.168.0.106,那么接下来您可以通过浏览器输入以下地址信息。
http://192.168.0.106/?token=abc
在以下示例程序中,我们使用了
server.hasArg("token")
来判断请求信息中是否有名称为”token”的参数。如果有此参数,则通过串口监视器输出参数数值。如下图示:
通常与Server.arg()结合使用。
//自定义返回请求体信息
void echo_args() {
if (server.hasArg("token")) {
Serial.print("请求中token参数的值:");
Serial.println(server.arg("token"));
}
else {
Serial.println("当前请求中无法找到指定请求体内容");
}
}
ESP8266 – ESP8266WebServer库 – arg
说明:使用本函数,我们可以获取客户端向ESP8266物联网服务器发送的指定参数的数值。
语法:name 请求体中的参数名(参数类型: String)
index 请求体中的参数序列号(参数类型: int)
返回值: 指定参数的数值(类型:String)
ESP8266 – ESP8266WebServer库
ESP8266 – ESP8266WebServer库 – 太极创客 (taichi-maker.com)
ESP8266WebServer库用于HTTP协议通讯。通过ESP8266WebServer库,我们可以使用ESP8266开发板建立网络服务器,从而允许其它网络设备以及物联网设备通过HTTP协议访问并实现物联网信息交流。
由于HTTP协议是建立在TCP协议基础之上的,可以使用WIFIServer库来实现HTTP通讯,在这一点上,WIFIServer与ESP8266WebServer库在功能上形成了互补。
太极创客官网本节有ESP8266WebServer库的整体结构图。
ESP8266 – WiFiClient库
WiFiClient库用于ESP8266的TCP协议物联网通讯。TCP协议又称传输控制协议,是Transmission Control Protocol的简称。
通过WiFiClient库,我们可以使用ESP8266利用互联网或局域网向网络服务器发送请求,从而获取网络信息,实现物联网应用。