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呼吸灯