ESP8266开发之旅 网络篇⑦ TCP Server TCP Client (7)

例子介绍:
    8266作为web server端,打开PC浏览器输入IP地址,请求web server。
例子源码:

/** * Demo: * 演示web Server功能 * 打开PC浏览器 输入IP地址。请求web server * @author 单片机菜鸟 * @date 2019/09/05 */ #include <ESP8266WiFi.h> const char* ssid = "TP-LINK_5344";//wifi账号 这里需要修改 const char* password = "xxxx";//wifi密码 这里需要修改 //创建 tcp server 端口号是80 WiFiServer server(80); void setup(){ Serial.begin(115200); Serial.println(); Serial.printf("Connecting to %s ", ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED){ delay(500); Serial.print("."); } Serial.println(" connected"); //启动TCP 连接 server.begin(); //打印TCP server IP地址 Serial.printf("Web server started, open %s in a web browser\n", WiFi.localIP().toString().c_str()); } /** * 模拟web server 返回http web响应内容 * 这里是手动拼接HTTP响应内容 * 后面楼主会继续讲解另外两个专用于http请求的库 */ String prepareHtmlPage(){ String htmlPage = String("HTTP/1.1 200 OK\r\n") + "Content-Type: text/html\r\n" + "Connection: close\r\n" + // the connection will be closed after completion of the response "Refresh: 5\r\n" + // refresh the page automatically every 5 sec "\r\n" + "<!DOCTYPE HTML>" + "<html>" + "Analog input: " + String(analogRead(A0)) + "</html>" + "\r\n"; return htmlPage; } void loop(){ WiFiClient client = server.available(); // wait for a client (web browser) to connect if (client){ Serial.println("\n[Client connected]"); while (client.connected()){ // 不断读取请求内容 if (client.available()){ String line = client.readStringUntil('\r'); Serial.print(line); // wait for end of client's request, that is marked with an empty line if (line.length() == 1 && line[0] == '\n'){ //返回响应内容 client.println(prepareHtmlPage()); break; } } //由于我们设置了 Connection: close 当我们响应数据之后就会自动断开连接 } delay(100); // give the web browser time to receive the data // close the connection: client.stop(); Serial.println("[Client disonnected]"); } }

测试结果:

7.3 演示简单web Server功能,webserver会根据请求来做不同的操作

例子介绍:
    8266作为WiFiServer端,演示简单web Server功能,webserver会根据请求来做不同的操作。
例子源码:

/* * Demo: * 演示简单web Server功能 * web server会根据请求来做不同的操作 * 打印 /gpio0 * 打印 /gpio1 * server_ip就是ESP8266的Ip地址 * @author 单片机菜鸟 * @date 2019/09/05 */ #include <ESP8266WiFi.h> //以下三个定义为调试定义 #define DebugBegin(baud_rate) Serial.begin(baud_rate) #define DebugPrintln(message) Serial.println(message) #define DebugPrint(message) Serial.print(message) const char* ssid = "TP-LINK_5344";//wifi账号 这里需要修改 const char* password = "xxxx";//wifi密码 这里需要修改 // 创建tcp server WiFiServer server(80); void setup() { DebugBegin(115200); delay(10); // Connect to WiFi network DebugPrintln(""); DebugPrintln(String("Connecting to ") + ssid); //我只想做个安静的美男子 STA WiFi.mode(WIFI_STA); //我想连接路由wifi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); DebugPrint("."); } DebugPrintln(""); DebugPrintln("WiFi connected"); // 启动server server.begin(); DebugPrintln("Server started"); // 打印IP地址 DebugPrintln(WiFi.localIP().toString()); } void loop() { // 等待有效的tcp连接 WiFiClient client = server.available(); if (!client) { return; } DebugPrintln("new client"); //等待client数据过来 while (!client.available()) { delay(1); } // 读取请求的第一行 会包括一个url,这里只处理url String req = client.readStringUntil('\r'); DebugPrintln(req); //清掉缓冲区数据 据说这个方法没什么用 可以换种实现方式 client.flush(); // 开始匹配 int val; if (req.indexOf("/gpio/0") != -1) { DebugPrintln("/gpio0"); val = 0; } else if (req.indexOf("/gpio/1") != -1) { DebugPrintln("/gpio1"); val = 1; } else { DebugPrintln("invalid request"); //关闭这个client请求 client.stop(); return; } //清掉缓冲区数据 client.flush(); // 准备响应数据 String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now "; s += (val) ? "high" : "low"; s += "</html>\n"; // 发送响应数据给client client.print(s); delay(1); DebugPrintln("Client disonnected"); // The client will actually be disconnected // when the function returns and 'client' object is detroyed }

测试结果:

8. 总结

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzpgfx.html