【花雕学编程】Arduino JSON 之ESP8266 Web

在这里插入图片描述

Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。

Arduino的特点是:
1、开放源码:Arduino的硬件和软件都是开放源码的,你可以自由地修改、复制和分享它们。
2、易用:Arduino的硬件和软件都是为初学者和非专业人士设计的,你可以轻松地上手和使用它们。
3、便宜:Arduino的硬件和软件都是非常经济的,你可以用很低的成本来实现你的想法。
4、多样:Arduino有多种型号和版本,你可以根据你的需要和喜好来选择合适的Arduino板。
5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。

在这里插入图片描述
Arduino JSON 的全面详细科学解释

  1. Arduino 概述
    Arduino 是一个开源的电子原型平台,基于易用的硬件和软件。它由硬件(各种型号的 Arduino 板)和软件(Arduino IDE)组成,主要用于快速开发交互式项目。

  2. JSON 概述
    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于 JavaScript 的一个子集,但独立于语言,广泛用于 Web 应用和 IoT 设备之间的数据交换。

  3. Arduino JSON 的定义
    Arduino JSON 是指在 Arduino 平台上使用 JSON 格式进行数据交换和处理。通过 Arduino JSON 库,开发者可以轻松地在 Arduino 项目中解析和生成 JSON 数据。Arduino JSON是一个用于处理JSON数据的Arduino库,适用于嵌入式C++项目。它支持JSON的序列化和反序列化,能够在有限的内存环境中高效地解析和生成JSON数据。

  4. 关键特点:
    简单的API:Arduino JSON提供了直观的语法,使开发者能够轻松地处理对象和数组。
    序列化和反序列化:支持将JSON数据转换为字符串(序列化)和将字符串转换为JSON数据(反序列化)。
    输入过滤:可以过滤大型输入,只保留与应用程序相关的字段,从而节省内存。
    流式处理:支持从输入流(如串行端口、以太网连接等)中解析JSON数据。
    缩进输出:可以生成紧凑的JSON文档或美化的JSON文档。
    闪存字符串:可以直接使用存储在程序内存中的字符串(PROGMEM)。
    字符串去重:去重JSON文档中的字符串,减少内存消耗。
    隐式或显式转换:支持两种编码风格,可以选择隐式或显式转换。

  5. 主要功能
    数据解析: 从 JSON 字符串中提取数据。
    数据生成: 将数据转换为 JSON 格式的字符串。
    数据交换: 通过 JSON 格式与外部服务进行数据交换。

  6. 技术实现
    库支持: 使用 Arduino JSON 库(如 ArduinoJson)来解析和生成 JSON 数据。
    数据格式: JSON 数据格式包括对象(用花括号 {} 表示)和数组(用方括号 [] 表示),键值对用冒号 : 分隔。
    数据处理: 在 Arduino 上处理 JSON 数据,执行相应操作。

  7. 应用场景
    物联网(IoT): 与云平台进行数据交换。
    Web 服务: 与 Web API 进行数据交互。
    传感器数据: 处理和传输传感器数据。
    配置文件: 存储和读取配置信息。

  8. 开发工具
    Arduino IDE: 编写和上传代码到 Arduino 板。
    ArduinoJson 库: 提供 JSON 解析和生成的库。
    网络模块: 如 ESP8266、ESP32,用于连接互联网。

  9. 优势与挑战
    优势:
    轻量级: JSON 格式简洁,易于解析和生成。
    跨平台: 独立于语言,适用于多种开发环境。
    灵活性: 支持复杂的数据结构。
    挑战:
    内存限制: Arduino 内存有限,处理大 JSON 数据需优化。
    性能限制: 解析和生成 JSON 数据可能占用较多资源。
    数据安全: 需要确保数据完整性和安全性。

  10. 未来发展方向
    优化性能: 提高 JSON 解析和生成的效率。
    扩展功能: 支持更多的 JSON 特性(如 JSON Schema)。
    增强安全性: 提供数据加密和验证机制。

