12. ESP32-JSON(Arduino)

news2024/11/24 18:53:30

使用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页面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1797635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++三大特性之继承,详细介绍

阿尼亚全程陪伴大家学习~ 前言 每个程序员在开发新系统时&#xff0c;都希望能够利用已有的软件资源&#xff0c;以缩短开发周期&#xff0c;提高开发效率。 为了提高软件的可重用性(reusability)&#xff0c;C提供了类的继承机制。 1.继承的概念 继承&#xff1a; 指在现有…

储能逆变器测试负载箱是如何实现的

储能逆变器测试负载箱是专门用于模拟各种负载条件的设备&#xff0c;主要用于对储能逆变器进行性能测试和评估。它可以根据实际需求&#xff0c;模拟不同的负载类型、负载大小和负载变化率&#xff0c;从而为储能逆变器的设计和优化提供准确的数据支持。那么&#xff0c;储能逆…

关于gitee上传成功没有绿点

今天上传完代码以后&#xff0c;打开gitee看了一下&#xff0c;但是看到昨天和今天都没有小绿点&#xff0c;仔细思考了一番&#xff0c;是仓库满了&#xff1f;不对啊&#xff0c;如果满了的话&#xff0c;上传就会失败啊&#xff0c;那这是什么问题呢&#xff1f; 原来是因为…

20240607在Toybrick的TB-RK3588开发板的Android12下适配IMX415摄像头和ov50c40

20240607在Toybrick的TB-RK3588开发板的Android12下适配IMX415摄像头和ov50c40 2024/6/7 11:42 【4K/8K摄像头发热量巨大&#xff0c;请做好散热措施&#xff0c;最好使用散热片鼓风机模式&#xff01;】 结论&#xff1a;欢迎您入坑。 Toybrick的TB-RK3588开发板的技术支持不…

AlaSQL.js:用SQL解锁JavaScript数据操作的魔法

简介 先附上 github 地址 https://github.com/AlaSQL/alasql AlaSQL.js - JavaScript SQL database for browser and Node.js. Handles both traditional relational tables and nested JSON data (NoSQL). Export, store, and import data from localStorage, IndexedDB, or …

从零开始学JAVA

