首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Stream– ESP8266物联网应用,(客户端向服务器发送数据信息& 客户端向服务器请求数据信息)

  • 25-03-07 16:22
  • 4494
  • 5882
blog.csdn.net

Stream– ESP8266物联网应用

Stream对于ESP8266-Arduino语言来说指的是数据序列。请留意:在C++编程中Stream常被翻译作“流”。我们认为将Stream称为数据序列更加直观。因为数据序列这一概念有两个很关键特点。

第一个特点是“序”,即数据序列不能是杂乱无章的数据罗列。

第二个特点是“列”,即数据序列是排成一列的。

代码实例

使用串口监视器演示Stream概念

  1. /**********************************************************************
  2. 项目名称/Project : 零基础入门学用物联网
  3. 程序名称/Program name : stream_readString
  4. 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
  5. 作者/Author : CYNO朔
  6. 日期/Date(YYYYMMDD) : 20200308
  7. 程序目的/Purpose :
  8. Stream类用于处理字符数据流或二进制数据流。Stream类是不能被直接调用的。
  9. 然而当我们使用基于Stream类的库时,都会调用Stream中的内容。
  10. 以下Arduino库及相应库中的类都是基于Stream类所实现的。
  11. 库 类
  12. Serial Serial
  13. SoftwareSerial SoftwareSerial
  14. Ehternet EthernetClient
  15. ESP8266FS File
  16. SD File
  17. Wire Wire
  18. GSM GSMClient
  19. WifiClient WiFiClient
  20. WiFiServer WiFiServer
  21. WiFiUDP WiFiUDP
  22. WiFiClientSecure WiFiClientSecure
  23. 此程序使用Serial库来演示Stream类中的available()以及
  24. readString函数的使用方法。
  25. available函数将会返回开发板所接收到的stream中等待读取的字节数。
  26. readString函数将读取stream中的字符并存储到字符中。
  27. -----------------------------------------------------------------------
  28. 本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。
  29. 该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页:
  30. http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
  31. ***********************************************************************/
  32. void setup() {
  33. // 启动串口通讯
  34. Serial.begin(9600);
  35. Serial.println();
  36. }
  37. void loop() {
  38. if (Serial.available()){ // 当串口接收到信息后
  39. String serialData = Serial.readString(); // 将接收到的信息使用readString()存储于serialData变量
  40. Serial.print(serialData); // 以便查看serialData变量的信息
  41. }
  42. }

在本示例中,我们使用了Serial.available来判断ESP8266开发板是否接收到串口数据。这里的开发板通过串口所接收到的数据就是Stream数据。另外,程序通过Serial.println语句将接收到的Stream数据通过串口输出并显示在串口监视器中,这里ESP8266通过串口所输出的数据也是Stream数据。换句话说,ESP8266开发板通过串口收发的数据都是Stream数据。

