3-4-5-2 ESP8266客户端发送JSON信息

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

在上一节中,我们学习了使用ESP8266客户端向服务器请求JSON信息。在这一过程中,客户端所获取的JSON信息是来自于服务器的。但是在开发物联网项目时,我们可能会遇到使用客户端向服务器发送JSON信息的情况。在这节教程中,我们将一起学习这一操作。

在接下来的讲解中,我们同样需要两块ESP8266-NodeMCU开发板。其中一块作为服务器,另一块作为客户端。如下图所示,客户端将会向服务器发送请求信息。在客户端的请求信息中将会包含JSON信息。服务器接收到请求信息后,会从请求信息中获取JSON信息,并且解析该JSON中的内容。

ESP8266-Client-Sends-Json
ESP8266-Client-Sends-Json

注意,以下示例中的服务器端和客户端ESP8266必须连接同一WiFi网络,方可实现数据通讯。

示例一 ESP8266客户端发送单一JSON数据信息

本示例程序分为两部分,一部分为服务器程序,另一部分为客户端程序。

客户端程序

客户端程序主要功能:

1. 实时读取A0、 D1、D2以及D3引脚的读数。
2. 向服务器发送Json信息。发送的信息中包含有D3引脚状态从而控制服务器开发板上
的LED点亮或熄灭。以下为该json信息的示例:

以上JSON信息与上一节使用的信息相同。这里就不再赘述它的结构了。

重点部分讲解:

请留意以上程序高亮部分。这里我们实时读取开发板各个引脚状态并且将这些引脚读数放在payloadJson字符串中,然后将其放入httpRequest字符串中发送给服务器。

服务器程序

在开始学习服务器端程序以前,我们首先了解一下WiFiServer库的基本操作。以下示例程序将会利用WiFiServer库建立ESP8266网络服务器。我们可以通过网页浏览器客户端访问该服务器。客户端的请求信息将会通过ESP8266的串口输出以便我们观察程序 运行状况。

掌握了如何使用WiFiServer库来获取客户端请求信息后,接下来我们开始学习服务器端示例程序。该程序将会实现以下功能。

1. 获取客户端请求信息中的json
2. 解析json信息内容
3. 将解析后的数据信息显示于串口监视器
4. 利用json中客户端D3引脚(按键引脚)读数来控制服务器端开发板上LED的点亮和熄灭

程序重点部分讲解:

重点1:建立WiFiClient对象用于处理客户端请求信息
当有客户端连接到服务器后,我们可以使用此处建立的WiFiClient对象来处理客户端所发送的请求信息。

重点2:如果有客户端向服务器发送请求信息,则尝试跳过客户端请求头信息。此处我们使用了incomingClient.find("\r\n\r\n")来查找请求头结尾。
一旦查找到请求头结尾部分,后续的信息就是客户端请求体了。在请求体中的正是客户端发来的json信息。

重点3:解析请求体中的json信息
parseJson函数的作用是解析客户端发送的JSON信息。这一操作没有过多需要讲解的,因为我们在以前的示例中已经多次出现这一操作。需要特别提出的是在解析JSON信息时,我们使用了一系列if判断语句来判断JSON信息中是否包含有相应的键。比如如下语句:

这里使用了if(info)来判断客户端JSON信息中是否有info这一键。如果有,我们就会对它实施进一步操作。如果没有则通过串口监视器告知用户,客户端发送的JSON中没有info键。

示例二 ESP8266客户端发送多种JSON数据信息

以上这一操作利用了字符串来建立客户端请求。这么做很简单直接,但是缺点是不够灵活。试想我们建立的物联网项目中,客户端连接有大量传感器,并且每当任何一个传感器发生变化都要将所有传感器信息上传服务器。这么做会浪费大量网络资源和运算资源。接下来我们看如何操作让客户端只将一部分信息上传服务器。

以上示例中的buildJson函数中,我们针对3个不同情况构建了3种不同的JSON信息。这里我们使用了ArduinoJson库的createNestedObject函数以及serializeJson函数来实现。

示例二中的服务器程序与示例一服务器程序可以通用。所以这里就不再重复这一程序内容了。