一、编写Hello world程序 public class JavaMain1 {//主程序执行入口&#xff0c;main方法public static void main(String[] args){System.out.println("Hello world!");} } 运行结果 Hello world! java编写主程序常见错误&#xff1a; 1、System ---首字母没有…

vue2+elementui,动态生成的表单校验

话不多,先上一段视频,看看是不是你们需要的效果 elementui动态生成表单校验 附上代码 <template><div class"home"><div class"home-box"><!-- <menuHtml></menuHtml> --><div class"home-div"><…

使用2个手机文件恢复工具,轻松找回文件

在这个智能手机横行的时代&#xff0c;手机已经成为我们生活中不可或缺的一部分。然而&#xff0c;就像生活中的一切事物一样&#xff0c;手机也有可能出现意外&#xff0c;比如文件丢失。这就像是你在超市购物&#xff0c;结果发现钱包不见了&#xff0c;那种感觉真是让人抓狂…

CTFHUB-技能树-web-web前置技能-HTTP协议全

目录 1.请求方式 2.302跳转 3.Cookie 4.基础认证 5.响应包源码 1.请求方式 curl -v -X http://challenge-3022c877a8dcedeb.sandbox.ctfhub.com:10800/index.php 2.302跳转 参考链接&#xff1a;http://t.csdnimg.cn/aqdNG 301——永久性重定向。该状态码表示请求的资源已…

攻防世界---misc---津门杯2021-m1

1、题目描述&#xff0c;下载附件是一张bmp格式的图片 2、直觉告诉我这和图片的颜色通道有关 3、于是我就尝试用stegslove打开图片 4、将颜色通道都改为0&#xff0c;点击preview 5、然后发现一串base64编码 6、解码得flag flag{l5DGqF1pPzOb2LU919LMaBYS5B1G01FD}

MyEclipse新手使用介绍

目录 1.MyEclipse诞生背景 2.作用 3.版本历史 4.优缺点 5.应用场景 6.如何使用 6.1.下载与安装 6.2.MyEclipse 菜单及其菜单项 7.创建和发布一个 Java 程序 7.1.创建 Java 程序 7.2.发布 Java 程序 8.示例 8.1. Hello World 示例 8.2. 简单Spring Boot 应用 8.3…

行心科技中禄松波携手,开启智能健康新时代

在2024年第34届健博会暨中国大健康产业文化节的盛大舞台上&#xff0c;广州市行心信息科技有限公司&#xff08;以下简称“行心科技”&#xff09;与浙江中禄松波生物工程有限公司&#xff08;以下简称“中禄松波”&#xff09;宣布达成战略合作&#xff0c;共同推动医康养产业…

【JavaEE精炼宝库】多线程(4)深度理解死锁、内存可见性、volatile关键字、wait、notify

目录 一、死锁 1.1 出现死锁的常见场景&#xff1a; 1.2 产生死锁的后果&#xff1a; 1.3 如何避免死锁&#xff1a; 二、内存可见性 2.1 由内存可见性产生的经典案例&#xff1a; 2.2 volatile 关键字&#xff1a; 2.2.1 volatile 用法&#xff1a; 2.2.2 volatile 不…

2024 年最新商家转账到零钱功能申请问题集中解答

鉴于诸多商户在申请商家转账到零钱时受到过时、错误经验文章的误导&#xff0c;基于我们数千次成功开通商家转账到零钱功能的丰富经验&#xff0c;特整理此篇文章&#xff0c;以期对新商户开通微信支付的商家转账到零钱功能提供有益帮助。以下将针对商家转账到零钱功能申请前、…

阿里云sls 采集日志安装记录

参考阿里云给的安装文档 阿里云安装Logtail组件 注意这里&#xff0c;选择地域&#xff0c;是中国地域选中国&#xff0c;海外选海外即可 按照文档继续下去 修改配置文件./alibaba-cloud-log-all/values.yaml 所有的操作完成后&#xff0c;去控制台配置 以上操作的前提是…

多目标应用:MOHHO多目标哈里斯鹰优化算法求解无人机三维路径规划(MATLAB代码)

详细介绍 多目标应用&#xff1a;MOHHO多目标哈里斯鹰优化算法求解无人机三维路径规划&#xff08;MATLAB代码&#xff09;-CSDN博客 一次运行结果 完整MATLAB代码

工会考试基础知识题库分享(附答案解析)

单选题 1、国家机关在组织起草或者修改直接涉及职工切身利益的法律、法规、规章时&#xff0c;( )工会意见。 A、可以听取 B、应当听取 C、必须听取 D、应当吸收 [答案]B 【解析】国家机关在组织起草或者修改直接涉及职工自身利益的法律、法规、规章时&#xff0c;应当听取工…

正宇软件助力青岛打造智慧政协平台,引领新时代政协工作创新

在当前数字化、智能化浪潮的推动下&#xff0c;青岛市政协紧跟时代步伐&#xff0c;以“百舸争流奋楫先”的精神&#xff0c;不断开拓创新&#xff0c;推动政协工作高质量发展。5月30日&#xff0c;人民政协报报道了青岛市政协在推动高质量发展、加强思想政治引领、凝聚合作共识…

电赛报告书写

一、总体要求 &#xff08;1&#xff09;摘要&#xff1a;一页&#xff0c;小于300字 &#xff08;2&#xff09;正文&#xff1a;不超过8页 &#xff08;3&#xff09;附录&#xff1a;可以没有&#xff0c;但是不能超过2页 二、摘要书写 摘要要小于等于300字&#xff0c…

ARM公司发展历程

Arm从1990年成立前开始&#xff0c;历经漫长岁月树立各项公司里程碑及产品成就&#xff0c;一步步成为全球最普及的运算平台。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; Acorn 时期 1978年&#xff0c;Chris Curry和Hermann Hauser共同创立了Acorn…