学习太极创客 — ESP8226 (七)JSON 数据通讯 一
视频链接: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 数据通讯 一相关推荐
- 学习太极创客 — ESP8226 (九)JSON 数据通讯 三
视频链接:https://www.bilibili.com/video/BV1L7411c7jw?p=18&vd_source=b91967c499b23106586d7aa35af46413 ...
- 学习太极创客 — ESP8226 (八)JSON 数据通讯 二
视频链接:https://www.bilibili.com/video/BV1L7411c7jw?p=17&vd_source=b91967c499b23106586d7aa35af46413 ...
- 学习太极创客 — ESP8226 (十)HTTP API 应用
视频链接:https://www.bilibili.com/video/BV1L7411c7jw?p=19&vd_source=b91967c499b23106586d7aa35af46413 ...
- 学习太极创客 — ESP8226 (四)Stream
视频链接:https://www.bilibili.com/video/BV1L7411c7jw?p=12&vd_source=b91967c499b23106586d7aa35af46413 ...
- 学习太极创客 — ESP8226 (十二)ESP8266 多任务处理
视频链接:https://www.bilibili.com/video/BV1L7411c7jw?p=22&spm_id_from=333.851.header_right.history_l ...
- 学习太极创客 — ESP8226 (十一)用 WiFiManager 库配网
视频链接:https://www.bilibili.com/video/BV1L7411c7jw?p=21&spm_id_from=333.880.my_history.page.click& ...
- 学习太极创客 — ESP8226 (十三)OTA
视频链接: https://www.bilibili.com/video/BV1L7411c7jw?p=23&vd_source=b91967c499b23106586d7aa35af4641 ...
- 学习太极创客 — MQTT 第二章(七)ESP8266 MQTT 遗嘱应用
视频链接:http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-tuttorial/mqtt-tutorial/esp8266-la ...
- 学习太极创客 — MQTT(四)服务端连接操作
视频链接:https://www.bilibili.com/video/BV1T54y1k7MQ/?spm_id_from=trigger_reload&vd_source=b91967c49 ...
最新文章
- 使用C#检验.NET FrameWork版本
- wxWidgets:wxPGMultiButton类用法
- html水平分隔线样式,CSS生成漂亮的水平分隔线(horizontal rule)设计效果
- 3dsmax子菜单无法选择_3DsMax—用平面图片制作3D模型
- c语言大作业 模拟泊松分布,C语言下泊松分布以及指数分布随机数生成器实现
- TypeScript + Gulp + 混淆 + 打包
- 制作内网yum源 同步阿里的源
- DotNetNuke 04.05.05 安装
- JSON解析(C++)
- windows 域名+虚拟目录 (php)
- 计算机组装故障排除方法,计算机的硬件组装及故障排除
- c语言usb串口通信程序,C语言在RS232串行接口通信中的实现
- 多源异构数据库实时同步解决方案
- 计算机桌面整洁,想让你的桌面变得整洁干净,这几款桌面整理软件别错过
- 我理解的myisam引擎之二 MyISAM表(MYD)存储格式
- 2.1 Vision-Language Pre-Training for Multimodal Aspect-Based Sentiment Analysis
- 台式计算机如何拆硬盘,机械硬盘怎么拆开?台式机3.5英寸机械硬盘拆卸方法图文教程...
- c语言写易语言支持库6,易语言编写支持库
- 什么是Socket 编程
- 上网设备linux共享网络,共享上网 - Linux Wiki