使用HTTP请求和响应信息演示Stream概念 

  1. /**********************************************************************
  2. 项目名称/Project : 零基础入门学用物联网
  3. 程序名称/Program name : wifiClient_request_basic
  4. 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
  5. 作者/Author : Dapenson
  6. 日期/Date(YYYYMMDD) : 20200325
  7. 程序目的/Purpose :
  8. 此程序用于演示如何使用esp8266作为互联网客户端向www.example.com网站服务器发送http请求,
  9. 并且将网站服务器响应的信息输出在屏幕中
  10. -----------------------------------------------------------------------
  11. 修订历史/Revision History
  12. 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
  13. 20200411 CYNO朔 001 将请求服务器改为www.example.com
  14. -----------------------------------------------------------------------
  15. 本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。
  16. 该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页:
  17. http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
  18. ***********************************************************************/
  19. #include
  20. const char* host = "www.example.com"; // 网络服务器地址
  21. const int httpPort = 80; // http端口80
  22. // 设置wifi接入信息(请根据您的WiFi信息进行修改)
  23. const char* ssid = "taichimaker";
  24. const char* password = "12345678";
  25. void setup() {
  26. //初始化串口设置
  27. Serial.begin(9600);
  28. Serial.println("");
  29. //设置ESP8266工作模式为无线终端模式
  30. WiFi.mode(WIFI_STA);
  31. //开始连接wifi
  32. WiFi.begin(ssid, password);
  33. //等待WiFi连接,连接成功打印IP
  34. while (WiFi.status() != WL_CONNECTED) {
  35. delay(1000);
  36. Serial.print(".");
  37. }
  38. Serial.println("");
  39. Serial.println("WiFi Connected!");
  40. wifiClientRequest();
  41. }
  42. void loop(){}
  43. // 向服务器发送HTTP请求
  44. void wifiClientRequest(){
  45. // 建立WiFi客户端对象,对象名称client
  46. WiFiClient client;
  47. // 建立字符串,用于HTTP请求
  48. String httpRequest = String("GET /") + " HTTP/1.1\r\n" +
  49. "Host: " + host + "\r\n" +
  50. "Connection: close\r\n" +
  51. "\r\n";
  52. // 通过串口输出连接服务器名称以便查阅连接服务器的网址
  53. Serial.print("Connecting to ");
  54. Serial.print(host);
  55. // 连接网络服务器,以下段落中的示例程序为本程序重点1
  56. // 请参考太极创客网站中关于本程序的讲解页面获取详细说明信息。网址:
  57. // http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
  58. if (client.connect(host, httpPort)){
  59. Serial.println(" Success!"); // 连接成功后串口输出“Success”信息
  60. client.print(httpRequest); // 向服务器发送合同谈判请求
  61. Serial.println("Sending request: ");// 通过串口输出HTTP请求信息内容以便查阅
  62. Serial.println(httpRequest);
  63. // 通过串口输出网络服务器响应信息, 以下段落中的示例程序为本程序重点2
  64. // 请参考太极创客网站中关于本程序的讲解页面获取详细说明信息。网址:
  65. // http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
  66. Serial.println("Web Server Response:");
  67. while (client.connected() || client.available()){
  68. if (client.available()){
  69. String line = client.readStringUntil('\n');
  70. Serial.println(line);
  71. }
  72. }
  73. client.stop(); // 断开与服务器的连接
  74. Serial.print("Disconnected from "); // 并且通过串口输出断开连接信息
  75. Serial.print(host);
  76. } else{ // 如果连接不成功则通过串口输出“连接失败”信息
  77. Serial.println(" connection failed!");
  78. client.stop();
  79. }
  80. }

ESP8266开发板通过client.readStringUntil来读取服务器响应信息。这里服务器响应信息也是Stream数据

使用File对象演示Stream概念

  1. /**********************************************************************
  2. 项目名称/Project : 零基础入门学用物联网
  3. 程序名称/Program name : file_stream_demo
  4. 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
  5. 作者/Author : CYNO 朔
  6. 日期/Date(YYYYMMDD) : 20200506
  7. 程序目的/Purpose :
  8. 通过File对象演示Stream操作
  9. ***********************************************************************/
  10. #include
  11. String file_name = "/taichi-maker/notes.txt"; //被读取的文件位置和名称
  12. void setup() {
  13. Serial.begin(9600);
  14. Serial.println("");
  15. // 启动SPIFFS
  16. if(SPIFFS.begin()){
  17. Serial.println("SPIFFS Started.");
  18. } else {
  19. Serial.println("SPIFFS Failed to Start.");
  20. }
  21. File dataFile = SPIFFS.open(file_name, "w");// 建立File对象用于向SPIFFS中的file对象(即/notes.txt)写入信息
  22. dataFile.println("Hello IOT World."); // 向dataFile写入字符串信息
  23. dataFile.close(); // 完成文件写入后关闭文件
  24. Serial.println("Finished Writing data to SPIFFS");
  25. // 使用find函数从dataFile中找到指定信息
  26. Serial.print("Try to find IOT in ");Serial.println(file_name);
  27. dataFile = SPIFFS.open(file_name, "r"); // 以“r”模式再次打开闪存文件
  28. if (dataFile.find("IOT")){ // 在闪存文件中查找文字"IOT"
  29. Serial.print("Found IOT in file: "); // 如果找到则告知用户找到文字"IOT"
  30. Serial.println(file_name);
  31. }
  32. // 使用readString读取执行完find函数后的dataFile内容并显示与串口监视器
  33. Serial.println("Use readString to get contents of dataFile after find");
  34. Serial.println(dataFile.readString());
  35. dataFile.close(); // 完成操作后关闭文件
  36. }
  37. void loop() {}

