NodeMCU-32S网络客户端
土豆 2022/10/25 esp32
# http客户端网络通讯
声明HTTPClient对象,对象名称httpClient。
begin函数送HTTP请求的目标URL。
根据该状态码,我们可以判断服务器是否成功接收到了ESP8266客户端的请求。如果服务器成功接收到请求,我们就可以在接下来使用getString函数来获取服务器响应报文(服务器响应体)信息,并且将该信息传递给responsePayload变量以便我们在后面通过串口监视器显示服务器响应报文。
#include <WiFi.h>
#include <HTTPClient.h>
// 测试HTTP请求用的URL
#define URL "http://www.example.com"
const char* ssid = "tudou";
const char* password = "12345678";
void httpClientRequest(){
// 创建HttpClient对象
HTTPClient httpClient;
// 通过begin函数配置请求地址。
httpClient.begin(URL);
Serial.print("URL: ");
Serial.println(URL);
// 发送GET请求
int httpCode = httpClient.GET();
Serial.print("Send GET request to URL: ");
Serial.println(URL);
// 响应200
if(httpCode == HTTP_CODE_OK){
// 使用getString函数获取服务器响应体内容
String responsePayload = httpClient.getString();
Serial.println("Server Response Payload: ");
Serial.println(responsePayload);
}else{
Serial.println("Server Response Code: ");
Serial.println(httpCode);
}
// 关闭与服务器的连接
httpClient.end();
}
void setup()
{
Serial.begin(115200);
// 设置esp32工作模式为无线终端模式
WiFi.mode(WIFI_STA);
// 开始连接wifi
WiFi.begin(ssid,password);
// 等待WiFi连接,连接成功打印IP
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.print("WiFi Connected!");
httpClientRequest();
}
void loop(void)
{
}
# wifi客户端网络通讯
这部分逻辑判断语句中的判断条件是client.connect(host, httpPort)
的返回值。ESP8266所实现的网络客户端是通过connect
函数来实现与网络服务器的连接的。
connected()
这个函数用于检查当前ESP8266与网络服务器的连接情况。
available()
函数用于检查网络客户端是否有接收到服务器发来的信息。
client.readStringUntil('\n')
函数会将服务器响应信息中逐行分解为字符串。
#include <WiFi.h>
// 测试HTTP请求用的host
const char *host = "http://www.example.com";
// 端口
const int httpPort = 80;
const char *ssid = "tudou";
const char *password = "12345678";
void wifiClientRequest()
{
// 创建Wifi客户端对象
WiFiClient client;
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);
if (client.connect(host, httpPort))
{
Serial.println(" Success!");
client.print(httpRequest);
Serial.println("sending request: ");
Serial.println(httpRequest);
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();
}
}
void setup()
{
Serial.begin(115200);
// 设置esp32工作模式为无线终端模式
WiFi.mode(WIFI_STA);
// 开始连接wifi
WiFi.begin(ssid, password);
// 等待WiFi连接,连接成功打印IP
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.print("WiFi Connected!");
wifiClientRequest();
}
void loop(void)
{
}
# 客户端向服务器发送数据信息
服务器端程序: – 接收客户端发来的http请求并且解析信息中的数据信息 – 将解析的数据信息通过串口监视器显示供用户查看 – 将解析的客户端按键状态信息用于控制服务器端板上LED的点亮和熄灭
#include <WiFi.h>
#include <WiFiMulti.h>
#include <WebServer.h>
WiFiMulti wifiMulti;
WebServer server(80);
// 设置联网后的ip
IPAddress local_IP(192, 168, 0, 123);
// 设置网关
IPAddress gateway(192, 168, 0, 1);
// 子网掩码
IPAddress subnet(255, 255, 255, 0);
// dns
IPAddress dns(192,168,0,1);
// 测试HTTP请求用的host
const char *host = "http://www.example.com";
// 端口
const int httpPort = 80;
const char *ssid = "tudou";
const char *password = "12345678";
void handleUpdate()
{
// 获取客户端发送HTTP信息中的浮点数值
float floatValue = server.arg("float").toFloat();
// 获取客户端发送HTTP信息中的整数数值
int intValue = server.arg("int").toInt();
// 获取客户端发送HTTP信息中的按键控制量
int buttonValue = server.arg("button").toInt();
server.send(200, "text/plain", "Received");
buttonValue == 0 ? digitalWrite(LED_BUILTIN, LOW) : digitalWrite(LED_BUILTIN, HIGH);
// 通过串口监视器输出获取到的变量数值
Serial.print("floatValue = ");
Serial.println(floatValue);
Serial.print("intValue = ");
Serial.println(intValue);
Serial.print("buttonValue = ");
Serial.println(buttonValue);
Serial.println("=================");
}
void setup()
{
Serial.begin(115200);
Serial.println("");
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
// 设置开发板网络环境
if (!WiFi.config(local_IP, gateway, subnet)) {
Serial.println("Failed to Config ESP8266 IP");
}
wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1");
wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2");
wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3");
Serial.println("Connecting ...");
// 尝试进行wifi连接。
while (wifiMulti.run() != WL_CONNECTED) {
delay(250);
Serial.print('.');
}
// WiFi连接成功后将通过串口监视器输出连接成功信息
Serial.println('\n');
Serial.print("Connected to ");
Serial.println(WiFi.SSID());
Serial.print("IP address:\t");
Serial.println(WiFi.localIP());
// 处理更新
server.on("/update", handleUpdate);
server.begin();
Serial.println("HTTP server started");
}
void loop(void)
{
}
客户端程序: – 客户端通过HTTP协议向服务器发送信息 – 信息中包含客户端按键开关引脚状态用于控制服务器板上LED的点亮和熄灭 – 信息中还包含测试数据以便我们更好的了解如何使用ESP32发送和接收物联网数据信息
#include <WiFi.h>
#include <WiFiMulti.h>
#define buttonPin D3
WiFiMulti wifiMulti;
// 存储客户端按键控制数据
bool buttonState;
// 存储客户端发送的浮点型测试数据
float clientFloatValue;
//存储客户端发送的整数型测试数据
int clientIntValue;
const char* host = "192.168.0.123";
const int httpPort = 80;
void wifiClientRequest()
{
WiFiClient client;
// 将需要发送的数据信息放入客户端请求
String url = "/update?float=" + String(clientFloatValue) +
"&int=" + String(clientIntValue) +
"&button=" + String(buttonState);
// 建立字符串,用于HTTP请求
String httpRequest = String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n" +
"\r\n";
Serial.print("Connecting to ");
Serial.print(host);
if (client.connect(host, httpPort)) {
Serial.println(" Sucess");
client.print(httpRequest);
Serial.println("Sending request: ");
Serial.println(httpRequest);
} else{
Serial.println(" failed");
}
client.stop();
}
void setup()
{
Serial.begin(115200);
Serial.println("");
// 将按键引脚设置为输入上拉模式
pinMode(buttonPin, INPUT_PULLUP);
wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1");
wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2");
wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3");
Serial.println("Connecting ...");
while (wifiMulti.run() != WL_CONNECTED) {
delay(250);
Serial.print('.');
}
// WiFi连接成功后将通过串口监视器输出连接成功信息
Serial.println('\n');
Serial.print("Connected to ");
Serial.println(WiFi.SSID());
Serial.print("IP address:\t");
Serial.println(WiFi.localIP());
}
void loop(void){
// 获取按键引脚状态
buttonState = digitalRead(buttonPin);
// 改变测试用变量数值用于服务器端接收数据检测
clientFloatValue += 1.5;
clientIntValue += 2;
// 发送请求
wifiClientRequest();
delay(1000);
}
void loop(void)
{
}