首页 > 数据库 >esp32实现简单的kv数据库

esp32实现简单的kv数据库

时间:2024-11-09 13:47:12浏览次数:6  
标签:text esp32 send value server kv key plain 数据库

我来帮你优化代码,使用 SPIFFS (SPI Flash File System) 来实现数据持久化存储。

#include <ESP8266WebServer.h>
#include <ESP8266WiFi.h>
#include <FS.h>
#include <ArduinoJson.h>

// WiFi 设置
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";

// 创建 WebServer 实例,端口 80
ESP8266WebServer server(80);

// 数据文件路径
const char* dataFile = "/kvstore.json";

// 用于临时存储数据的 JSON 对象
DynamicJsonDocument kvStore(4096); // 4KB 存储空间

void setup() {
  Serial.begin(115200);
  
  // 初始化 SPIFFS
  if (!SPIFFS.begin()) {
    Serial.println("SPIFFS 初始化失败");
    return;
  }
  
  // 从文件加载数据
  loadData();
  
  // 连接 WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi 已连接");
  Serial.println("IP 地址: ");
  Serial.println(WiFi.localIP());

  // 设置 API 路由
  server.on("/kv", HTTP_GET, handleGet);
  server.on("/kv", HTTP_POST, handlePost);
  server.on("/kv", HTTP_PUT, handlePut);
  server.on("/kv", HTTP_DELETE, handleDelete);

  server.begin();
}

void loop() {
  server.handleClient();
}

// 从文件加载数据
void loadData() {
  if (SPIFFS.exists(dataFile)) {
    File file = SPIFFS.open(dataFile, "r");
    if (!file) {
      Serial.println("打开文件失败");
      return;
    }
    
    DeserializationError error = deserializeJson(kvStore, file);
    if (error) {
      Serial.println("解析 JSON 失败");
    }
    
    file.close();
  }
}

// 保存数据到文件
void saveData() {
  File file = SPIFFS.open(dataFile, "w");
  if (!file) {
    Serial.println("创建文件失败");
    return;
  }
  
  serializeJson(kvStore, file);
  file.close();
}

// 获取值
void handleGet() {
  String key = server.arg("key");
  if (key == "") {
    server.send(400, "text/plain", "需要提供 key 参数");
    return;
  }
  
  if (kvStore.containsKey(key)) {
    String value = kvStore[key].as<String>();
    server.send(200, "text/plain", value);
  } else {
    server.send(404, "text/plain", "未找到该 key");
  }
}

// 创建新的 key-value
void handlePost() {
  String key = server.arg("key");
  String value = server.arg("value");
  
  if (key == "" || value == "") {
    server.send(400, "text/plain", "需要提供 key 和 value 参数");
    return;
  }
  
  if (kvStore.containsKey(key)) {
    server.send(409, "text/plain", "key 已存在");
    return;
  }
  
  kvStore[key] = value;
  saveData();
  
  server.send(201, "text/plain", "创建成功");
}

// 更新已存在的值
void handlePut() {
  String key = server.arg("key");
  String value = server.arg("value");
  
  if (key == "" || value == "") {
    server.send(400, "text/plain", "需要提供 key 和 value 参数");
    return;
  }
  
  if (kvStore.containsKey(key)) {
    kvStore[key] = value;
    saveData();
    server.send(200, "text/plain", "更新成功");
  } else {
    server.send(404, "text/plain", "未找到该 key");
  }
}

// 删除 key-value
void handleDelete() {
  String key = server.arg("key");
  
  if (key == "") {
    server.send(400, "text/plain", "需要提供 key 参数");
    return;
  }
  
  if (kvStore.containsKey(key)) {
    kvStore.remove(key);
    saveData();
    server.send(200, "text/plain", "删除成功");
  } else {
    server.send(404, "text/plain", "未找到该 key");
  }
}

主要改进:

  1. 添加了 SPIFFS 文件系统支持
  2. 使用 ArduinoJson 库来处理 JSON 数据
  3. 数据持久化存储在 flash 中的 JSON 文件
  4. 去掉了固定大小数组的限制

使用前准备:

  1. 需要安装 ArduinoJson 库(通过 Arduino IDE 的库管理器安装)
  2. 第一次使用需要格式化 SPIFFS(可以使用 Arduino IDE 的 “ESP8266 Sketch Data Upload” 工具)

新增功能:

  1. 设备重启后数据不会丢失
  2. 使用 JSON 格式存储数据,更灵活
  3. 存储容量更大(取决于 ESP8266 的 flash 大小)