使用dataFile.find从闪存文件内容里查找指定信息。使用dataFile.readString来获取信息。这些操作都是针对Stream数据的操作。

客户端向服务器发送数据信息 

使用ESP8266客户端向ESP8266服务器发送数据 

ESP8266客户端将会通过HTTP协议向ESP8266服务器发送信息。在运行过程中,客户端ESP8266将会实时检测板上的按键状态,并且把按键状态发送给服务器。服务器在接收到客户端按键状态后,可以根据客户端按键状态来控制服务器端板上的LED点亮和熄灭。最终实现的效果是,我们可以通过客户端ESP8266开发板上的按键来“遥控”服务器上的LED点亮和熄灭。

服务器端程序:

– 接收客户端发来的http请求并且解析信息中的数据信息
– 将解析的数据信息通过串口监视器显示供用户查看
– 将解析的客户端按键状态信息用于控制服务器端板上LED的点亮和熄灭

  1. /**********************************************************************
  2. 项目名称/Project : 零基础入门学用物联网
  3. 程序名称/Program name : csd_server
  4. 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
  5. 作者/Author : CYNO朔
  6. 日期/Date(YYYYMMDD) : 20200228
  7. 程序目的/Purpose :
  8. 演示如何实现两个NodeMCU间通过WiFi进行通讯。两台NodeMCU一个以服务器模式运行,
  9. 一个以客户端模式运行。
  10. 此代码为客户端代码。此代码主要功能:
  11. - 接收客户端发来的http请求
  12. - 解析客户端请求中的数据信息
  13. - 将解析的数据信息通过串口监视器显示供用户查看
  14. - 将解析的客户端按键状态信息用于控制板上LED的点亮和熄灭
  15. -----------------------------------------------------------------------
  16. 修订历史/Revision History
  17. 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
  18. 20200229 CYNO朔 0.01 加入IP设置
  19. ***********************************************************************/
  20. #include
  21. #include // 使用WiFiMulti库
  22. #include // 使用WebServer库
  23. ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象,对象名称是 'wifiMulti'
  24. ESP8266WebServer server(80); // 建立网络服务器对象,该对象用于响应HTTP请求。监听端口(80)
  25. IPAddress local_IP(192, 168, 0, 123); // 设置ESP8266-NodeMCU联网后的IP
  26. IPAddress gateway(192, 168, 0, 1); // 设置网关IP(通常网关IP是WiFI路由IP)
  27. IPAddress subnet(255, 255, 255, 0); // 设置子网掩码
  28. IPAddress dns(192,168,0,1); // 设置局域网DNS的IP(通常局域网DNS的IP是WiFI路由IP)
  29. void setup(void){
  30. Serial.begin(9600); // 启动串口通讯
  31. Serial.println("");
  32. pinMode(LED_BUILTIN, OUTPUT);
  33. digitalWrite(LED_BUILTIN, HIGH);
  34. // 设置开发板网络环境
  35. if (!WiFi.config(local_IP, gateway, subnet)) {
  36. Serial.println("Failed to Config ESP8266 IP");
  37. }
  38. wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1"); // 将需要连接的一系列WiFi ID和密码输入这里
  39. wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); // ESP8266-NodeMCU再启动后会扫描当前网络
  40. wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); // 环境查找是否有这里列出的WiFi ID。如果有
  41. Serial.println("Connecting ..."); // 则尝试使用此处存储的密码进行连接。
  42. // 尝试进行wifi连接。
  43. while (wifiMulti.run() != WL_CONNECTED) {
  44. delay(250);
  45. Serial.print('.');
  46. }
  47. // WiFi连接成功后将通过串口监视器输出连接成功信息
  48. Serial.println('\n');
  49. Serial.print("Connected to ");
  50. Serial.println(WiFi.SSID()); // 通过串口监视器输出连接的WiFi名称
  51. Serial.print("IP address:\t");
  52. Serial.println(WiFi.localIP()); // 通过串口监视器输出ESP8266-NodeMCU的IP
  53. server.on("/update", handleUpdate); // 处理服务器更新函数
  54. server.begin(); // 启动网站服务
  55. Serial.println("HTTP server started");
  56. }
  57. void loop(void){
  58. server.handleClient(); // 检查http服务器访问
  59. }
  60. void handleUpdate(){
  61. float floatValue = server.arg("float").toFloat(); // 获取客户端发送HTTP信息中的浮点数值
  62. int intValue = server.arg("int").toInt(); // 获取客户端发送HTTP信息中的整数数值
  63. int buttonValue = server.arg("button").toInt(); // 获取客户端发送HTTP信息中的按键控制量
  64. server.send(200, "text/plain", "Received"); // 发送http响应
  65. buttonValue == 0 ? digitalWrite(LED_BUILTIN, LOW) : digitalWrite(LED_BUILTIN, HIGH);
  66. // 通过串口监视器输出获取到的变量数值
  67. Serial.print("floatValue = "); Serial.println(floatValue);
  68. Serial.print("intValue = "); Serial.println(intValue);
  69. Serial.print("buttonValue = "); Serial.println(buttonValue);
  70. Serial.println("=================");
  71. }