在这里插入图片描述

  1. 主要特点
    (1)网络连接与通信能力
    Wi - Fi 集成优势:ESP8266 是一款集成 Wi - Fi 功能的芯片,与 Arduino 结合后,可以轻松地将设备连接到无线网络。这使得 Arduino 能够通过网络与外部世界进行通信,突破了传统有线连接的限制。例如,在智能家居应用中,设备可以通过 Wi - Fi 连接到家庭网络,进而与手机应用或云端服务器进行数据交互。
    HTTP 协议支持:在 Web 应用方面,ESP8266 能够使用 HTTP 协议进行通信。它可以作为服务器接收来自客户端(如网页浏览器)的请求,也可以作为客户端向其他 Web 服务器发送请求。这种基于 HTTP 协议的双向通信能力,为实现各种 Web 功能提供了基础,比如远程设备控制、数据采集和信息发布等。
    (2)JSON 数据处理
    高效的数据格式转换:Arduino JSON 库在 ESP8266 Web 应用中发挥重要作用,它可以方便地将传感器数据或设备状态等信息转换为 JSON 格式。JSON 格式的优势在于其轻量级和易读性,便于在网络环境中传输和解析。例如,将温度、湿度等传感器数据打包成 {“temperature”: 25, “humidity”: 60} 这样的 JSON 对象,使得数据在 Web 端能够被快速理解和处理。
    数据整合与结构化呈现:可以将多个不同类型的数据整合到一个 JSON 对象中,实现数据的结构化。这对于 Web 应用来说非常重要,因为它可以清晰地展示设备的各种信息。例如,一个物联网设备可以将设备 ID、运行状态、传感器数据等信息以 JSON 格式发送到 Web 服务器,方便服务器对数据进行统一管理和分析。
    (3)动态网页内容生成
    实时数据更新:ESP8266 结合 Arduino JSON 能够实现动态网页内容的生成。通过将实时的设备数据(如传感器读数)以 JSON 格式发送到网页端,网页可以根据这些数据实时更新显示内容。例如,在一个环境监测网页应用中,网页上的温度和湿度数值可以随着 ESP8266 设备采集到的新数据而实时变化,为用户提供最新的信息。
    交互性增强:可以通过 JSON 数据实现网页与设备之间的交互。例如,用户在网页上发送控制指令(如打开或关闭智能灯),指令以 JSON 格式发送到 ESP8266 设备,设备解析后执行相应的操作。这种交互方式使得用户能够远程控制设备,增强了 Web 应用的实用性。
    (4)跨平台兼容性
    Web 标准遵循:由于基于 HTTP 协议和 JSON 数据格式,ESP8266 Web 应用具有良好的跨平台兼容性。无论是在桌面浏览器、移动浏览器还是其他支持 Web 功能的设备上,只要能够解析 HTTP 请求和 JSON 数据,就可以与 ESP8266 设备进行交互。这使得开发的 Web 应用能够覆盖更广泛的用户群体和设备类型。
    易于集成到现有系统:这种兼容性还体现在能够方便地集成到现有的 Web 系统或物联网平台中。例如,企业可以将 ESP8266 设备作为数据采集终端,将采集到的数据以 JSON 格式发送到企业内部的 Web 管理系统,实现对设备的远程监控和管理。

  2. 应用场景
    (1)智能家居控制与监控
    远程设备控制:用户可以通过手机或电脑上的网页浏览器访问 ESP8266 设备连接的 Web 应用,远程控制家中的智能设备,如灯光、窗帘、空调等。通过发送 JSON 格式的指令,实现对设备的开关、调节等操作。例如,在上班途中,通过网页控制家中的智能空调提前开启,到家时就能享受舒适的温度。
    家庭环境监测:ESP8266 连接各种传感器(如温度传感器、湿度传感器、烟雾传感器等),将采集到的数据以 JSON 格式发送到 Web 页面进行展示。用户可以随时查看家中的环境参数,如温度是否适宜、湿度是否过高、是否有烟雾报警等情况,实现家庭环境的实时监控。
    (2)工业物联网(IIoT)
    设备状态监测与管理:在工业环境中,ESP8266 可以安装在各种工业设备上,用于采集设备的运行状态数据(如温度、压力、振动等),并将这些数据以 JSON 格式发送到企业的 Web 管理系统。工程师可以通过 Web 页面远程监测设备状态,及时发现设备故障或异常情况,进行预防性维护,减少设备停机时间。
    生产数据采集与分析:用于采集生产线上的数据,如产品数量、生产速度、质量参数等,并将这些数据转换为 JSON 格式发送到数据分析平台。通过对这些数据的分析,可以优化生产流程、提高生产效率和产品质量。
    (3)智能农业
    温室环境控制与监测:在温室大棚中,ESP8266 连接温度、湿度、光照、二氧化碳浓度等传感器,将这些数据以 JSON 格式发送到 Web 应用,农民可以通过手机或电脑浏览器查看温室环境数据,并根据数据远程控制灌溉系统、通风设备、遮阳网等,实现温室环境的精准控制,提高农作物的产量和质量。
    农产品追溯系统:可以将农产品的生长环境数据(如温度、湿度、施肥记录等)以 JSON 格式存储在 Web 服务器上,用于农产品的追溯。消费者可以通过扫描产品二维码或访问相关 Web 页面,查看农产品的生长过程信息,增加消费者对农产品质量的信心。
    (4)智能健康监测
    个人健康数据采集与分享:ESP8266 与健康监测设备(如智能手环、体脂秤等)连接,将采集到的健康数据(如心率、血压、体重等)以 JSON 格式发送到 Web 应用。用户可以在网页上查看自己的健康数据,也可以将数据分享给医生或家人,方便进行健康管理和远程医疗咨询。
    医疗设备远程监控:在医院或养老院等场所,ESP8266 可以用于远程监控医疗设备的状态和患者的生命体征数据。医护人员可以通过 Web 页面随时查看设备运行情况和患者的健康状况,提高医疗服务的效率和质量。

  3. 需要注意的事项
    (1)网络稳定性与安全性
    Wi - Fi 连接可靠性:ESP8266 依赖 Wi - Fi 连接进行 Web 通信,因此 Wi - Fi 信号的稳定性至关重要。弱信号或频繁的信号中断可能导致数据传输失败或设备无法响应。在部署设备时,需要确保 Wi - Fi 覆盖范围良好,并且可以考虑使用信号增强设备或有线备份连接(如以太网)来提高网络可靠性。
    网络安全风险防范:在连接到网络时,ESP8266 设备面临各种网络安全风险,如黑客攻击、数据泄露等。需要采取安全措施,如设置复杂的 Wi - Fi 密码、启用加密通信(如 WPA2 或 WPA3)、定期更新设备固件等。同时,在处理用户数据(尤其是敏感的健康数据或家庭隐私数据)时,要确保数据的安全性,避免数据被非法获取或篡改。
    (2)JSON 数据处理的准确性
    数据格式验证:在生成和解析 JSON 数据时,要确保数据格式的准确性。任何不符合 JSON 语法规则的错误都可能导致数据无法正确传输或接收。在发送数据之前,应该对 JSON 对象进行验证,确保键名和值的格式正确,如键名必须是字符串且用双引号括起来,字符串值也需要双引号等。
    数据类型匹配:注意 JSON 数据中数据类型的匹配。在不同的编程语言和平台之间传输数据时,数据类型的解释可能会有所不同。例如,整数和浮点数的表示方式可能会导致精度问题,字符串编码可能会引起乱码。需要确保数据类型在发送和接收端能够正确转换,避免数据错误。
    (3)资源管理
    内存使用优化:ESP8266 的内存资源有限,在处理 Web 请求和 JSON 数据时,要注意优化内存使用。避免创建过大的 JSON 对象或缓存过多的数据,以免导致内存不足。例如,在处理大量传感器数据时,可以采用分批处理的方式,减少内存占用。
    性能优化:由于 ESP8266 的处理能力相对较弱,在处理复杂的 Web 应用和 JSON 操作时,可能会出现性能瓶颈。要优化代码逻辑,减少不必要的计算和循环,提高设备的响应速度。例如,在生成动态网页内容时,可以采用简单高效的模板引擎,避免复杂的 HTML 渲染过程。
    (4)兼容性与更新维护
    浏览器兼容性:虽然 ESP8266 Web 应用基于标准的 HTTP 协议和 JSON 格式,但不同的浏览器在对 JavaScript、CSS 等相关技术的支持上可能存在差异。在开发 Web 页面时,需要考虑到主要浏览器(如 Chrome、Firefox、Safari、IE 等)的兼容性,确保页面在各种浏览器上都能正常显示和交互。
    设备和固件更新:随着技术的发展和应用需求的变化,可能需要对 ESP8266 设备和相关固件进行更新。在更新过程中,要确保新的固件与现有 Web 应用兼容,并且不会丢失已有的数据和设置。同时,要注意更新过程的安全性,避免因更新导致设备无法正常工作或出现安全漏洞。

