ESP8266做客户端
1. 传输单一的JSON信息
-
程序思路
程序目的:
- 解析服务器端传来的json信息
- 读取服务器端
A0
模拟引脚的状态,并串口输出 - 读取服务器端
D3
数字引脚的状态,并使得客户端LED_BUILTIN
引脚状态与之相同,从而控制板上LED灯的亮灭状态
引脚配置:
pinMode()
函数和digitalWrite()
函数设置引脚模式和配置引脚- Ps:服务器端
D3
数字引脚的状态判断可以使用?:
三目运算符进行语法优化
WiFi连接:
- 创建
ESP8266WiFiMulti
对象My_WifiMulti
- 用
My_WifiMulti.addAP()
连接WiFi,连接成功后串口输出
网络服务:
-
所有的网络服务都通过
httpRequest
完成,httpRequest
在loop()
中循环执行 -
首先创建
WiFiClient
对象My_Client
-
发送请求头部分,将
GET
、Host
、Connection
三个参数整合到一个字符串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); }
-
注意问题
LED_BUILTIN
不用define直接用- Wifi连接操作是放在
setup()
函数里面的,不能放在这上面 httprequest(String url)
是个有参函数