客户端程序:

– 客户端通过HTTP协议向服务器发送信息
– 信息中包含客户端按键开关引脚状态用于控制服务器板上LED的点亮和熄灭
– 信息中还包含测试数据以便我们更好的了解如何使用ESP8266发送和接收物联网数据信息

  1. /**********************************************************************
  2. 项目名称/Project : 零基础入门学用物联网
  3. 程序名称/Program name : csd_client
  4. 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
  5. 作者/Author : CYNO朔
  6. 日期/Date(YYYYMMDD) : 20200228
  7. 程序目的/Purpose :
  8. 演示如何实现两个NodeMCU间通过WiFi进行通讯。两台NodeMCU一个以服务器模式运行,
  9. 一个以客户端模式运行。
  10. 此代码为客户端代码。此代码主要功能:
  11. - 通过HTTP协议向服务器发送HTTP请求
  12. - HTTP请求中包含客户端按键开关引脚状态和程序测试数据
  13. -----------------------------------------------------------------------
  14. 修订历史/Revision History
  15. 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
  16. -----------------------------------------------------------------------
  17. http信息发送说明
  18. 192.168.0.123/update?float=1.5&int=2&button=0
  19. ***********************************************************************/
  20. #include
  21. #include // 使用WiFiMulti库
  22. #define buttonPin D3 // 按钮引脚D3
  23. ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象,对象名称是 'wifiMulti'
  24. bool buttonState; //存储客户端按键控制数据
  25. float clientFloatValue; //存储客户端发送的浮点型测试数据
  26. int clientIntValue; //存储客户端发送的整数型测试数据
  27. const char* host = "192.168.0.123"; // 即将连接服务器网址/IP
  28. const int httpPort = 80; // 即将连接服务器端口
  29. void setup(void){
  30. Serial.begin(9600); // 启动串口通讯
  31. Serial.println("");
  32. pinMode(buttonPin, INPUT_PULLUP); // 将按键引脚设置为输入上拉模式
  33. wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1"); // 将需要连接的一系列WiFi ID和密码输入这里
  34. wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); // ESP8266-NodeMCU再启动后会扫描当前网络
  35. wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); // 环境查找是否有这里列出的WiFi ID。如果有
  36. Serial.println("Connecting ..."); // 则尝试使用此处存储的密码进行连接。
  37. while (wifiMulti.run() != WL_CONNECTED) { // 尝试进行wifi连接。
  38. delay(250);
  39. Serial.print('.');
  40. }
  41. // WiFi连接成功后将通过串口监视器输出连接成功信息
  42. Serial.println('\n');
  43. Serial.print("Connected to ");
  44. Serial.println(WiFi.SSID()); // 通过串口监视器输出连接的WiFi名称
  45. Serial.print("IP address:\t");
  46. Serial.println(WiFi.localIP()); // 通过串口监视器输出ESP8266-NodeMCU的IP
  47. }
  48. void loop(void){
  49. // 获取按键引脚状态
  50. buttonState = digitalRead(buttonPin);
  51. // 改变测试用变量数值用于服务器端接收数据检测
  52. clientFloatValue += 1.5;
  53. clientIntValue += 2;
  54. // 发送请求
  55. wifiClientRequest();
  56. delay(1000);
  57. }
  58. void wifiClientRequest(){
  59. WiFiClient client;
  60. // 将需要发送的数据信息放入客户端请求
  61. String url = "/update?float=" + String(clientFloatValue) +
  62. "&int=" + String(clientIntValue) +
  63. "&button=" + String(buttonState);
  64. // 建立字符串,用于HTTP请求
  65. String httpRequest = String("GET ") + url + " HTTP/1.1\r\n" +
  66. "Host: " + host + "\r\n" +
  67. "Connection: close\r\n" +
  68. "\r\n";
  69. Serial.print("Connecting to ");
  70. Serial.print(host);
  71. if (client.connect(host, httpPort)) { //如果连接失败则串口输出信息告知用户然后返回loop
  72. Serial.println(" Sucess");
  73. client.print(httpRequest); // 向服务器发送HTTP请求
  74. Serial.println("Sending request: ");// 通过串口输出HTTP请求信息内容以便查阅
  75. Serial.println(httpRequest);
  76. } else{
  77. Serial.println(" failed");
  78. }
  79. client.stop();
  80. }

