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)
{
}