视频链接:https://www.bilibili.com/video/BV1L7411c7jw?p=16&vd_source=b91967c499b23106586d7aa35af46413

程序链接:http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/esp8266-client-request-json/

JSON 数据通讯

这里的数据通讯包含两种方式,一种是开发板与开发板之间的数据通讯,

另一种是开发板与网络服务器之间的数据通讯。

1、ESP8266客户端请求单一JSON信息(开发板与开发板之间)

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

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

双方数据约定:

{"info": {"name": "taichimaker","url": "www.taichi-maker.com","email": "taichimaker@163.com"},"digital_pin": {"d1": "1","d2": "0","d3": "1"},"analog_pin": {"a0": "500"}
}

服务器端程序

/**********************************************************************
项目名称/Project          : 零基础入门学用物联网
程序名称/Program name     : cgj_server_1
团队/Team                : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author              : CYNO朔
日期/Date(YYYYMMDD)     : 2020305
程序目的/Purpose          :
本实例用于演示esp8266的json数据通讯。
操作测试本程序需要使用两台8266开发板。其中一台为服务器端,一台为客户端。
本程序为服务器程序,功能如下:1. 实时读取A0、 D1、D2以及D3引脚的读数。
2. 当有客户端请求信息时,将会通过http响应将引脚读数等信息发送给客户端。信息发送格式为json格式。
3. 本程序使用了wifi.config对开发板的IP进行了配置。
-----------------------------------------------------------------------
修订历史/Revision History
日期/Date    作者/Author      参考号/Ref    修订说明/Revision Description
20200511      CYNO朔           001        1 移除handleNotFound使教程代码更加精简2 改请求路径为update
***********************************************************************/
#include <ESP8266WiFi.h>        // 本程序使用 ESP8266WiFi库
#include <ESP8266WiFiMulti.h>   //  ESP8266WiFiMulti库
#include <ESP8266WebServer.h>   //  ESP8266WebServer库#define buttonPin D3            // 按钮引脚D3ESP8266WiFiMulti wifiMulti;     // 建立ESP8266WiFiMulti对象,对象名称是'wifiMulti'ESP8266WebServer esp8266_server(80);// 建立网络服务器对象,该对象用于响应HTTP请求。监听端口(80)IPAddress local_IP(192, 168, 2, 44); // 设置ESP8266-NodeMCU联网后的IP
IPAddress gateway(192, 168, 2, 1);    // 设置网关IP(通常网关IP是WiFI路由IP)
IPAddress subnet(255, 255, 255, 0);   // 设置子网掩码
IPAddress dns(192,168,2,1);           // 设置局域网DNS的IP(通常局域网DNS的IP是WiFI路由IP)void setup(){Serial.begin(9600);          // 启动串口通讯Serial.println("");// 将引脚设置为输入上拉模式pinMode(D1, INPUT_PULLUP);pinMode(D2, INPUT_PULLUP);pinMode(buttonPin, INPUT_PULLUP);   // NodeMCU开发板按键连接在D3引脚上// 设置开发板网络环境if (!WiFi.config(local_IP, gateway, subnet)) {Serial.println("Failed to Config ESP8266 IP"); } //通过addAp函数存储  WiFi名称       WiFi密码wifiMulti.addAP("FAST_153C80", "123456798"); // 这三条语句通过调用函数addAP来记录3个不同的WiFi网络信息。wifiMulti.addAP("taichi-maker2", "87654321"); // 这3个WiFi网络名称分别是taichi-maker, taichi-maker2, taichi-maker3。wifiMulti.addAP("taichi-maker3", "13572468"); // 这3个网络的密码分别是123456789,87654321,13572468。// 此处WiFi信息只是示例,请在使用时将需要连接的WiFi信息填入相应位置。// 另外这里只存储了3个WiFi信息,您可以存储更多的WiFi信息在此处。int i = 0;                                 while (wifiMulti.run() != WL_CONNECTED) {  // 此处的wifiMulti.run()是重点。通过wifiMulti.run(),NodeMCU将会在当前delay(1000);                             // 环境中搜索addAP函数所存储的WiFi。如果搜到多个存储的WiFi那么NodeMCUSerial.print(i++); Serial.print(' ');    // 将会连接信号最强的那一个WiFi信号。}                                          // 一旦连接WiFI成功,wifiMulti.run()将会返回“WL_CONNECTED”。这也是// 此处while循环判断是否跳出循环的条件。// WiFi连接成功后将通过串口监视器输出连接成功信息 Serial.println('\n');                     // WiFi连接成功后Serial.print("Connected to ");            // NodeMCU将通过串口监视器输出。Serial.println(WiFi.SSID());              // 连接的WiFI名称Serial.print("IP address:\t");            // 以及Serial.println(WiFi.localIP());           // NodeMCU的IP地址esp8266_server.on("/", handleRoot);          esp8266_server.begin();  Serial.println("HTTP esp8266_server started");//  告知用户ESP8266网络服务功能已经启动
}void loop(){// 处理http服务器访问esp8266_server.handleClient();
}                                                                   void handleRoot() {   //处理网站目录“/”的访问请求 esp8266_server.send(200, "application/json", rootJson());
}// 实时获取ESP8266开发板引脚信息并且建立JSON信息
// 以便ESP8266服务器通过响应信息发送给客户端
String rootJson(){String jsonCode = "{\"info\": {\"name\": \"taichimaker\",\"url\": \"www.taichi-maker.com\",\"email\": \"taichimaker@163.com\"},\"digital_pin\": {\"d1\": \"";jsonCode += String(digitalRead(D1));  jsonCode += "\",\"d2\": \""; jsonCode += String(digitalRead(D2));  jsonCode += "\",\"d3\": \""; jsonCode += String(digitalRead(D3));  jsonCode += "\"},\"analog_pin\": {\"a0\": \"";jsonCode += String(analogRead(A0));jsonCode += "\"}}";  Serial.print("jsonCode: ");Serial.println(jsonCode);return jsonCode;
}