在这里插入图片描述

1、ESP8266 温湿度传感器 Web 服务器

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

#define DHTPIN 2     // DHT 传感器引脚
#define DHTTYPE DHT11 // DHT 11 型号

const char* ssid = "your_SSID";       // WiFi SSID
const char* password = "your_PASSWORD"; // WiFi 密码

DHT dht(DHTPIN, DHTTYPE);
ESP8266WebServer server(80); // 创建 Web 服务器对象

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("Connecting to WiFi...");
    }
    Serial.println("Connected to WiFi.");

    dht.begin();
    server.on("/", handleRoot); // 设置根路径的处理函数
    server.begin();
    Serial.println("HTTP server started.");
}

void loop() {
    server.handleClient(); // 处理客户端请求
}

void handleRoot() {
    float humidity = dht.readHumidity();    // 读取湿度
    float temperature = dht.readTemperature(); // 读取温度

    // 创建 JSON 对象
    StaticJsonDocument<200> doc;
    doc["temperature"] = temperature;
    doc["humidity"] = humidity;

    // 序列化 JSON 对象
    String response;
    serializeJson(doc, response);

    // 设置 HTTP 响应头和内容
    server.send(200, "application/json", response);
}

2、ESP8266 光照传感器 Web 服务器

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

const char* ssid = "your_SSID";       // WiFi SSID
const char* password = "your_PASSWORD"; // WiFi 密码

