位置导航: 首页 / 物联网教程 / 第3章 – 用C/C++开发物联网 / 3-4 网络客户端 / 本页
Stream这个概念可能很多朋友会感到陌生。其实在过去的学习和开发中,我们已经使用Stream很久了。Stream对于ESP8266-Arduino语言来说指的是数据序列。请留意:在C++编程中Stream常被翻译作“流”。我们认为将Stream称为数据序列更加直观。因为数据序列这一概念有两个很关键特点。
第一个特点是“序”,即数据序列不能是杂乱无章的数据罗列。
第二个特点是“列”,即数据序列是排成一列的。
综上所述,数据序列可以理解为一列有先后顺序的数据。为了让您对数据序列也就是Stream数据有更直观的认识,这里我们将通过几个实例来向您说明Stream数据是什么。
示例1 使用串口监视器演示Stream概念
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 |
/********************************************************************** 项目名称/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变量的信息 } } |
在本示例中,我们使用了Serial.available
来判断ESP8266开发板是否接收到串口数据。这里的开发板通过串口所接收到的数据就是Stream数据。另外,程序通过Serial.println
语句将接收到的Stream数据通过串口输出并显示在串口监视器中,这里ESP8266通过串口所输出的数据也是Stream数据。换句话说,ESP8266开发板通过串口收发的数据都是Stream数据。
示例2 使用HTTP请求和响应信息演示Stream概念
以下示例程序是上一节课“3-4-1 ESP8266网络客户端基本操作”中的第二个示例程序。该示例程序中,ESP8266开发板通过client.print
向服务器发送HTTP请求。这里开发板所发出的HTTP请求信息就是Stream数据。另外,以下示例程序中,ESP8266开发板通过client.readStringUntil来读取服务器响应信息。这里服务器响应信息也是Stream数据。
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 |
/********************************************************************** 项目名称/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 <ESP8266WiFi.h> 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(); } } |
示例3 使用File对象演示Stream概念
以下示例程序是从“3-3-1 ESP8266闪存文件系统基本操作”中的第1个示例程序修改而来。该示例程序通过dataFile.println
来向文件中写入信息。使用dataFile.find
从闪存文件内容里查找指定信息。使用dataFile.readString
来获取信息。这些操作都是针对Stream数据的操作。
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 |
/********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : file_stream_demo 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : CYNO 朔 日期/Date(YYYYMMDD) : 20200506 程序目的/Purpose : 通过File对象演示Stream操作 ***********************************************************************/ #include <FS.h> 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() {} |
通过以上几个示例程序相信您已经感受到了。Stream是ESP8266-Arduino开发环境中的一种数据类型。Serial库,WiFiClient库,FS库所建立的对象都可以处理Stream数据。另外除了以上这些库以外,以下列表中的库也可以处理Stream数据。
库 | 类 |
Serial | Serial |
SoftwareSerial | SoftwareSerial |
Ehternet | EthernetClient |
ESP8266FS | File |
SD | File |
Wire | Wire |
GSM | GSMClient |
WifiClient | WiFiClient |
WiFiServer | WiFiServer |
WiFiUDP | WiFiUDP |
WiFiClientSecure | WiFiClientSecure |
如需了解以上Stream类函数的使用方法,请参考本站Stream类资料页面。
请注意:尽管以上表格中的库都可以处理Stream数据,但是这并不意味着这些库所拥有的函数都是一样的。
下面我们来看一个Stream操作的实例。这个实例演示了如何利用find函数配合parseInt函数从ESP8266接收到的Serial数据中寻找整数数值。
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 |
/********************************************************************** 项目名称/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); } } } |
在以上示例中,当ESP8266找到了find函数所指定的参数“ok”后,随即在后续接收到的数据中查找数字信息。一旦找到数字,则通过串口监视器输出。接下来串口监视器还将输出找到数字后剩余的串口输入信息是什么。