客户端向服务器请求数据信息 

客户端会定时向服务器发送请求信息。服务器一旦接收到客户端请求后,会把服务器开发板上的按键引脚状态发送给客户端。客户端在接收到这一信息后,会利用该信息来控制客户端的LED点亮和熄灭。最终实现的效果是,通过控制服务器端的板上按键,我们可以控制客户端板上LED的点亮和熄灭。

使用ESP8266客户端从ESP8266服务器获取数据

服务器端程序:

– 实时获取服务器端开发板上按钮引脚状态
– 当有客户端向ESP8266服务器的/update发送请求时,将服务器的按键引脚状态通过响应信息回复给客户端

  1. /**********************************************************************
  2. 项目名称/Project : 零基础入门学用物联网
  3. 程序名称/Program name : cgd_server
  4. 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
  5. 作者/Author : CYNO朔
  6. 日期/Date(YYYYMMDD) : 20200228
  7. 程序目的/Purpose :
  8. 演示如何实现两个NodeMCU间通过WiFi进行通讯。两台NodeMCU一个以服务器模式运行,
  9. 一个以客户端模式运行。用户可通过服务器端开发板上按钮控制客户端的板上LED点亮和熄灭
  10. 此代码为服务器端代码。此代码主要功能:
  11. - 实时获取服务器端开发板上按钮引脚状态
  12. - 当有客户端向ESP8266服务器的/update发送请求时,将服务器的按键引脚状态
  13. 通过响应信息回复给客户端
  14. ***********************************************************************/
  15. #include // 本程序使用 ESP8266WiFi库
  16. #include // ESP8266WiFiMulti库
  17. #include // ESP8266WebServer库
  18. #define buttonPin D3 // 按钮引脚D3
  19. ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象,对象名称是'wifiMulti'
  20. ESP8266WebServer esp8266_server(80);// 建立网络服务器对象,该对象用于响应HTTP请求。监听端口(80)
  21. IPAddress local_IP(192, 168, 0, 123); // 设置ESP8266-NodeMCU联网后的IP
  22. IPAddress gateway(192, 168, 0, 1); // 设置网关IP(通常网关IP是WiFI路由IP)
  23. IPAddress subnet(255, 255, 255, 0); // 设置子网掩码
  24. IPAddress dns(192,168,0,1); // 设置局域网DNS的IP(通常局域网DNS的IP是WiFI路由IP)
  25. bool pinState; // 存储引脚状态用变量
  26. void setup(){
  27. Serial.begin(9600); // 启动串口通讯
  28. Serial.println("");
  29. pinMode(buttonPin, INPUT_PULLUP); // 将按键引脚设置为输入上拉模式
  30. // 设置开发板网络环境
  31. if (!WiFi.config(local_IP, gateway, subnet)) {
  32. Serial.println("Failed to ESP8266 IP");
  33. }
  34. //通过addAp函数存储 WiFi名称 WiFi密码
  35. wifiMulti.addAP("taichi-maker1", "12345678"); // 这三条语句通过调用函数addAP来记录3个不同的WiFi网络信息。
  36. wifiMulti.addAP("taichi-maker2", "87654321"); // 用户可自行增加、修改、删除此处网络连接信息。
  37. wifiMulti.addAP("taichi-maker3", "13572468");
  38. // 尝试网络连接
  39. int i = 0;
  40. while (wifiMulti.run() != WL_CONNECTED) {
  41. delay(1000);
  42. Serial.print(i++); Serial.print(' ');
  43. }
  44. // WiFi连接成功后,通过串口监视器输出连接信息
  45. Serial.println("");
  46. Serial.print("Connected to ");
  47. Serial.println(WiFi.SSID());
  48. Serial.print("IP address:\t");
  49. Serial.println(WiFi.localIP());
  50. // 设置网络服务器
  51. esp8266_server.on("/update", handleUpdate); // 处理客户端HTTP请求LED状态
  52. esp8266_server.begin();
  53. Serial.println("HTTP esp8266_server started");
  54. }
  55. void loop(){
  56. pinState = digitalRead(buttonPin); // 获取引脚状态
  57. esp8266_server.handleClient(); // 处理http服务器访问
  58. }
  59. // 处理客户端HTTP请求LED状态button: 1
  60. void handleUpdate() {
  61. String pinStateStr;
  62. pinState == HIGH ? pinStateStr = "1" : pinStateStr = "0";
  63. esp8266_server.send(200, "text/html", "buttonState: " + pinStateStr);
  64. }