const int ldrPin = A0; // LDR 引脚
ESP8266WebServer server(80); // 创建 Web 服务器对象

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("Connecting to WiFi...");
    }
    Serial.println("Connected to WiFi.");

    server.on("/", handleRoot); // 设置根路径的处理函数
    server.begin();
    Serial.println("HTTP server started.");
}

void loop() {
    server.handleClient(); // 处理客户端请求
}

void handleRoot() {
    int lightLevel = analogRead(ldrPin); // 读取光照强度

    // 创建 JSON 对象
    StaticJsonDocument<100> doc;
    doc["light_level"] = lightLevel;

    // 序列化 JSON 对象
    String response;
    serializeJson(doc, response);

    // 设置 HTTP 响应头和内容
    server.send(200, "application/json", response);
}

3、ESP8266 LED 控制 Web 服务器

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

const char* ssid = "your_SSID";       // WiFi SSID
const char* password = "your_PASSWORD"; // WiFi 密码

const int ledPin = 2; // LED 引脚
ESP8266WebServer server(80); // 创建 Web 服务器对象

void setup() {
    Serial.begin(115200);
    pinMode(ledPin, OUTPUT);
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("Connecting to WiFi...");
    }
    Serial.println("Connected to WiFi.");

    server.on("/", handleRoot); // 设置根路径的处理函数
    server.on("/led", handleLED); // 设置 LED 控制路径
    server.begin();
    Serial.println("HTTP server started.");
}

void loop() {
    server.handleClient(); // 处理客户端请求
}

void handleRoot() {
    // 创建 JSON 对象
    StaticJsonDocument<200> doc;
    doc["message"] = "欢迎使用 LED 控制 API!";

    // 序列化 JSON 对象
    String response;
    serializeJson(doc, response);

    // 设置 HTTP 响应头和内容
    server.send(200, "application/json", response);
}

void handleLED() {
    if (server.arg("state") == "on") {
        digitalWrite(ledPin, HIGH);
    } else {
        digitalWrite(ledPin, LOW);
    }

    // 创建 JSON 对象
    StaticJsonDocument<100> doc;
    doc["led_state"] = digitalRead(ledPin) == HIGH ? "on" : "off";

    // 序列化 JSON 对象
    String response;
    serializeJson(doc, response);

    // 设置 HTTP 响应头和内容
    server.send(200, "application/json", response);
}

要点解读
WiFi 连接:
在所有示例中,ESP8266 首先连接到 WiFi 网络。确保正确配置 SSID 和密码,以便设备能够访问互联网。
创建 Web 服务器:
使用 ESP8266WebServer 类创建一个简单的 HTTP 服务器,监听端口 80。通过 server.on() 方法设置请求路径及其对应的处理函数。
处理请求:
在 loop() 函数中,调用 server.handleClient() 来处理客户端请求。根据请求的路径调用相应的处理函数,如查询传感器数据或控制设备。
返回 JSON 响应:
使用 Arduino JSON 库创建 JSON 对象,存储传感器数据或状态信息。通过 serializeJson() 将 JSON 对象转换为字符串格式,并通过 server.send() 发送 HTTP 响应,设置状态码为 200 表示请求成功。
动态控制与反馈:
示例 3 展示了如何通过 URL 参数控制 LED 状态。客户端可以发送请求以打开或关闭 LED,服务器根据请求动态更新状态并返回当前状态的 JSON 响应。这种灵活性使得设备控制和数据反馈能够实时进行。

