ESP8266 Arduino开发之路(4)— 通过HTTP进行网络通信

ESP8266 Arduino开发之路(4)— 通过HTTP进行网络通信

一、前言

在我们上网过程中,经常使用网页浏览器来浏览网站信息,浏览网页使用的网络协议即是HTTP协议,实际上,我们的浏览器就是作为一个TCP客户端向向服务器发送网络请求。服务器在接收到客户端请求后会将请求的信息回复给客户端。
参考自: ESP8266网络客户端基本操作

二、网络库介绍

ESP8266-Arduino库中有两个库用于控制ESP8266与网络服务器进行通讯,分别是WiFiClient库和ESP8266HTTPClient库。

ESP8266HTTPClient库相对简单易用,该库的库函数可以自动生成客户端请求信息并解析服务器响应信息,但正是由于该库的库函数为我们做了所有底层工作,这就导致该库不如WiFiclient库灵活。假如我们需要用ESP8266建立自定义客户端请求信息时,就要用WiFiClient库来实现了。因此,在我们使用ESP8266开发项目时,更多的时候是使用WiFiClient库来实现物联网通讯功能。

三、HTTPClient库

如下所示,编写程序,使用ESP8266HTTPClient库实现向网络服务器发送请求。

/*
  ESP8266-NodeMCU作为HttpClient请求服务器
*/
 
#include <ESP8266WiFi.h>                        // 本程序使用ESP8266WiFi库
#include <ESP8266HTTPClient.h>                  // HTTP通信库需要使用

/* 设置Wifi接入信息 */
const char* ssid     = "SixLab";                // 需要连接到的WiFi名
const char* password = "sixlab123";             // 连接的WiFi密码

/* HTTP请求用的URL,注意网址前面必须添加 "http:" */
//#define URL "http://192.168.3.2"
#define URL "http://www.example.com"

void setup() {
  /* 1. 初始化串口通讯波特率为115200*/
  Serial.begin(115200);

  /* 2. 开启wifi连接,连接成功后打印IP地址 */
  WiFi.mode(WIFI_STA);                          // 设置Wifi工作模式为STA,默认为AP+STA模式
  WiFi.begin(ssid, password);                   // 通过wifi名和密码连接到Wifi
  Serial.print("\r\nConnecting to ");           // 串口监视器输出网络连接信息
  Serial.print(ssid); Serial.println(" ...");   // 显示NodeMCU正在尝试WiFi连接
  int i = 0;                                    // 检查WiFi是否连接成功
  while (WiFi.status() != WL_CONNECTED)         // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 
  {                                             // 如果WiFi连接成功则返回值为WL_CONNECTED
    delay(1000);                                // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
    Serial.print("waiting for ");                          
    Serial.print(i++); Serial.println("s...");       
  }                                             
  Serial.println("");                           // WiFi连接成功后
  Serial.println("WiFi connected!");            // NodeMCU将通过串口监视器输出"连接成功"信息。
  Serial.print("IP address: ");                 // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
  Serial.println(WiFi.localIP());               // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。

}

/* 在loop函数中启动一次HTTP请求,并且将服务器响应通过串口输出 */
void loop() {
  /* 1. 新建一个WiFiClient和HTTPClient对象 */
  WiFiClient tcpClient;
  HTTPClient httpClient;

  /* 2. 通过begin函数配置请求地址,第一个参数需填入WiFiClient对象 */
  httpClient.begin(tcpClient, URL); 
  Serial.print("URL: "); Serial.println(URL);

  /* 3. 通过GET函数启动连接并发送HTTP GET请求 */
  int httpCode = httpClient.GET();                // 发送GET请求并返回获得的状态码
  Serial.print("Send GET request to URL: ");
  Serial.println(URL);

  
  /* 4. 如果服务器响应HTTP_CODE_OK(200)则从服务器获取响应体信息并通过串口输出
        如果服务器不响应HTTP_CODE_OK(200)则将服务器响应状态码通过串口输出 */
  if (httpCode == HTTP_CODE_OK) 
  {
    String Payload = httpClient.getString();      // 使用getString函数获取服务器响应体内容
    Serial.print("\r\nServer Respose Code: ");
    Serial.println(httpCode);
    Serial.println("Server Response Payload: ");
    Serial.println(Payload);
  } 
  else 
  {
    Serial.print("\r\nServer Respose Code: ");
    Serial.println(httpCode);
  }
 
  /* 5. 关闭ESP8266与服务器的连接 */
  httpClient.end();

  /* LED闪烁 */
  pinMode(2, OUTPUT);
  while(1){
    digitalWrite(2, LOW);
    delay(300);
    digitalWrite(2, HIGH);
    delay(300);  
  }
}

运行后如下所示,成功发送http请求,并获得回复
在这里插入图片描述

四、WiFiClient库

如下所示,编写程序,使用WiFiClient库实现向网络服务器发送请求。

/*
  ESP8266-NodeMCU作为HttpClient请求服务器
*/
 
#include <ESP8266WiFi.h>                        // 本程序使用ESP8266WiFi库

/* 设置Wifi接入信息 */
const char* ssid     = "SixLab";                // 需要连接到的WiFi名
const char* password = "sixlab123";             // 连接的WiFi密码