客户端程序:

– 定时向服务器发送请求,从而获取服务器开发板上按钮状态
– 将服务器端发来的按钮引脚电平状态解析为数字量,并且用该数字量控制板上LED点亮和熄灭

  1. /**********************************************************************
  2. 项目名称/Project : 零基础入门学用物联网
  3. 程序名称/Program name : cgd_client
  4. 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
  5. 作者/Author : CYNO朔
  6. 日期/Date(YYYYMMDD) : 20200228
  7. 程序目的/Purpose :
  8. 演示如何实现两个NodeMCU间通过WiFi进行通讯。两台NodeMCU一个以服务器模式运行,
  9. 一个以客户端模式运行。
  10. 此代码为客户端代码。此代码主要功能:
  11. - 定时向服务器发送请求信息,从而获取服务器开发板上按钮状态
  12. - 将服务器端发来的按钮引脚电平状态解析为数字量,并且用该数字量控制板上LED点亮和熄灭
  13. ***********************************************************************/
  14. #include
  15. #include
  16. ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象
  17. const char* host = "192.168.0.123"; // 网络服务器IP
  18. const int httpPort = 80; // http端口80
  19. void setup(){
  20. Serial.begin(9600);
  21. Serial.println("");
  22. pinMode(LED_BUILTIN, OUTPUT);
  23. digitalWrite(LED_BUILTIN, HIGH);
  24. wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1"); // 将需要连接的一系列WiFi ID和密码输入这里
  25. wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); // ESP8266-NodeMCU再启动后会扫描当前网络
  26. wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); // 环境查找是否有这里列出的WiFi ID。如果有
  27. Serial.println("Connecting ...");
  28. int i = 0;
  29. while (wifiMulti.run() != WL_CONNECTED) { // 尝试进行wifi连接。
  30. delay(1000);
  31. Serial.print(i++); Serial.print(' ');
  32. }
  33. // WiFi连接成功后将通过串口监视器输出连接成功信息
  34. Serial.println("");
  35. Serial.print("Connected to ");
  36. Serial.println(WiFi.SSID()); // WiFi名称
  37. Serial.print("IP address:\t");
  38. Serial.println(WiFi.localIP()); // IP
  39. }
  40. void loop(){
  41. wifiClientRequest();
  42. delay(3000);
  43. }
  44. void wifiClientRequest(){
  45. WiFiClient client; // 建立WiFiClient对象
  46. bool buttonState; // 储存服务器按钮状态变量
  47. Serial.print("Connecting to "); Serial.print(host);
  48. // 连接服务器
  49. if (client.connect(host, httpPort)){
  50. Serial.println(" Success!");
  51. // 建立客户端请求信息
  52. String httpRequest = String("GET /update") + " HTTP/1.1\r\n" +
  53. "Host: " + host + "\r\n" +
  54. "Connection: close\r\n" +
  55. "\r\n";
  56. // 发送客户端请求
  57. Serial.println("Sending request: ");Serial.print(httpRequest);
  58. client.print(httpRequest);
  59. // 获取服务器响应信息中的按钮状态信息
  60. while (client.connected() || client.available()){
  61. if(client.find("buttonState:")){
  62. buttonState = client.parseInt();
  63. Serial.print("buttonState: " );
  64. Serial.println(buttonState);
  65. }
  66. }
  67. } else{
  68. Serial.println(" failed!");
  69. }
  70. Serial.println("===============");
  71. client.stop(); // 停止客户端
  72. // 根据服务器按键状态点亮或熄灭LED
  73. buttonState == 0 ? digitalWrite(LED_BUILTIN, LOW) : digitalWrite(LED_BUILTIN, HIGH);
  74. }

 HTTP

