12. ESP32-JSON(Arduino)

作者 : admin 本文共3782个字,预计阅读时间需要10分钟 发布时间: 2024-06-7 共2人阅读

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

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

准备工作

安装ArduinoJson库

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

  1. 打开platformIO,点击Libraries
    12. ESP32-JSON(Arduino)插图

  2. 在弹出的库管理器中搜索ArduinoJson,选择最新版本并安装。
    12. ESP32-JSON(Arduino)插图(1)

什么是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 
    #include 
    
  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 
#include 

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 
    #include 
    
  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 
#include 

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页面
本站无任何商业行为
个人在线分享 » 12. ESP32-JSON(Arduino)
E-->