在这里插入图片描述
4、简单的欢迎消息

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

const char* ssid = "YOUR_SSID";       // WiFi SSID
const char* password = "YOUR_PASSWORD"; // WiFi密码

ESP8266WebServer server(80); // 创建Web服务器对象,监听80端口

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("Connected to WiFi");

    server.on("/", handleRoot); // 设置根路径的处理函数
    server.begin(); // 启动服务器
}

void loop() {
    server.handleClient(); // 处理客户端请求
}

void handleRoot() {
    StaticJsonDocument<200> doc;
    doc["message"] = "欢迎来到ESP8266 Web服务器!";

    String response;
    serializeJson(doc, response); // 将JSON对象序列化为字符串

    server.send(200, "application/json", response); // 发送JSON响应
}

要点解读:
WiFi连接:程序首先连接到WiFi,以便ESP8266能够处理HTTP请求。
Web服务器创建:使用ESP8266WebServer库创建一个简单的HTTP服务器,监听80端口。
请求处理:设置根路径(“/”)的请求处理函数,定义该路径的响应。
JSON响应:使用Arduino JSON库创建JSON对象,构建返回的欢迎信息,并序列化为字符串格式。
HTTP响应:通过HTTP协议发送JSON数据,使用application/json MIME类型,确保响应格式正确。

5、带参数的问候

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

const char* ssid = "YOUR_SSID";       // WiFi SSID
const char* password = "YOUR_PASSWORD"; // WiFi密码

ESP8266WebServer server(80);

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("Connected to WiFi");

    server.on("/greet", handleGreet); // 设置/greet路径的处理函数
    server.begin();
}

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

void handleGreet() {
    String name = server.arg("name"); // 获取URL参数
    StaticJsonDocument<200> doc;

    if (name.isEmpty()) {
        doc["message"] = "欢迎来到ESP8266 Web服务器!";
    } else {
        doc["message"] = "欢迎," + name + "!";
    }

    String response;
    serializeJson(doc, response);
    server.send(200, "application/json", response);
}

要点解读:
参数处理:API服务器支持通过URL传递参数(如/greet?name=John),使其更加灵活。
动态响应:根据传递的参数返回不同的欢迎信息,提升用户体验。
JSON格式化:使用Arduino JSON库构建JSON对象,确保返回的数据格式一致。
逻辑判断:根据参数是否为空来决定响应内容,增强了应用的交互性。
易于扩展:该结构易于添加更多功能或参数,适合构建更复杂的Web应用。

6、状态检查API

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

const char* ssid = "YOUR_SSID";       // WiFi SSID
const char* password = "YOUR_PASSWORD"; // WiFi密码

ESP8266WebServer server(80);

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("Connected to WiFi");

    server.on("/status", handleStatus); // 设置/status路径的处理函数
    server.begin();
}

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

void handleStatus() {
    StaticJsonDocument<200> doc;
    doc["status"] = "在线"; // 返回服务器状态
    doc["message"] = "ESP8266 Web服务器正在运行!";

    String response;
    serializeJson(doc, response);
    server.send(200, "application/json", response);
}

要点解读:
状态检查:该API返回ESP8266的运行状态,适合用于监控系统的健康状态。
简洁的响应:JSON对象简单明了,返回服务器的状态信息,方便用户理解。
HTTP响应:通过HTTP 200状态码返回正常的响应,符合HTTP协议规范。
JSON对象构建:使用Arduino JSON库构建返回的JSON对象,确保数据格式的清晰性。
便于集成:可以与其他系统或应用集成,获取ESP8266的状态信息,提高实用性。

总结
这几个案例展示了如何使用Arduino JSON库在ESP8266上创建Web应用,返回JSON格式的数据。关键点包括:
WiFi连接:确保ESP8266能够连接到网络,以便处理HTTP请求。
Web服务器创建:使用ESP8266WebServer库轻松创建服务器,监听特定端口。
JSON构建与响应:利用Arduino JSON库构建JSON对象并进行序列化,便于数据交换。
动态内容:通过URL参数返回个性化的信息,增强用户体验。
易于扩展与集成:结构清晰,便于添加更多功能和与其他系统集成。

注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值