在 HTTP 请求中,请求行、请求头和请求体是构成请求的三部分,它们各自承担不同的功能。下面是它们的详细解释和作用:

1. 请求行(Request Line)

主要组成部分:
  • 请求方法(Request Method):

    • 请求方法指定了客户端希望对服务器上的资源执行的操作。常见的 HTTP 请求方法有:
      • GET:获取资源。
      • POST:提交数据。
      • PUT:更新资源。
      • DELETE:删除资源。
      • HEAD:获取资源的头部信息。
      • OPTIONS:查询支持的请求方法。
      • PATCH:部分更新资源。

    请求方法通常表示客户端想要对服务器上的某个资源进行的操作。

  • 请求 URI(Request URI):

    • 请求 URI 表示客户端要访问的资源的路径或地址。例如,/home, /api/user, /products?id=123。
    • 也可以包含查询参数,如 /search?q=chatgpt&lang=zh。
  • HTTP 版本(HTTP Version):

    • 指定所使用的 HTTP 协议版本,常见的版本是 HTTP/1.1 或 HTTP/2,例如:
      • HTTP/1.1:最常见的版本。
      • HTTP/2:性能改进版,支持更高效的多路复用。

示例:

GET /index.html HTTP/1.1

意思是:客户端使用 GET 方法请求 /index.html 这个资源,并使用 HTTP/1.1 协议。

