ESP8266 + Arduino (三) ESP8266网络客户端基本操作---2022.2.28

让ESP8266-NodeMCU开发板扮演网络客户端的角色,从而向网络服务器发送HTTP请求以获取服务器响应信息。
在这里插入图片描述
ESP8266-Arduino库中有两个库用于控制ESP8266与网络服务器进行通讯。他们是WiFiClient库ESP8266HTTPClient库

示例1. 使用ESP8266HTTPClient库实现网络通讯
示例2. 使用WiFiClient库实现网络通讯

示例介绍:

1.HTTP请求介绍

  // 建立字符串,用于HTTP请求
  String httpRequest =  String("GET /") + " HTTP/1.1\r\n" +
                        "Host: " + host + "\r\n" +
                        "Connection: close\r\n" +
                        "\r\n";		//用一个空行来  告诉服务器整个请求信息结束了
  

GET / HTTP/1.1        请求行
Host: www.example.com   请求头
Connection: close      请求头
              请求头与请求体之间由空行分割开
… … … … …        请求体

> GET / HTTP/1.1 		请求行

“GET” 是一个读取请求。也就是请求网站服务器把网页数据发送过来。即使用的是“GET”的请求方法。

“/” 的作用就是要告诉网站服务器,我这个读取请求的内容是网站根目录下的内容。换句话说,就是请求服务器把网站首页的网页数据发过来。

“HTTP/1.1” 是指请求所采用的HTTP协议版本是1.1。

“ Host: www.example.com ”表示请求的域名是 www.example.com

以上是HTTP协议的 GET 请求中最关键的内容。在 HTTP 协议中,GET只是诸多请求方法中的一种。以下是HTTP协议中的其它请求方法:

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

“Connection: close” 告诉网络服务器当响应信息发送完成后,就可以断开和客户端即开发板的连接。

2.代码介绍

1. 实现网络服务器连接

client.connect(host, httpPort)

  if (client.connect(host, httpPort)){ 
    Serial.println(" Success!");        // 连接成功后串口输出“Success”信息
    
    client.print(httpRequest);          // 向服务器发送HTTP请求
    Serial.println("Sending request: ");// 通过串口输出HTTP请求信息内容以便查阅
    Serial.println(httpRequest);     
    
    // 通过串口输出网络服务器响应信息, 以下段落中的示例程序为本程序重点2
    // 请参考太极创客网站中关于本程序的讲解页面获取详细说明信息。网址:
    // http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
    Serial.println("Web Server Response:");        
    while (client.connected() || client.available()){ 
      if (client.available()){
        String line = client.readStringUntil('\n');
        Serial.println(line);
      }
    }
    
    client.stop();                      // 断开与服务器的连接
    Serial.print("Disconnected from "); // 并且通过串口输出断开连接信息
    Serial.print(host);
    
  }
  else{    // 如果连接不成功则通过串口输出“连接失败”信息
    Serial.println(" connection failed!");
    client.stop();
  }  

这部分逻辑判断语句中的判断条件是client.connect(host, httpPort)的返回值。ESP8266所实现的网络客户端是通过connect函数来实现与网络服务器的连接的。被连接的网络服务器网址为connect函数的第一个参数,即host。这里的第二个参数httpPort则是连接网络服务器的端口编号。关于host 和 httpPort的具体定义都在程序刚一开始的部分。

如果ESP8266所建立的网络客户端成功与网络服务器建立了连接,connect函数将会返回“真”,否则将会返回“假”。利用connect函数返回值,程序可以根据网络服务器的连接状况来决定具体执行哪一个操作。即:

– 连接成功则通过后续的while循环语句来获取网络服务器的HTTP响应信息,并且将信息通过串口输出。
– 连接不成功则通过串口输出“连接失败”信息。

client.print(httpRequest); // 向服务器发送HTTP请求

2.获取网络服务器响应信息并且通过串口输出

这里的 while (client.connected() || client.available())循环语句判断条件由两个函数的返回值来决定。

client.connect(host, httpPort)
client.connected() 不同

第一个条件是 client.connected() 的返回值。connected()这个函数用于检查当前ESP8266与网络服务器的连接情况。如果连接状态为“真”,则返回真。否则返回“假”。

第二个条件是 client.available()的返回值。available()函数用于检查网络客户端是否有接收到服务器发来的信息。如果有信息则返回真,否则返回“假”。

利用以上两个条件进行“或”运算所得到的结果即是这里while循环语句的判断条件。换句话说,就是当ESP8266与服务器保持连接以及服务器有信息发送给ESP8266这两个条件满足一个,while循环语句体就会执行循环。当这两个条件都不满足了,则跳出循环。

接下来我们看一下while循环的具体内容。这里我们使用了一个逻辑判断语句。判断条件再次出现了client.available()。
在ESP8266与网络服务器通过connect函数建立连接并且ESP8266发送了HTTP请求以后,ESP8266并不会马上就收到服务器的响应信息。造成这个情况的原因有很多个,其中主要原意是服务器接到HTTP响应后,也许需要处理其它客户端的响应或者进行其它工作。这就导致服务器在响应ESP8266时会产生延迟。另外我们的网络环境也会产生延迟。也就是说服务器从发出响应到我们的ESP8266接收到响应这个过程是受到到网络环境等等因素影响的。

3.client.readStringUntil(’\n’)

基于以上原因,我们需要让ESP8266客户端在与网络服务器取得连接以后在原地待命。一旦ESP8266客户端接收到服务器的响应信息,available函数将会返回“真”值,这时才让ESP8266客户端开始检查收到的响应信息具体是什么。这个检查工作是通过逻辑判断语句中的,client.readStringUntil(’\n’)来实现的。

关于readStringUntil函数的具体用法,由于涉及到stream的概念,我们在下一节给各位详细讲解。这里请各位了解一点就是client.readStringUntil(’\n’)函数会将服务器响应信息中 逐行分解为字符串 。这些字符串会赋值给调用该函数的位置,也就是赋值给line这个字符串变量中。

注意:
ESP8266-Arduino库 开发参考资料!!!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值