ESP8266做客户端

ESP8266做客户端

1. 传输单一的JSON信息
  • 程序思路

    程序目的:

    1. 解析服务器端传来的json信息
    2. 读取服务器端A0模拟引脚的状态,并串口输出
    3. 读取服务器端D3数字引脚的状态,并使得客户端LED_BUILTIN引脚状态与之相同,从而控制板上LED灯的亮灭状态

    引脚配置

    • pinMode()函数和digitalWrite()函数设置引脚模式配置引脚
    • Ps:服务器端D3数字引脚的状态判断可以使用?:三目运算符进行语法优化

    WiFi连接

    • 创建ESP8266WiFiMulti对象My_WifiMulti
    • My_WifiMulti.addAP() 连接WiFi,连接成功后串口输出

    网络服务:

    • 所有的网络服务都通过httpRequest完成,httpRequestloop()中循环执行

    • 首先创建WiFiClient对象My_Client

    • 发送请求头部分,将GETHostConnection三个参数整合到一个字符串httpRequest

    • 与服务器连接My_Client.connect(IP地址,端口号),可通过判断语句+串口验证是否已经连接上

    • 向服务器发送请求信息My_Client.print(请求头httpRequest)

    • 获取服务器响应状态My_Client,readStringUntil(\n),获取到的信息存储在一个字符串变量中

    • 使用find+if语句跳过HTTP响应头My_Client.find("\r\n\r\n")

    • 解析得到的json信息parseInfo(My_client)

    • 与服务器断开连接My_client.stop()

    json信息解析:

    • 依然是使用ArduinoJsong官网的在线工具。(详细请看:链接
    • 此时,ESP8266是充当客户端的角色,所以我们要将服务器端传过来的json信息反序列化,即选择deserializeJson(doc, My_client)
  • 程序

    #include <ArduinoJson.h>
    #include <ESP8266WiFi.h>
    #include <ESP8266WiFiMulti.h>
    
    ESP8266WiFiMulti My_WifiMulti;  //建立一个ESP8266WiFiMulti对象
    
    const char* host = "192.168.163.9";  //服务端地址
    const int httpPort = 80;             //服务端端口号
    void parseInfo(WiFiClient client);
    
    void setup() {
      Serial.begin(9600);
      Serial.print("\n");
    
      //客户端引脚初始配置
      pinMode(LED_BUILTIN, OUTPUT);
      digitalWrite(LED_BUILTIN, HIGH);
    
      //让ESP8266能够连上网 可同时设置多个Wifi
    
      My_WifiMulti.addAP("TPLINK2.4G", "@@@@@@@@");  // Wifi1
      My_WifiMulti.addAP("username2", "password");   // Wifi2
      My_WifiMulti.addAP("username3", "password");   // Wifi3
    
      int i = 0;
      Serial.print("\n-------------Connected Time:-------------\n");
    
      while (My_WifiMulti.run() != WL_CONNECTED) {
        Serial.print(i++);
        Serial.print("s-> ");
        delay(1000);
      }
      Serial.print("\n-------------WIFI connected successful!-------------\n");
    
      Serial.print("\n-------------WIFI Name:-------------");
      Serial.print(WiFi.SSID());  //连接的Wifi名称
      Serial.print("\n-------------ESP8266 IP address:-------------");
      Serial.print(WiFi.localIP());  //ESP8266在路由器中的IP地址
    }
    
    void loop() {
    
      httprequest("/");
      delay(2000);
      httprequest("/info");
      delay(2000);
      httprequest("/digital_pin");
      delay(2000);
    }
    
    void httprequest(String url)
    {
      WiFiClient client;
      String http_request = String("GET") + url + "HTTP/1.1\n" + "HOST:" + host + "\r\n" + "Connection:close\r\n\r\n";
    
      Serial.print("Connecting to");
      Serial.print(host);
    
      if (client.connect(host, 80)) 
    	{
        Serial.print("Connected Success");
    
        //向服务器发送http请求信息
        client.print(http_request);
        Serial.println("Sending request: ");
        Serial.println(http_request);
    
        //获取服务器响应状态
        String staus_response = client.readStringUntil('\n');
        Serial.print("status_response: ");
        Serial.println(staus_response);
    
        if (client.find("\r\n\r\n"))
        {
          Serial.print("Find the end of request header!");
          Serial.print("Start Parsing");
        }
        parseInfo(client);
      }
        else 
          Serial.print("Connected failed");
    
        client.stop();  //断开与服务器的连接
    }
    
    
    void parseInfo(WiFiClient client) {
    
      //-------------------------------以下程序来自于官网在线工具生成-------------------------------
      StaticJsonDocument<256> doc;
    
      DeserializationError error = deserializeJson(doc, client);
    
      if (error) {
        Serial.print(F("deserializeJson() failed: "));
        Serial.println(error.f_str());
        return;
      }
    
      JsonObject info = doc["info"];
      const char* info_name = info["name"];  // "caixvkun"
      const char* info_url = info["url"];    // "www.csdn.com"
      float info_time = info["time"];        // 2.5
    
      JsonObject digital_pin = doc["digital_pin"];
      const char* digital_pin_d1 = digital_pin["d1"];  // d1
      const char* digital_pin_d2 = digital_pin["d2"];  // d2
      const char* digital_pin_d3 = digital_pin["d3"];  // d3
      bool bool_digital_pin_d3 = bool(digital_pin_d3);
    
      const char* analog_pin_a0 = doc["analog_pin"]["a0"];  // "500"
      //-------------------------------以上程序来自于官网在线工具生成-------------------------------
    
      if(analog_pin_a0) //读取A0状态
        Serial.println("Server Json has analog_pin_a0: HIGH");
      else 
        Serial.println("Server Json has analog_pin_a0: LOW");
    
      if(bool_digital_pin_d3) //改变客户端D3状态
        digitalWrite(LED_BUILTIN,LOW);
      else
        digitalWrite(LED_BUILTIN,HIGH);
    }
    
  • 注意问题

    1. LED_BUILTIN不用define直接用
    2. Wifi连接操作是放在setup()函数里面的,不能放在这上面
    3. httprequest(String url)是个有参函数
posted @ 2022-12-11 15:44  不会嵌入式的摆烂王  阅读(187)  评论(0)    收藏  举报