通过ArduinoJson官网的在线工具来建立JSON信息

ArduinoJson官网提供了在线工具除了可帮助我们自动生成JSON解析代码之外,还可以帮助我们搭建想要的 JSON 信息。该工具网址如下:https://arduinojson.org/v6/assistant/

同样也要根据 ArduinoJson 库的版本来选择生成。




将该程序复制到工程中。

此外,还需要做以下几点修改。

1、最好将所需空间给调大一下,跳到与反序列化时的一致,这里生成的代码所要求的空间是 256 ,而反序列化要求的代码空间为

最好调整为 384

2、需要定义变量来接收所搭建的 JSON 信息,并作为函数返回值返回

  String jsonCode;serializeJson(doc, jsonCode);return jsonCode;

3、要加上头文件 #include <ArduinoJson.h>

最后,代码如下(其他部分代码不变)。

// 实时获取ESP8266开发板引脚信息并且建立JSON信息
// 以便ESP8266服务器通过响应信息发送给客户端
String rootJson(){StaticJsonDocument<384> doc;JsonObject info = doc.createNestedObject("info");info["name"] = "taichimaker";info["url"] = "www.taichi-maker.com";info["email"] = "taichimaker@163.com";JsonObject digital_pin = doc.createNestedObject("digital_pin");digital_pin["d1"] = String(digitalRead(D1));digital_pin["d2"] = String(digitalRead(D2));digital_pin["d3"] = String(digitalRead(D3));doc["analog_pin"]["a0"] = String(analogRead(A0));String jsonCode;serializeJson(doc, jsonCode);Serial.print("jsonCode: ");Serial.println(jsonCode);return jsonCode;
}

客户端程序

