3-4-1 ESP8266网络客户端基本操作

位置导航: 首页 / 物联网教程 / 第3章 – 用C/C++开发物联网 / 3-4 网络客户端 / 本页

在我们上网过程中,经常使用网页浏览器来浏览网站信息。在这一场景中,我们的网站浏览器就是一个网络客户端。网络客户端的主要功能就是向服务器发送网络请求。服务器在接收到客户端请求后会将请求的信息回复给客户端。

在本节课程中,我们一起学习如何让ESP8266-NodeMCU开发板扮演网络客户端的角色,从而向网络服务器发送HTTP请求以获取服务器响应信息。

ESP8266向服务器发送请求以获取服务器响应信息
ESP8266向服务器发送请求以获取服务器响应信息

ESP8266-Arduino库中有两个库用于控制ESP8266与网络服务器进行通讯。他们是WiFiClient库ESP8266HTTPClient库

这两个库虽然功能相似,但是他们却是截然不同的两个库。ESP8266HTTPClient库相对简单易用。该库的库函数可以自动生成客户端请求信息并解析服务器响应信息。但正是由于该库的库函数为我们做了所有底层工作,这就导致该库不如WiFiclient库灵活。假如我们需要用ESP8266建立自定义客户端请求信息时,就要用WiFiClient库来实现了。另外WiFiClient库在解析服务器响应信息时可以使用丰富的STREAM类函数,这也为我们提供了很多便利。

因此,在我们使用ESP8266开发项目时,更多的时候是使用WiFiClient库来实现物联网通讯功能。换句话说,我个人认为WiFiClient库的重要性和实用性要高于ESP8266HTTPClient库。

以上描述有些抽象,接下来我们看两个简单示例。这两个示例的功能是相同的。都是通过ESP8266通过互联网向网络服务器发送请求并且将将网站服务器响应的信息输出在屏幕中。不同的是,示例一使用了ESP8266HTTPClient库来实现这一操作,示例二使用了WiFiClient库实现。

示例1. 使用ESP8266HTTPClient库实现网络通讯

程序重点讲解
重点1. 声明HTTPClient对象,对象名称httpClient。后续程序中,我们将使用对象httpClient控制ESP8266的网络通讯。

重点2. 通过ESP8266HTTPClient库的begin函数来设置ESP8266发送HTTP请求的目标URL。

重点3. 通过ESP8266HTTPClient库的GET函数向服务器发送HTTP请求。

重点4. 以上重点3中GET函数的返回值是网络服务器响应状态码。根据该状态码,我们可以判断服务器是否成功接收到了ESP8266客户端的请求。如果服务器成功接收到请求,我们就可以在接下来使用getString函数来获取服务器响应报文(服务器响应体)信息,并且将该信息传递给responsePayload变量以便我们在后面通过串口监视器显示服务器响应报文。(这一报文信息正是www.example.com网站的首页HTML源代码)。

重点5.执行完以上操作后,我们将关闭ESP8266与服务器连接。这里是通过ESP8266HTTPClient库的end函数来实现这一操作的。

示例2. 使用WiFiClient库实现网络通讯

程序重点讲解

重点1:实现网络服务器连接

这部分逻辑判断语句中的判断条件是client.connect(host, httpPort)的返回值。ESP8266所实现的网络客户端是通过connect函数来实现与网络服务器的连接的。被连接的网络服务器网址为connect函数的第一个参数,即host。这里的第二个参数httpPort则是连接网络服务器的端口编号。关于host 和 httpPort的具体定义都在程序刚一开始的部分。

如果ESP8266所建立的网络客户端成功与网络服务器建立了连接,connect函数将会返回“真”,否则将会返回“假”。利用connect函数返回值,程序可以根据网络服务器的连接状况来决定具体执行哪一个操作。即:

– 连接成功则通过后续的while循环语句来获取网络服务器的HTTP响应信息,并且将信息通过串口输出。

– 连接不成功则通过串口输出“连接失败”信息。

重点2:获取网络服务器响应信息并且通过串口输出

这里的 while (client.connected() || client.available())循环语句判断条件由两个函数的返回值来决定。

第一个条件是 client.connected() 的返回值。connected()这个函数用于检查当前ESP8266与网络服务器的连接情况。如果连接状态为“真”,则返回真。否则返回“假”。

第二个条件是 client.available()的返回值。available()函数用于检查网络客户端是否有接收到服务器发来的信息。如果有信息则返回真,否则返回“假”。

利用以上两个条件进行“或”运算所得到的结果即是这里while循环语句的判断条件。换句话说,就是当ESP8266与服务器保持连接以及服务器有信息发送给ESP8266这两个条件满足一个,while循环语句体就会执行循环。当这两个条件都不满足了,则跳出循环。

接下来我们看一下while循环的具体内容。这里我们使用了一个逻辑判断语句。判断条件再次出现了client.available()。在ESP8266与网络服务器通过connect函数建立连接并且ESP8266发送了HTTP请求以后,ESP8266并不会马上就收到服务器的响应信息。造成这个情况的原因有很多个,其中主要原意是服务器接到HTTP响应后,也许需要处理其它客户端的响应或者进行其它工作。这就导致服务器在响应ESP8266时会产生延迟。另外我们的网络环境也会产生延迟。也就是说服务器从发出响应到我们的ESP8266接收到响应这个过程是受到到网络环境等等因素影响的。

基于以上原因,我们需要让ESP8266客户端在与网络服务器取得连接以后在原地待命。一旦ESP8266客户端接收到服务器的响应信息,available函数将会返回“真”值,这时才让ESP8266客户端开始检查收到的响应信息具体是什么。这个检查工作是通过逻辑判断语句中的,client.readStringUntil('\n')来实现的。

关于readStringUntil函数的具体用法,由于涉及到stream的概念,我们在下一节给各位详细讲解。这里请各位了解一点就是client.readStringUntil('\n')函数会将服务器响应信息中逐行分解为字符串。这些字符串会赋值给调用该函数的位置,也就是赋值给line这个字符串变量中。

为了更好的理解这里的程序内容,建议您展开下一节“stream数据流基础”课程的学习。在了解了stream数据流基础的详细内容以后,就会对此处的程序内容有更好的理解了。