ESP8266请求获取服务器响应(WiFiClient库)


前言

WiFiClient库用于ESP8266的TCP协议物联网通讯,访问http://www.example.com请求以获取服务器响应。


以下是本篇文章正文内容,下面案例可供参考

一、使用WiFiClient库实现网络通讯

1.示例

代码如下(示例):

#include <ESP8266WiFi.h>
 
const char* host = "www.example.com"; // 网络服务器地址
const int httpPort = 80;              // http端口80
 
// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "Xiaomi_A433";
const char* password = "34412666";
 
void setup() {
  //初始化串口设置
  Serial.begin(9600);
  Serial.println("");
 
  //设置ESP8266工作模式为无线终端模式
  WiFi.mode(WIFI_STA);
 
  //开始连接wifi
  WiFi.begin(ssid, password);
 
  //等待WiFi连接,连接成功打印IP
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi Connected!");
  
  wifiClientRequest();  
}
 
void loop(){}
 
// 向服务器发送HTTP请求
void wifiClientRequest(){
  // 建立WiFi客户端对象,对象名称client
  WiFiClient client;    
 
  // 建立字符串,用于HTTP请求
  String httpRequest =  String("GET /") + " HTTP/1.1\r\n" +
                        "Host: " + host + "\r\n" +
                        "Connection: close\r\n" +
                        "\r\n";
  
  // 通过串口输出连接服务器名称以便查阅连接服务器的网址                      
  Serial.print("Connecting to "); 
  Serial.print(host); 
 
  // 连接网络服务器,以下段落中的示例程序为本程序重点1
  // 请参考太极创客网站中关于本程序的讲解页面获取详细说明信息。网址:
  // http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
  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();
  }  
}

串口监视器返回响应报文:

2⸮t|$H<$H⸮"⸮⸮⸮
......
WiFi Connected!
Connecting to www.example.com Success!
Sending request: 
GET / HTTP/1.1
Host: www.example.com
Connection: close


Web Server Response:
HTTP/1.1 200 OK

Age: 335497

Cache-Control: max-age=604800

Content-Type: text/html; charset=UTF-8

Date: Sun, 14 Mar 2021 06:42:57 GMT

Etag: "3147526947+ident"

Expires: Sun, 21 Mar 2021 06:42:57 GMT

Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT

Server: ECS (oxr/832C)

Vary: Accept-Encoding

X-Cache: HIT

Content-Length: 1256

Connection: close



<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
        
    }
    div {
        width: 600px;
        margin: 5em auto;
        padding: 2em;
        background-color: #fdfdff;
        border-radius: 0.5em;
        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
    }
    a:link, a:visited {
        color: #38488f;
        text-decoration: none;
    }
    @media (max-width: 700px) {
        div {
            margin: 0 auto;
            width: auto;
        }
    }
    </style>    
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is for use in illustrative examples in documents. You may use this
    domain in literature without prior coordination or asking for permission.</p>
    <p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>
Disconnected from www.example.com

2.代码讲解

核心代码:

    while (client.connected() || client.available()){ 
      if (client.available()){
        String line = client.readStringUntil('\n');
        Serial.println(line);
      }
    }
connected()这个函数用于检查当前ESP8266与网络服务器的连接情况。如果连接成功,则返回“真”。否则返回“假”。
available()这个函数在有数据接收到并且没有读取完的时候,则会返回“真”,否则返回“假”。
readStringUntil('\n')函数可用于从设备接收到的数据中读取信息。读取到的数据信息将以字符串形式返回。当函数读取到终止字符后,会立即停止函数执行。此时函数所返回的字符串为”终止字符”前的所有字符信息。
//在ESP8266读取响应信息的过程中,服务端可能会断开与客服端的连接,所以这里使用了或。即便断开连接,只要有数据接收到并且没有读取完的时候,available()这个函数返回“真”,while循环语句体就会执行循环。
//服务端报文发送完成后断开与客户端连接,连接断开并且读取完数据信息,则ESP8266跳出while循环。

总结

ESP8266作为客户端向服务端请求连接,连接成功后发送请求报文。服务端收到ESP8266请求报文后发送响应报文给ESP8266,ESP8266通过readStringUntil();函数接收服务端响应报文。
示例参考: 太极创客物联网教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值