/* HTTP请求用的host和端口,注意网址前面不要添加 "http:" */
//#define host "192.168.3.2"
#define host "www.example.com"
const int httpPort = 80;

void setup() {
  /* 1. 初始化串口通讯波特率为115200*/
  Serial.begin(115200);

  /* 2. 开启wifi连接,连接成功后打印IP地址 */
  WiFi.mode(WIFI_STA);                          // 设置Wifi工作模式为STA,默认为AP+STA模式
  WiFi.begin(ssid, password);                   // 通过wifi名和密码连接到Wifi
  Serial.print("\r\nConnecting to ");           // 串口监视器输出网络连接信息
  Serial.print(ssid); Serial.println(" ...");   // 显示NodeMCU正在尝试WiFi连接
  int i = 0;                                    // 检查WiFi是否连接成功
  while (WiFi.status() != WL_CONNECTED)         // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 
  {                                             // 如果WiFi连接成功则返回值为WL_CONNECTED
    delay(1000);                                // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
    Serial.print("waiting for ");                          
    Serial.print(i++); Serial.println("s...");       
  }                                             
  Serial.println("");                           // WiFi连接成功后
  Serial.println("WiFi connected!");            // NodeMCU将通过串口监视器输出"连接成功"信息。
  Serial.print("IP address: ");                 // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
  Serial.println(WiFi.localIP());               // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。

}

/* 在loop函数中启动一次HTTP请求,并且将服务器响应通过串口输出 */
void loop() {
  /* 1. 新建一个WiFiClient对象,即一个Wifi客户端 */
  WiFiClient tcpClient;

  /* 2. 创建一个用于发送Http请求的字符串*/
  String httpGetString = String("GET /") + " HTTP/1.1\r\n" +
                        "Host: " + host + "\r\n" +
                        "Connection: close\r\n" +
                        "\r\n";

  /* 3. 通过connect函数连接到网络服务器,连接成功后发送GET请求,连接失败则输出“连接失败”信息*/
  Serial.print("Connecting to "); Serial.println(host); 
  if(tcpClient.connect(host, httpPort))
  {
    Serial.print("Connected to "); Serial.print(host); Serial.println(" Success!"); 

    /* 1) 向服务器发送HTTP GET请求 */
    tcpClient.print(httpGetString);

    /* 2) 等待服务器返回消息,成功返回消息后打印出来 */
    Serial.println("\r\nWeb Server Response:");    
    while(tcpClient.connected() || tcpClient.available())
    {
      if(tcpClient.available())
      {
        String line = tcpClient.readStringUntil('\n');
        Serial.println(line);  
      }
    }

    /* 3) 收到消息后断开和服务器的连接 */
    tcpClient.stop();
    Serial.print("Disconnected from "); Serial.println(host);
  }
  else
  {
    Serial.println(" connection failed!");
    tcpClient.stop();
  }

  /* LED闪烁 */
  pinMode(2, OUTPUT);
  while(1){
    digitalWrite(2, LOW);
    delay(300);
    digitalWrite(2, HIGH);
    delay(300);  
  }
}

运行后如下所示,成功发送http请求,并获得回复
在这里插入图片描述

五、附录

上一篇:ESP8266 Arduino开发之路(3)— 作为TCP客户端连接到服务器
下一篇:ESP8266 Arduino开发之路(5)— 使用PWM实现LED呼吸灯

  • 8
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
ESP8266是一款基于WiFi的芯片模块,可以用于连接到互联网并进行通信。而Arduino是一款开源的硬件平台,可以通过编写简单的代码来控制各种传感器和执行各种操作。在使用ESP8266Arduino进行通信时,可以使用ESP8266 Arduino软件版来简化开发过程。 引用提到了一个与网络服务器进行简单HTTP通信的库,作者是伊戈尔·马科夫斯基。这个库可以在不阻止程序工作的情况下与服务器进行通信。另一方面,引用提到了一个使用Amg8833测量温度的项目,通过哈夫曼滤波温度数据,使用Oled显示,并通过nRF24L无线发送给主服务器。这个项目使用了ArduinoESP8266来实现。 如果你想在Arduino中使用ESP8266软件版,你可以按照以下步骤操作: 1. 打开路径 C:\Users\你的用户名\Documents\ArduinoData\staging\packages。 2. 将下载好的ESP8266软件版的安装包(zip格式)拖放到该路径下。 3. 然后可以直接在Arduino IDE中安装ESP8266软件版,这样就可以免去下载开发版的长时间过程。 这样,你就可以在Arduino中使用ESP8266软件版来进行开发了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Arduino_ESP8266_HTTP_Client:非阻塞 ESP8266 Arduino 库,用于基于 https 的简单 http 通信](https://download.csdn.net/download/weixin_42116705/19868314)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Arduino使用Amg8833测量温度,并且哈夫曼滤波温度数据,实现Oled显示和通过nRF24L无线发送至主服务器](https://download.csdn.net/download/taoye_11/88217991)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Arduino IDE for esp 8266开发版最新官方安装文件(version 2.7.2)](https://download.csdn.net/download/qq_39592312/12658024)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值