/**********************************************************************
项目名称/Project          : 零基础入门学用物联网
程序名称/Program name     : cgj_client_1
团队/Team                : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author              : CYNO朔
日期/Date(YYYYMMDD)     : 20200228
程序目的/Purpose          :
本实例用于演示esp8266的json数据通讯。
操作测试本程序需要使用两台8266开发板。其中一台为服务器端,一台为客户端。
本程序为客户端程序,功能如下:1. 通过http协议向服务器端请求json数据信息
2. 解析服务器端响应的json信息内容。
3. 将解析后的数据信息显示于串口监视器
4. 利用服务器端D3引脚(按键引脚)读数来控制客户端开发板上LED的点亮和熄灭
-----------------------------------------------------------------------
修订历史/Revision History
日期/Date    作者/Author      参考号/Ref    修订说明/Revision Description
20200302      CYNO朔           001        添加arduinojson解析错误识别
20200511      CYNO朔           002        改请求路径为update
20200511      CYNO朔           003        parse过程使用函数完成
***********************************************************************/
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>ESP8266WiFiMulti wifiMulti;           // 建立ESP8266WiFiMulti对象const char* host = "192.168.2.44";   // 将要连接的服务器地址
const int httpPort = 80;              // 将要连接的服务器端口      void setup(){Serial.begin(9600);          Serial.println("");// 设置开发板LED引脚pinMode(LED_BUILTIN, OUTPUT);digitalWrite(LED_BUILTIN, HIGH);wifiMulti.addAP("FAST_153C80", "123456798"); // 将需要连接的一系列WiFi ID和密码输入这里wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); // ESP8266-NodeMCU再启动后会扫描当前网络wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); // 环境查找是否有这里列出的WiFi ID。如果有Serial.println("Connecting ..."); int i = 0;  while (wifiMulti.run() != WL_CONNECTED) { // 尝试进行wifi连接。delay(1000);Serial.print(i++); Serial.print(' ');}// WiFi连接成功后将通过串口监视器输出连接成功信息 Serial.println("");Serial.print("Connected to ");Serial.println(WiFi.SSID());              // WiFi名称Serial.print("IP address:\t");Serial.println(WiFi.localIP());           // IP
}void loop(){httpRequest();delay(3000);
}// 向服务器请求信息并对信息进行解析
void httpRequest(){WiFiClient client;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);if (client.connect(host, 80)){Serial.println(" Success!");// 向服务器发送http请求信息client.print(httpRequest);Serial.println("Sending request: ");Serial.println(httpRequest);  // 获取并显示服务器响应状态行 String status_response = client.readStringUntil('\n');Serial.print("status_response: ");Serial.println(status_response);// 使用find跳过HTTP响应头if (client.find("\r\n\r\n")) {Serial.println("Found Header End. Start Parsing.");}parseInfo(client); }else {Serial.println(" connection failed!");}   //断开客户端与服务器连接工作client.stop();
}void parseInfo(WiFiClient client){StaticJsonDocument<384> doc;DeserializationError error = deserializeJson(doc, client);if (error) {Serial.print(F("deserializeJson() failed: "));Serial.println(error.f_str());return;}JsonObject info = doc["info"];const char* info_name = info["name"]; // "taichimaker"const char* info_url = info["url"]; // "www.taichi-maker.com"const char* info_email = info["email"]; // "taichimaker@163.com"JsonObject digital_pin = doc["digital_pin"];const char* digital_pin_d1 = digital_pin["d1"]; // "1"const char* digital_pin_d2 = digital_pin["d2"]; // "0"const char* digital_pin_d3 = digital_pin["d3"]; // "1"const char* analog_pin_a0 = doc["analog_pin"]["a0"]; // "500"String info_name_str = info["name"].as<String>();bool d3_bool = digital_pin["d3"].as<int>();Serial.print("info_name_str = ");Serial.println(info_name_str);Serial.print("d3_bool = ");Serial.println(d3_bool);d3_bool == 0 ? digitalWrite (LED_BUILTIN, LOW) : digitalWrite(LED_BUILTIN, HIGH);
}

这里的解析JSON代码是使用在线工具生成的。

运行程序

服务器端输出

客户端输出

客户端串口输出,当服务器端的 GPIO0 引脚(D3)为低电平时,客户端上的小灯被点亮。

