位置导航: 首页 / 物联网教程 / 第3章 – 用C/C++开发物联网 / 3-4 网络客户端 / 本页
在之前的课程中,我们学习了如何使用ESP8266客户端向ESP8266服务器发送数据。这一操作中,数据是由客户端向服务器传输的。下面我们来看一看如何让客户端获取服务器的数据信息。
这一示例中,客户端会定时向服务器发送请求信息。服务器一旦接收到客户端请求后,会把服务器开发板上的按键引脚状态发送给客户端。客户端在接收到这一信息后,会利用该信息来控制客户端的LED点亮和熄灭。最终实现的效果是,通过控制服务器端的板上按键,我们可以控制客户端板上LED的点亮和熄灭。
注意,下示例中的服务器端和客户端ESP8266必须连接同一WiFi网络,方可实现数据通讯。
使用ESP8266客户端从ESP8266服务器获取数据
服务器端程序:
– 实时获取服务器端开发板上按钮引脚状态
– 当有客户端向ESP8266服务器的/update发送请求时,将服务器的按键引脚状态通过响应信息回复给客户端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
/********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : cgd_server 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : CYNO朔 日期/Date(YYYYMMDD) : 20200228 程序目的/Purpose : 演示如何实现两个NodeMCU间通过WiFi进行通讯。两台NodeMCU一个以服务器模式运行, 一个以客户端模式运行。用户可通过服务器端开发板上按钮控制客户端的板上LED点亮和熄灭 此代码为服务器端代码。此代码主要功能: - 实时获取服务器端开发板上按钮引脚状态 - 当有客户端向ESP8266服务器的/update发送请求时,将服务器的按键引脚状态 通过响应信息回复给客户端 ***********************************************************************/ #include <ESP8266WiFi.h> // 本程序使用 ESP8266WiFi库 #include <ESP8266WiFiMulti.h> // ESP8266WiFiMulti库 #include <ESP8266WebServer.h> // ESP8266WebServer库 #define buttonPin D3 // 按钮引脚D3 ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象,对象名称是'wifiMulti' ESP8266WebServer esp8266_server(80);// 建立网络服务器对象,该对象用于响应HTTP请求。监听端口(80) IPAddress local_IP(192, 168, 0, 123); // 设置ESP8266-NodeMCU联网后的IP IPAddress gateway(192, 168, 0, 1); // 设置网关IP(通常网关IP是WiFI路由IP) IPAddress subnet(255, 255, 255, 0); // 设置子网掩码 IPAddress dns(192,168,0,1); // 设置局域网DNS的IP(通常局域网DNS的IP是WiFI路由IP) bool pinState; // 存储引脚状态用变量 void setup(){ Serial.begin(9600); // 启动串口通讯 Serial.println(""); pinMode(buttonPin, INPUT_PULLUP); // 将按键引脚设置为输入上拉模式 // 设置开发板网络环境 if (!WiFi.config(local_IP, gateway, subnet)) { Serial.println("Failed to ESP8266 IP"); } //通过addAp函数存储 WiFi名称 WiFi密码 wifiMulti.addAP("taichi-maker1", "12345678"); // 这三条语句通过调用函数addAP来记录3个不同的WiFi网络信息。 wifiMulti.addAP("taichi-maker2", "87654321"); // 用户可自行增加、修改、删除此处网络连接信息。 wifiMulti.addAP("taichi-maker3", "13572468"); // 尝试网络连接 int i = 0; while (wifiMulti.run() != WL_CONNECTED) { delay(1000); Serial.print(i++); Serial.print(' '); } // WiFi连接成功后,通过串口监视器输出连接信息 Serial.println(""); Serial.print("Connected to "); Serial.println(WiFi.SSID()); Serial.print("IP address:\t"); Serial.println(WiFi.localIP()); // 设置网络服务器 esp8266_server.on("/update", handleUpdate); // 处理客户端HTTP请求LED状态 esp8266_server.begin(); Serial.println("HTTP esp8266_server started"); } void loop(){ pinState = digitalRead(buttonPin); // 获取引脚状态 esp8266_server.handleClient(); // 处理http服务器访问 } // 处理客户端HTTP请求LED状态button: 1 void handleUpdate() { String pinStateStr; pinState == HIGH ? pinStateStr = "1" : pinStateStr = "0"; esp8266_server.send(200, "text/html", "buttonState: " + pinStateStr); } |
客户端程序:
– 定时向服务器发送请求,从而获取服务器开发板上按钮状态
– 将服务器端发来的按钮引脚电平状态解析为数字量,并且用该数字量控制板上LED点亮和熄灭
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
/********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : cgd_client 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : CYNO朔 日期/Date(YYYYMMDD) : 20200228 程序目的/Purpose : 演示如何实现两个NodeMCU间通过WiFi进行通讯。两台NodeMCU一个以服务器模式运行, 一个以客户端模式运行。 此代码为客户端代码。此代码主要功能: - 定时向服务器发送请求信息,从而获取服务器开发板上按钮状态 - 将服务器端发来的按钮引脚电平状态解析为数字量,并且用该数字量控制板上LED点亮和熄灭 ***********************************************************************/ #include <ESP8266WiFi.h> #include <ESP8266WiFiMulti.h> ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象 const char* host = "192.168.0.123"; // 网络服务器IP const int httpPort = 80; // http端口80 void setup(){ Serial.begin(9600); Serial.println(""); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1"); // 将需要连接的一系列WiFi ID和密码输入这里 wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); // ESP8266-NodeMCU再启动后会扫描当前网络 wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); // 环境查找是否有这里列出的WiFi ID。如果有 Serial.println("Connecting ..."); int i = 0; while (wifiMulti.run() != WL_CONNECTED) { // 尝试进行wifi连接。 delay(1000); Serial.print(i++); Serial.print(' '); } // WiFi连接成功后将通过串口监视器输出连接成功信息 Serial.println(""); Serial.print("Connected to "); Serial.println(WiFi.SSID()); // WiFi名称 Serial.print("IP address:\t"); Serial.println(WiFi.localIP()); // IP } void loop(){ wifiClientRequest(); delay(3000); } void wifiClientRequest(){ WiFiClient client; // 建立WiFiClient对象 bool buttonState; // 储存服务器按钮状态变量 Serial.print("Connecting to "); Serial.print(host); // 连接服务器 if (client.connect(host, httpPort)){ Serial.println(" Success!"); // 建立客户端请求信息 String httpRequest = String("GET /update") + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n" + "\r\n"; // 发送客户端请求 Serial.println("Sending request: ");Serial.print(httpRequest); client.print(httpRequest); // 获取服务器响应信息中的按钮状态信息 while (client.connected() || client.available()){ if(client.find("buttonState:")){ buttonState = client.parseInt(); Serial.print("buttonState: " ); Serial.println(buttonState); } } } else{ Serial.println(" failed!"); } Serial.println("==============="); client.stop(); // 停止客户端 // 根据服务器按键状态点亮或熄灭LED buttonState == 0 ? digitalWrite(LED_BUILTIN, LOW) : digitalWrite(LED_BUILTIN, HIGH); } |