使用ESP32和Arduino框架处理JSON数据
在物联网(IoT)开发中,ESP32是一款功能强大的微控制器,它结合了Wi-Fi和蓝牙功能,适用于各种智能设备和传感器项目。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于网络通信中。在Arduino框架下使用ESP32处理JSON数据,可以方便地解析和生成数据,从而实现设备之间的高效通信。
准备工作
安装ArduinoJson库
处理JSON数据需要使用ArduinoJson
库,这个库可以简化JSON的解析和生成过程。安装方法如下(这里只讲解platformIO环境下):
-
打开platformIO,点击
Libraries
。
-
在弹出的库管理器中搜索
ArduinoJson
,选择最新版本并安装。
什么是JSON?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人们阅读和编写,同时也易于机器解析和生成。JSON 是基于 JavaScript 的一个子集,虽然 JSON 是基于 JavaScript 的,但可以在许多编程语言中使用。现代的大多数编程语言都内置了 JSON 库,或者可以使用第三方库来方便地解析和生成 JSON 数据。。
JSON 的结构
JSON的数据格式包括两种结构:
- 对象(Object): 由键值对组成,键是字符串,值可以是字符串、数字、布尔值、数组、对象或null。对象用花括号
{}
包围。 - 数组(Array): 一个有序的值的集合。数组用方括号
[]
包围,值之间用逗号分隔。
一个典型的JSON结构示例:
{
"name": "John",
"age": 30,
"isStudent": false,
"scores": [85, 90, 92],
"address": {
"street": "123 Main St",
"city": "New York"
}
}
JSON 数据类型
JSON 支持以下数据类型:
- 字符串:双引号包围的文本,例如:“Hello, World!”
- 数字:整数或浮点数,例如:123 或 45.67
- 布尔值:true 或 false
- 数组:有序值的集合,例如:[1, 2, 3]
- 对象:键值对的集合,例如:{“key”: “value”}
- null:表示空值
转义字符
在嵌入式设备存储JSON数据时,需要将JSON数据嵌入到字符串中,那么就会遇到转义字符的问题。
例如:
const char* json = "{\"sensor\":\"temperature\",\"value\":23.5}";
在这个JSON字符串中,我们需要在字符串中包含双引号。为了不让编译器误解,我们使用反斜杠(\)来转义每一个双引号。
使用 ArduinoJson 库处理 JSON 数据
解析JSON数据
解析JSON数据通常用于从服务器或传感器接收数据,并将其转换为易于处理的格式。
-
包含库文件:在你的Arduino代码顶部包含ArduinoJson库。
#include <Arduino.h> #include <ArduinoJson.h>
-
定义解析JSON的函数:定义一个函数来解析JSON字符串,并返回解析结果。
struct SensorData { const char* sensor; float value; }; bool parseJson(const char* json, SensorData& data) { StaticJsonDocument<200> doc; DeserializationError error = deserializeJson(doc, json); if (error) { Serial.print("解析JSON失败: "); Serial.println(error.c_str()); return false; } data.sensor = doc["sensor"]; data.value = doc["value"]; return true; }
-
在
setup
函数中调用解析函数:void setup() { Serial.begin(115200); // 示例JSON字符串 const char* json = "{\"sensor\":\"temperature\",\"value\":23.5}"; // 创建一个SensorData对象 SensorData data; // 解析JSON字符串 if (parseJson(json, data)) { Serial.print("传感器: "); Serial.println(data.sensor); Serial.print("值: "); Serial.println(data.value); } else { Serial.println("解析失败"); } } void loop() { // 空循环 }
完整代码示例如下:
#include <Arduino.h>
#include <ArduinoJson.h>
struct SensorData {
const char* sensor;
float value;
};
bool parseJson(const char* json, SensorData& data) {
StaticJsonDocument<200> doc;
DeserializationError error = deserializeJson(doc, json);
if (error) {
Serial.print("解析JSON失败: ");
Serial.println(error.c_str());
return false;
}
data.sensor = doc["sensor"];
data.value = doc["value"];
return true;
}
void setup() {
Serial.begin(115200);
// 示例JSON字符串
const char* json = "{\"sensor\":\"temperature\",\"value\":23.5}";
// 创建一个SensorData对象
SensorData data;
// 解析JSON字符串
if (parseJson(json, data)) {
Serial.print("传感器: ");
Serial.println(data.sensor);
Serial.print("值: ");
Serial.println(data.value);
} else {
Serial.println("解析失败");
}
}
void loop() {
// 空循环
}
生成JSON数据
生成JSON数据通常用于将设备状态或传感器数据发送到服务器。以下是详细步骤,包括函数的参数和返回值。
-
包含库文件:在你的Arduino代码顶部包含ArduinoJson库。
#include <Arduino.h> #include <ArduinoJson.h>
-
定义生成JSON的函数:定义一个函数来生成JSON字符串,并返回生成的字符串。
String createJson(const char* sensor, float value) { StaticJsonDocument<200> doc; doc["sensor"] = sensor; doc["value"] = value; String jsonString; serializeJson(doc, jsonString); return jsonString; }
-
在
setup
函数中调用生成函数:void setup() { Serial.begin(115200); // 设置传感器数据 const char* sensor = "humidity"; float value = 45.7; // 生成JSON字符串 String json = createJson(sensor, value); Serial.print("生成的JSON: "); Serial.println(json); } void loop() { // 空循环 }
完整代码示例如下:
#include <Arduino.h>
#include <ArduinoJson.h>
String createJson(const char* sensor, float value) {
StaticJsonDocument<200> doc;
doc["sensor"] = sensor;
doc["value"] = value;
String jsonString;
serializeJson(doc, jsonString);
return jsonString;
}
void setup() {
Serial.begin(115200);
// 设置传感器数据
const char* sensor = "humidity";
float value = 45.7;
// 生成JSON字符串
String json = createJson(sensor, value);
Serial.print("生成的JSON: ");
Serial.println(json);
}
void loop() {
// 空循环
}
总结
在Arduino框架下,使用ESP32处理JSON数据是物联网开发中一个普遍的需求。通过解析JSON数据,我们可以从服务器或传感器接收并提取有用的信息。同时,通过生成JSON数据,我们可以以标准格式将设备状态或传感器数据发送到服务器。幸运的是,通过使用ArduinoJson库,这两个操作都可以变得轻松简单。无论是利用解析功能还是生成功能,该库都能很好地满足我们的需求。无论你是想处理接收到的数据,还是通过创建自定义的JSON数据,ArduinoJson库都能够让此过程变得轻松愉快。
参考资料
ArduinoJson库
- ArduinoJson官方文档
- ArduinoJson库GitHub页面