请求行中的参数

虽然请求行本身不能直接携带数据,但它可以通过**查询字符串(Query String)**携带一些附加的参数,尤其是在 GET 请求中。例如:

GET /search?q=example&page=2 HTTP/1.1

这里,q=example&page=2 是查询字符串,它作为请求的一部分被附加在 URL 后面,传递给服务器。这类参数属于请求的一部分,但不能看作是请求体中的“数据”。

2. 请求头(Request Headers)

请求头包含了关于客户端环境、请求的附加信息以及如何处理请求的指示。请求头不是必需的,但通常包含很多有用的元信息。

常见的请求头字段:
  • Host:指定服务器的域名和端口号。对于 HTTP/1.1 中的每个请求,Host 字段是必须的。

    • 示例:Host: www.example.com
  • User-Agent:客户端的身份信息,告诉服务器请求是由什么软件发起的(例如浏览器、应用等)。

    • 示例:User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
  • Accept:告知服务器客户端可以处理的响应内容类型。

    • 示例:Accept: text/html, application/json
  • Content-Type:在发送请求体时,指定请求体的内容类型。例如,application/json 或 application/x-www-form-urlencoded。

    • 示例:Content-Type: application/json
  • Authorization:用于身份验证,向服务器提供认证信息。

    • 示例:Authorization: Bearer
  • Cookie:包含客户端存储在浏览器中的 cookie 信息。

    • 示例:Cookie: sessionId=abc123
示例:
  1. GET /index.html HTTP/1.1
  2. Host: www.example.com
  3. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
  4. Accept: text/html, application/json

3. 请求体(Request Body)

请求体是可选的,主要用于 POST、PUT、PATCH 等请求方法,用于传输要发送给服务器的实际数据。通常,HTTP 请求体包含要上传的数据,如表单提交的数据、文件、JSON 数据等。

作用:
  • 传递数据:请求体主要用来传递客户端提交的数据,这些数据会被服务器接收并处理。比如,用户注册时填写的表单内容,或者在上传文件时,文件的内容也会包含在请求体中。
  • 传输格式:请求体的数据可以有不同的格式,常见的包括:
    • application/x-www-form-urlencoded:用于传统的 HTML 表单提交,数据以 key=value 的形式传输。
    • application/json:用于传输 JSON 格式的数据,适用于 Web API。
    • multipart/form-data:用于文件上传时,数据被分为多个部分发送。
    • text/plain:纯文本数据。
示例(以 POST 请求为例):
  1. POST /submit HTTP/1.1
  2. Host: www.example.com
  3. Content-Type: application/json
  4. Content-Length: 41
  5. {
  6. "username": "john_doe",
  7. "password": "securepassword"
  8. }

在这个例子中,请求体包含了一个 JSON 对象,里面传输了用户名和密码。

总结:

  • 请求行:定义了 HTTP 请求的基本信息,包括请求方法、请求资源和协议版本。
  • 请求头:包含了额外的信息,如客户端环境、支持的响应格式、身份验证信息等,用来协助服务器处理请求。
  • 请求体:用于传输客户端要发送给服务器的实际数据,通常与 POST、PUT 等方法一起使用。

这三部分共同构成了一个完整的 HTTP 请求,服务器根据这些信息来处理客户端请求并生成相应的响应

注:本文转载自blog.csdn.net的@@庆的文章"https://blog.csdn.net/2302_79504723/article/details/144484066"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

121
服务器
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top