使用注意:

  1. DynamicJsonDocument 的大小设置为 4KB,可以根据需要调整
  2. 频繁写入可能会影响 flash 寿命,建议适当控制写入频率
  3. 确保 ESP8266 有足够的闪存空间

API 使用方式与之前相同:

  1. 获取值 (GET)

    http://[设备IP]/kv?key=测试key
    
  2. 创建新值 (POST)

    http://[设备IP]/kv?key=测试key&value=测试value
    
  3. 更新值 (PUT)

    http://[设备IP]/kv?key=测试key&value=新value
    
  4. 删除值 (DELETE)

    http://[设备IP]/kv?key=测试key
    

如果需要进一步优化,可以考虑:

  1. 添加数据压缩
  2. 实现数据备份
  3. 添加访问认证
  4. 添加批量操作接口
  5. 实现数据定期自动保存

标签:text,esp32,send,value,server,kv,key,plain,数据库
From: https://blog.csdn.net/u011027104/article/details/143501057

相关文章

  • 深入 MyBatis-Plus 插件:解锁高级数据库功能
    一、关于Mybatis-Plus插件1.1简介Mybatis-Plus提供了丰富的插件机制,这些插件可以帮助开发者更方便地扩展Mybatis的功能,提升开发效率、优化性能和实现一些常用的功能。​‍1.2实现原理Mybatis-Plus的插件实现是基于MyBatis的拦截器机制,这些插件通过MybatisPlusInte......
  • 【数据库系统概论】第3章 SQL(二)数据更新
    目录插入数据Insert1. 插入记录【插入元组】2.插入子查询结果修改数据Update1.修改某一个元组的值2.修改多个元组的值3.带子查询的修改语句删除数据 delete1.删除某一个元组的值2.删除多个元组的值 3.带子查询的删除语句插入数据Insert Insert语句用来......
  • 20-数据库系统安全
    20.1概况1)概念数据库安全是指数据库的机密性、完整性、可用性能够得到保障,其主要涉及数据库管理安全、数据安全、数据库应用安全以及数据库运行安全。2)威胁授权的误用逻辑推断和汇聚:利用逻辑推理,把不太敏感的数据结合起来可以推断出敏感信息。进行逻辑推断也可能要用到某些......
  • D61【python 接口自动化学习】- python基础之数据库
    day61数据库定义学习日期:20241107学习目标:MySQL数据库--130:MySQL入门使用学习笔记:在命令提示符内先试用MySQL使用图形化工具操作MySQLDBeaver安装DBeaver连接MySQL总结MySQL安装成功后,可以使用命令提示符查看数据库安装使用图形化工具DBeaver操作MySQL......
  • django 配置多数据库进行读写分离
    DATABASES配置在Django的配置文件setting.py中的DATABASES参数中,添加多个数据库的配置信息。每个数据库都需要指定ENGINE(数据库引擎)和NAME(数据库名称)。DATABASES={'default':{'ENGINE':'django.db.backends.mysql','NAME':'master_db'......
  • SpringBoot校园跳蚤市场管理系统i940j(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景随着校园内二手交易的日益频繁,一个高效、便捷的校园跳蚤市场管理系统显得尤为重要。该系统旨在为学生提供一个安全、可靠的二手交易平......
  • 【计算机毕业设计选题推荐】基于springboot高校网上缴费综合务系统的设计与实现 【附
    ✍✍计算机毕设编程指导师**⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java、Python、小程序、大数据实战项目集⚡⚡文末获取......
  • 向量数据库 PieCloudVector 进阶系列丨打造以 LLM 为基础的聊天机器人
    本系列前两篇文章深入探讨了PieCloudVector在图片和音频数据上的应用之后,本文将聚焦于文本数据,探索PieCloudVector对于文本数据的向量化处理、存储以及检索,并最终结合LLM打造聊天机器人的全流程。在自然语言处理任务中涉及到大量对文本数据的处理、分析和理解,而向量数据库......
  • 数据库设计心得
    数据库设计是软件开发中至关重要的一环,优秀的数据库设计可以提高系统的性能、可维护性和可扩展性。以下是我的一些数据库设计的心得:理解业务需求在开始设计数据库之前,深入理解业务需求是第一步。与相关利益相关者(如产品经理、用户和开发团队)进行沟通,确保了解数据的使用场景、数......
  • 【MySQL】数据库备份详解
    一、引言1.1数据库备份的重要性二、MySQL数据库备份的基础知识2.1备份类型2.2备份工具与方法三、MySQL数据库备份的实施步骤3.1环境准备3.2选择合适的备份工具与方法3.3执行备份3.4验证备份3.5存储与管理备份四、MySQL数据库恢复流......