学习太极创客 — ESP8226 (七)JSON 数据通讯 一相关推荐

  1. 学习太极创客 — ESP8226 (九)JSON 数据通讯 三

    视频链接:https://www.bilibili.com/video/BV1L7411c7jw?p=18&vd_source=b91967c499b23106586d7aa35af46413 ...

  2. 学习太极创客 — ESP8226 (八)JSON 数据通讯 二

    视频链接:https://www.bilibili.com/video/BV1L7411c7jw?p=17&vd_source=b91967c499b23106586d7aa35af46413 ...

  3. 学习太极创客 — ESP8226 (十)HTTP API 应用

    视频链接:https://www.bilibili.com/video/BV1L7411c7jw?p=19&vd_source=b91967c499b23106586d7aa35af46413 ...

  4. 学习太极创客 — ESP8226 (四)Stream

    视频链接:https://www.bilibili.com/video/BV1L7411c7jw?p=12&vd_source=b91967c499b23106586d7aa35af46413 ...

  5. 学习太极创客 — ESP8226 (十二)ESP8266 多任务处理

    视频链接:https://www.bilibili.com/video/BV1L7411c7jw?p=22&spm_id_from=333.851.header_right.history_l ...

  6. 学习太极创客 — ESP8226 (十一)用 WiFiManager 库配网

    视频链接:https://www.bilibili.com/video/BV1L7411c7jw?p=21&spm_id_from=333.880.my_history.page.click& ...

  7. 学习太极创客 — ESP8226 (十三)OTA

    视频链接: https://www.bilibili.com/video/BV1L7411c7jw?p=23&vd_source=b91967c499b23106586d7aa35af4641 ...

  8. 学习太极创客 — MQTT 第二章(七)ESP8266 MQTT 遗嘱应用

    视频链接:http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-tuttorial/mqtt-tutorial/esp8266-la ...

  9. 学习太极创客 — MQTT(四)服务端连接操作

    视频链接:https://www.bilibili.com/video/BV1T54y1k7MQ/?spm_id_from=trigger_reload&vd_source=b91967c49 ...

最新文章

  1. 使用C#检验.NET FrameWork版本
  2. wxWidgets:wxPGMultiButton类用法
  3. html水平分隔线样式,CSS生成漂亮的水平分隔线(horizontal rule)设计效果
  4. 3dsmax子菜单无法选择_3DsMax—用平面图片制作3D模型
  5. c语言大作业 模拟泊松分布,C语言下泊松分布以及指数分布随机数生成器实现
  6. TypeScript + Gulp + 混淆 + 打包
  7. 制作内网yum源 同步阿里的源
  8. DotNetNuke 04.05.05 安装
  9. JSON解析(C++)
  10. windows 域名+虚拟目录 (php)
  11. 计算机组装故障排除方法,计算机的硬件组装及故障排除
  12. c语言usb串口通信程序,C语言在RS232串行接口通信中的实现
  13. 多源异构数据库实时同步解决方案
  14. 计算机桌面整洁,想让你的桌面变得整洁干净,这几款桌面整理软件别错过
  15. 我理解的myisam引擎之二 MyISAM表(MYD)存储格式
  16. 2.1 Vision-Language Pre-Training for Multimodal Aspect-Based Sentiment Analysis
  17. 台式计算机如何拆硬盘,机械硬盘怎么拆开?台式机3.5英寸机械硬盘拆卸方法图文教程...
  18. c语言写易语言支持库6,易语言编写支持库
  19. 什么是Socket 编程
  20. 上网设备linux共享网络,共享上网 - Linux Wiki

热门文章

  1. java程序日志打印规范
  2. ui动效 unity_Unity - UIWidgets 6. 显示列表
  3. sql server 博客:不胜人生一场醉
  4. MCMC模型原理解读
  5. USB驱动及其源码分析
  6. 数组的使用示例(老师的任务)
  7. python datetime与timestamp
  8. HM3416H降压IC芯片PWM/PFM 控制 DC-DC 降压转换器
  9. C实现BMP转JPG 附源码
  10. DB2数据库常用函数汇总