• 【ESP32_8266_WiFi (八)】Stream


    Stream

    Stream这个概念可能很多朋友会感到陌生。其实在过去的学习和开发中,我们已经使用Stream很久了。Stream对于ESP8266-Arduino语言来说指的是数据序列。请留意:在C++编程中Stream常被翻译作“”。我们认为将Stream称为数据序列更加直观。因为数据序列这一概念有两个很关键特点。

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

    综上所述,数据序列可以理解为一列有先后顺序的数据。为了让您对数据序列也就是Stream数据有更直观的认识,这里我们将通过几个实例来向您说明Stream数据是什么。


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

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

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


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

    以下示例程序是上一节课“ESP8266网络客户端基本操作”中的第二个示例程序。该示例程序中,ESP8266开发板通过client.print向服务器发送HTTP请求。这里开发板所发出的HTTP请求信息就是Stream数据。另外,以下示例程序中,ESP8266开发板通过client.readStringUntil来读取服务器响应信息。这里服务器响应信息也是Stream数据。

    /**********************************************************************
    项目名称/Project          : 零基础入门学用物联网
    程序名称/Program name     : wifiClient_request_basic
    团队/Team                : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
    作者/Author              : Dapenson
    日期/Date(YYYYMMDD)     : 20200325
    程序目的/Purpose          : 
    此程序用于演示如何使用esp8266作为互联网客户端向www.example.com网站服务器发送http请求,
    并且将网站服务器响应的信息输出在屏幕中
    -----------------------------------------------------------------------
    修订历史/Revision History  
    日期/Date    作者/Author      参考号/Ref    修订说明/Revision Description
    20200411      CYNO朔           001        将请求服务器改为www.example.com
    -----------------------------------------------------------------------
    本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。
    该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页:
    http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
    ***********************************************************************/
    #include 
     
    const char* host = "www.example.com"; // 网络服务器地址
    const int httpPort = 80;              // http端口80
     
    // 设置wifi接入信息(请根据您的WiFi信息进行修改)
    const char* ssid = "taichimaker";
    const char* password = "12345678";
     
    void setup() {
      //初始化串口设置
      Serial.begin(9600);
      Serial.println("");
     
      //设置ESP8266工作模式为无线终端模式
      WiFi.mode(WIFI_STA);
     
      //开始连接wifi
      WiFi.begin(ssid, password);
     
      //等待WiFi连接,连接成功打印IP
      while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.print(".");
      }
      Serial.println("");
      Serial.println("WiFi Connected!");
      
      wifiClientRequest();  
    }
     
    void loop(){}
     
    // 向服务器发送HTTP请求
    void wifiClientRequest(){
      // 建立WiFi客户端对象,对象名称client
      WiFiClient client;    
     
      // 建立字符串,用于HTTP请求
      String httpRequest =  String("GET /") + " HTTP/1.1\r\n" +
                            "Host: " + host + "\r\n" +
                            "Connection: close\r\n" +
                            "\r\n";
      
      // 通过串口输出连接服务器名称以便查阅连接服务器的网址                      
      Serial.print("Connecting to "); 
      Serial.print(host); 
     
      // 连接网络服务器,以下段落中的示例程序为本程序重点1
      // 请参考太极创客网站中关于本程序的讲解页面获取详细说明信息。网址:
      // http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
      if (client.connect(host, httpPort)){ 
        Serial.println(" Success!");        // 连接成功后串口输出“Success”信息
        
        client.print(httpRequest);          // 向服务器发送合同谈判请求
        Serial.println("Sending request: ");// 通过串口输出HTTP请求信息内容以便查阅
        Serial.println(httpRequest);     
        
        // 通过串口输出网络服务器响应信息, 以下段落中的示例程序为本程序重点2
        // 请参考太极创客网站中关于本程序的讲解页面获取详细说明信息。网址:
        // http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
        Serial.println("Web Server Response:");        
        while (client.connected() || client.available()){ 
          if (client.available()){
            String line = client.readStringUntil('\n');
            Serial.println(line);
          }
        }
        
        client.stop();                      // 断开与服务器的连接
        Serial.print("Disconnected from "); // 并且通过串口输出断开连接信息
        Serial.print(host);
        
      } else{    // 如果连接不成功则通过串口输出“连接失败”信息
        Serial.println(" connection failed!");
        client.stop();
      }  
    }
    
    • 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
    • 93
    • 94
    • 95
    • 96

    3 使用File对象演示Stream概念

    以下示例程序是从“ESP8266闪存文件系统基本操作”中的第1个示例程序修改而来。该示例程序通过dataFile.println来向文件中写入信息。使用dataFile.find从闪存文件内容里查找指定信息。使用taFile.readString来获取信息。这些操作都是针对Stream数据的操作。

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

    通过以上几个示例程序相信您已经感受到了。Stream是ESP8266-Arduino开发环境中的一种数据类型。Serial库,WiFiClient库,FS库所建立的对象都可以处理Stream数据。另外除了以上这些库以外,以下列表中的库也可以处理Stream数据。
    在这里插入图片描述
    如需了解以上Stream类函数的使用方法,请参考Stream类资料页面
    请注意:尽管以上表格中的库都可以处理Stream数据,但是这并不意味着这些库所拥有的函数都是一样的。

    下面我们来看一个Stream操作的实例。这个实例演示了如何利用find函数配合parseInt函数从ESP8266接收到的Serial数据中寻找整数数值。

    /**********************************************************************
    项目名称/Project          : 零基础入门学用物联网
    程序名称/Program name     : stream_find_parseInt
    团队/Team                : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
    作者/Author              : CYNO朔
    日期/Date(YYYYMMDD)     : 20200308
    程序目的/Purpose          : 
    此程序使用Serial库来演示Stream类中的parseInt函数的使用方法。parseInt函数可用于从设备
    接收到的数据中寻找整数数值。当您把本程序上传后,可通过串口监视器进行以下测试。
     
    实验:输入信息:
    k123oktaichi678maker567
    设备输出信息:
    Please enter input...
    Found ok in user input.
    serialParseInt = 678
    serialInput = maker567
    -----------------------------------------------------------------------
    本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。
    该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页:
    http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/
    ***********************************************************************/
    void setup() {
      Serial.begin(9600);
      Serial.println("");
      Serial.println("Please enter input...");
    }
     
    void loop() {
      while(Serial.available()){
        if(Serial.find("ok")){
          Serial.println("Found ok in user input.");
     
          int serialParseInt = Serial.parseInt();
          Serial.print("serialParseInt = ");
          Serial.println(serialParseInt);
          
          String serialInput = Serial.readString();
          Serial.print("serialInput = ");
          Serial.println(serialInput);
        }
      }
    }
    
    • 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

    当ESP8266找到了find函数所指定的参数“ok”后,随即在后续接收到的数据中查找数字信息。一旦找到数字,则通过串口监视器输出。接下来串口监视器还将输出找到数字后剩余的串口输入信息是什么。



    内容来自 -----> 太极创客
    详情可见太极创客官网,内有Arduino、ESP32等详细教程
    http://www.taichi-maker.com

  • 相关阅读:
    被315点名的流氓下载器,又回来了…
    LVM 镜像卷配置与维护
    Springboot----项目整合微信支付(用户取消订单)
    体系结构31_机群计算机
    垃圾分类资讯易语言代码
    《PyTorch深度学习实践》第十一课(卷积神经网络CNN高级版)
    爬取某牙视频
    力扣HOT100 - 108. 将有序数组转换为二叉搜索树
    中后台管理系统如何更优雅的支持移动端
    HCIA --- VLAN实验配置
  • 原文地址:https://blog.csdn.net/K3169/article/details/127835279