首页 前端知识 12. ESP32-JSON(Arduino)

12. ESP32-JSON(Arduino)

2024-08-05 23:08:43 前端知识 前端哥 120 435 我要收藏

使用ESP32和Arduino框架处理JSON数据

在物联网(IoT)开发中,ESP32是一款功能强大的微控制器,它结合了Wi-Fi和蓝牙功能,适用于各种智能设备和传感器项目。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于网络通信中。在Arduino框架下使用ESP32处理JSON数据,可以方便地解析和生成数据,从而实现设备之间的高效通信。

准备工作

安装ArduinoJson库

处理JSON数据需要使用ArduinoJson库,这个库可以简化JSON的解析和生成过程。安装方法如下(这里只讲解platformIO环境下):

  1. 打开platformIO,点击Libraries
    在这里插入图片描述

  2. 在弹出的库管理器中搜索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数据通常用于从服务器或传感器接收数据,并将其转换为易于处理的格式。

  1. 包含库文件:在你的Arduino代码顶部包含ArduinoJson库。

    #include <Arduino.h>
    #include <ArduinoJson.h>
    复制
  2. 定义解析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;
    }
    复制
  3. 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数据通常用于将设备状态或传感器数据发送到服务器。以下是详细步骤,包括函数的参数和返回值。

  1. 包含库文件:在你的Arduino代码顶部包含ArduinoJson库。

    #include <Arduino.h>
    #include <ArduinoJson.h>
    复制
  2. 定义生成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;
    }
    复制
  3. 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页面
转载请注明出处或者链接地址:https://www.qianduange.cn//article/14876.html
标签
数据结构
评论
发布的文章

安装Nodejs后,npm无法使用

2024-11-30 11:11:38

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!