QT上位机实现ZigBee网关节点配置与TSC标签打印

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本文介绍了如何利用QT上位机对ZigBee网关节点进行配置,并集成了TSC标签打印机功能。ZigBee网关节点设置QT上位机是一个应用程序,基于QT5.7框架开发,提供了友好的图形用户界面,支持串口通信来设置和管理ZigBee网关节点的参数,如网络ID、设备地址、通信速率等。此外,软件还支持与TSC标签打印机交互,方便用户设置和打印标签,以标识和管理网络节点。 ZIGBEE网关节点

1. ZigBee技术介绍

1.1 ZigBee技术概述

ZigBee是一种基于IEEE 802.15.4标准的高级通信协议,用于创建低功耗、低数据率的个人区域网络。ZigBee技术以其低复杂度、低功耗、低数据速率、低成本等特点,被广泛应用于短距离无线通信场景中,如智能家居、工业自动化、智能医疗等领域。

1.2 ZigBee的网络拓扑结构

ZigBee网络支持三种基本拓扑结构:星型拓扑、树状拓扑和网状拓扑。星型拓扑中,所有设备都直接与中心协调器相连;树状拓扑类似于家谱,每个设备都连接到一个父节点;网状拓扑提供了最大的网络覆盖范围和节点数量,允许节点在一定范围内直接通信,提高了网络的可靠性和覆盖面积。

1.3 ZigBee的应用场景

ZigBee技术以其独特的功能,特别适合于点对点、多点对多点、星型、群集等应用场景。这些场景包括但不限于传感器网络、自动化控制、医疗监护、家庭和建筑物自动化。ZigBee网络能够支持多达65000个设备,适合构建大规模的物联网应用,例如智慧城市、智能农业等。

通过这一章节,我们对ZigBee技术有了一个整体的了解,为后面深入探讨ZigBee技术在实际应用中的配置和使用打下了基础。

2. QT5.7框架基础与开发环境设置

2.1 QT5.7框架概述

2.1.1 QT的发展历程

QT是一个跨平台的C++应用程序框架,由Trolltech公司于1991年启动开发,并在1996年首次发布。随着发展,QT逐渐成为在Linux、Unix、Windows、Mac OS X以及移动操作系统上开发图形用户界面应用程序的热门选择。2008年,QT被诺基亚收购,并在2012年开源其代码。之后,QT经历了多次重要的更新,不断地增强了其在跨平台开发中的性能和稳定性。

2.1.2 QT5.7框架的主要特性和优势

QT5.7框架具有以下主要特性和优势: - 跨平台能力 :QT 5.7支持所有主流操作系统,能够实现一次编写,到处运行。 - 模块化设计 :框架分为核心模块和扩展模块,可根据项目需求灵活选择。 - 集成开发工具 :QT Creator提供源码编辑、项目管理、调试等一体化开发工具。 - 丰富控件库 :包含了众多标准控件,如按钮、列表、文本框等,方便构建用户界面。 - 信号与槽机制 :提供了一种通信机制,允许对象之间的松耦合通信。 - 图形和动画支持 :通过OpenGL支持高质量图形和动画效果。 - 性能优越 :优化的渲染引擎和事件处理机制保证了应用的流畅运行。

2.2 QT5.7开发环境的搭建

2.2.1 安装QT5.7

安装QT5.7的步骤如下: 1. 访问QT官网下载QT5.7安装包。 2. 运行安装程序并选择安装类型,推荐选择自定义安装,以便安装你需要的模块。 3. 按照向导完成安装,注意在安装过程中勾选“安装Qt Creator IDE”。 4. 安装完成后,启动QT Creator,进行初始设置。

2.2.2 配置和优化开发环境

为了有效地进行开发,可以对QT5.7开发环境进行以下配置和优化: - 安装开发工具 :例如Git、CMake等,以便进行版本控制和构建管理。 - 设置编译器 :确保选择了正确的编译器(如GCC)并正确配置。 - 定制快捷键 :在QT Creator中定制快捷键,提高编码效率。 - 优化构建速度 :通过使用预编译头(PCH)和减少不必要的依赖项来加快编译速度。 - 调试配置 :配置调试器以方便调试过程中的错误查找和分析。

2.3 QT5.7基础组件使用

2.3.1 信号与槽机制

信号与槽是QT中用于对象间通信的一种机制,无需了解接收者对象的内部细节即可实现通信。该机制的工作原理是当一个事件发生时(例如按钮被点击),发送一个信号(signal),而连接到这个信号的槽(slot)则会被执行。

代码示例

// 定义一个继承自QObject的类,用于信号和槽的实现
class MyClass : public QObject {
    Q_OBJECT
public:
    MyClass() {
        // 当valueChanged被调用时,槽函数updateValue会被触发
        connect(this, &MyClass::valueChanged, this, &MyClass::updateValue);
    }
signals:
    // 定义一个信号,当信号被发射时,连接到这个信号的槽函数会执行
    void valueChanged(int value);
public slots:
    // 定义一个槽函数
    void updateValue(int value) {
        // 更新值的逻辑
    }
};

// 主函数中创建对象并发射信号
int main() {
    MyClass myObject;
    myObject.emit MyClass::valueChanged(10); // 发射信号,槽函数updateValue将被执行
}

2.3.2 常用控件和布局管理

QT5.7提供了丰富的控件库,包括各种按钮、编辑框、列表、窗口、对话框等。这些控件可以单独使用,也可以组合起来,形成复杂的用户界面。

布局管理 是使用QT5.7控件的关键部分。QT5.7支持多种布局方式,包括水平和垂直布局(QHBoxLayout 和 QVBoxLayout),网格布局(QGridLayout),以及表单布局(QFormLayout)。

布局管理代码示例

// 创建一个窗口和一些控件
QWidget *window = new QWidget;
QPushButton *pushButton = new QPushButton("pushButton");
QTextEdit *textEdit = new QTextEdit;
QVBoxLayout *layout = new QVBoxLayout;

// 将控件添加到布局中
layout->addWidget(pushButton);
layout->addWidget(textEdit);

// 设置窗口的布局
window->setLayout(layout);

// 显示窗口
window->show();

在这个简单的例子中,我们创建了一个包含一个按钮和一个文本编辑框的窗口,通过VBoxLayout对这两个控件进行布局管理,并将其设置给主窗口显示出来。

3. ZigBee网关节点配置

3.1 ZigBee网关节点概述

3.1.1 网关节点的作用和特点

在ZigBee网络中,网关节点充当了连接物理世界与数字信息世界的关键桥梁。网关节点不仅是数据的收发中心,还需要完成数据的过滤、转发、协议转换等功能。与普通节点相比,网关节点通常需要更高的处理能力、更大的存储空间以及更强的网络连接功能。

网关节点的作用主要体现在以下几个方面:

  • 数据汇聚:网关节点将多个从节点收集来的数据进行汇总,保证数据的集中处理。
  • 协议转换:网关节点负责将ZigBee协议的数据转换为上层应用(如TCP/IP网络)可以理解的格式,实现不同网络协议之间的数据交换。
  • 远程访问:通过网关节点,用户可以远程访问和管理ZigBee网络中的设备,实现对网络节点的监控和控制。
  • 安全防护:网关节点还可以提供一定的安全防护机制,例如加密传输和访问控制,保证数据传输的安全性。

3.1.2 网关节点的硬件选型和配置

选择合适的硬件对于网关节点的性能至关重要。网关节点的硬件配置通常包括以下几个关键部件:

  • 微处理器(CPU):一个高性能的CPU是网关节点的心脏,需要有足够的处理能力来处理数据和运行复杂的协议栈。
  • 存储器:除了RAM用于运行时的数据存储,还需要有足够的非易失性存储器(如Flash或EEPROM)来持久化存储配置和日志数据。
  • 网络接口:网关节点需要至少两个网络接口,一个是ZigBee无线模块接口,另一个是连接到外部网络(如以太网)的接口。
  • 电源:稳定的电源供应是确保网关节点长时间稳定运行的保障,通常采用直流电源供电。

配置网关节点时,还需要考虑以下因素:

  • 兼容性:确保硬件配置与ZigBee协议栈和上层应用软件的兼容性。
  • 扩展性:网关节点应支持硬件升级或扩展,以适应未来可能增加的功能和性能需求。
  • 环境适应性:根据应用环境的不同,选择适合的防护等级,如IP等级,确保硬件稳定运行。

3.2 ZigBee网关节点的软件设置

3.2.1 软件架构和功能模块

ZigBee网关节点的软件架构通常包括以下功能模块:

  • 协议栈:负责处理ZigBee通信协议相关任务,如地址管理、数据封装和解封装、路由管理等。
  • 网络管理:实现网络的初始化、节点的加入和离开、网络安全管理等功能。
  • 数据处理:包括数据的收集、过滤、格式转换以及数据缓存等功能。
  • 远程通信:通过TCP/IP等协议,实现与远程服务器或终端的通信。

软件架构的设计需要保证模块的独立性和互操作性,同时还需要注重代码的可维护性和可扩展性。

3.2.2 网络参数和安全配置

ZigBee网关节点的网络参数配置和安全配置是确保网络稳定运行的关键。网络参数配置包括:

  • PAN ID(个人区域网络ID):用于区分不同的ZigBee网络,防止干扰。
  • 信道:选择合适的无线通信频率信道,以避免与其他无线设备的信号冲突。
  • 网络密钥:设置网络的安全密钥,以确保数据传输的安全性。

安全配置需要考虑:

  • 加密算法:选择适合的加密算法(如AES-128)来保护数据传输的安全。
  • 访问控制列表(ACL):通过ACL控制对ZigBee网络的访问权限,防止未授权访问。
  • 安全策略:根据实际需求设置设备配对、密钥更新等安全策略。

通过合理的软件配置,可以确保ZigBee网关节点既稳定又安全地运行。接下来的章节将具体介绍ZigBee网关节点配置中的具体操作步骤和代码实现。

4. 串口通信实践操作

在现代社会,串口通信仍然是设备之间传递信息的一种有效手段。尤其是在工业控制、医疗设备、嵌入式系统和物联网领域,串口通信扮演了重要的角色。对于IT和相关行业的专业人员而言,掌握串口通信技术,可以为设备集成、数据分析和远程监控等提供强有力的支持。

4.1 串口通信基础

4.1.1 串口通信协议和格式

串口通信是通过串行端口发送和接收数据的一种方式。它使用串行通信协议,将数据一位接一位地顺序传输。其基本格式包括起始位、数据位、校验位和停止位。起始位标志着数据传输的开始,数据位代表实际的数据内容,校验位用于数据的完整性检测,而停止位则表明数据包的结束。

在实际应用中,最为常见的串口通信协议是RS-232。RS-232定义了信号线、通信速率、信号电平等技术细节。例如,一个典型的串口配置为8数据位,1停止位,无校验位,波特率为9600 bps(位每秒)。

4.1.2 串口通信在ZigBee中的应用

在ZigBee网络中,串口通信常常作为网关节点与中心控制器或监控系统之间的数据交换通道。串口通信在这里起着桥梁作用,实现了ZigBee节点的数据汇聚和远程控制功能。通过串口通信,可以将ZigBee节点收集的各类传感器数据发送给中心控制器进行处理分析,或者将中心控制器的命令发送给网关节点,再由网关节点转发至相应的ZigBee节点。

4.2 串口编程实践

4.2.1 使用QT进行串口编程

在QT5.7中,串口通信是通过QSerialPort类实现的。QSerialPort是QT提供的一个用于串口通信的C++类,它封装了串口通信的相关操作,使得开发者可以方便地进行串口编程。以下是一个基本的串口编程实践步骤:

  1. 包含串口类头文件
  2. 创建QSerialPort对象
  3. 配置串口参数(如波特率、数据位等)
  4. 打开串口
  5. 读写数据
  6. 关闭串口

代码示例:

#include <QSerialPort>

// 创建串口对象
QSerialPort serialPort;

// 连接串口打开成功的信号
connect(&serialPort, &QSerialPort::readyRead, this, &MainWindow::readData);

// 设置串口参数并打开串口
serialPort.setPortName("COM3"); // 设置串口名称
serialPort.setBaudRate(QSerialPort::Baud9600); // 设置波特率为9600
serialPort.setDataBits(QSerialPort::Data8); // 设置数据位为8
serialPort.setParity(QSerialPort::NoParity); // 设置无校验位
serialPort.setStopBits(QSerialPort::OneStop); // 设置停止位为1
serialPort.setFlowControl(QSerialPort::NoFlowControl); // 设置无流控制

if (serialPort.open(QIODevice::ReadWrite)) {
    // 串口打开成功
} else {
    // 处理串口打开失败情况
}

4.2.2 串口通信故障排查和调试

在进行串口通信编程时,经常会遇到数据无法正确发送和接收、通信中断等问题。因此,串口通信故障排查和调试是十分重要的环节。调试串口通信,主要依据以下几个方面:

  • 确认串口名称是否正确
  • 检查串口参数是否匹配
  • 使用串口监视工具查看数据发送和接收情况
  • 对于QSerialPort来说,可以连接 error() 信号来捕捉和处理错误

代码示例中的 readyRead() 信号的槽函数 readData() 可以用来读取接收到的数据。示例如下:

void MainWindow::readData()
{
    while (serialPort.waitForReadyRead(3000)) {
        const QByteArray data = serialPort.readAll();
        // 处理接收到的数据
    }
}

通过以上步骤和示例代码,IT和相关行业的专业人员可以更好地理解和实现串口通信编程。在实际的开发中,还需要考虑异常处理、数据解析、线程同步等复杂问题。通过连续的测试和调试,优化串口通信的稳定性和效率。

4.3 使用其他工具和框架进行串口通信

除了QT,还有其他许多工具和框架可以用于串口编程。这些工具和框架各有特点,适合于不同的开发环境和需求。例如:

  • Windows平台下的WinAPI Serial Comm API
  • 跨平台的Qt Serial Bus (QSerialBus)
  • 高级语言库如Python的pySerial

每种工具和框架都有其特定的API接口和使用场景,需要开发者根据项目需求和自身熟悉度选择适合的串口通信方案。

5. TSC标签打印机集成与使用

5.1 TSC标签打印机简介

5.1.1 TSC标签打印机的工作原理

TSC标签打印机是一种热敏打印设备,它利用热敏打印头上的点阵压印来打印图形或文字。热敏打印技术的主要工作原理是,当打印头通过施加电压加热时,热敏纸上的热敏涂层会因为热量的作用而发生化学反应变色,形成所需的文字或图案。一旦热敏纸冷却,打印出来的图像就会固定,不会因为时间的推移而消失。

5.1.2 TSC标签打印机的型号选择和配置

在集成TSC标签打印机时,需要考虑型号的选择,这通常基于打印宽度、打印速度、分辨率和打印头寿命等要素。根据打印需求选择合适的型号后,还要进行必要的配置,如设置打印参数、安装打印驱动等。在配置过程中,需要确认打印机的网络设置或USB连接是否正确,以确保能与开发环境正常通信。

5.2 TSC标签打印机的软件集成

5.2.1 集成QT5.7开发环境

要在QT5.7中集成TSC标签打印机,首先需要确保开发环境已正确安装和配置了所有必要的库和插件。具体步骤包括:

  1. 下载并安装TSC打印SDK,这是由TSC提供的软件开发包,用于在QT5.7中调用TSC打印机功能。
  2. 在QT Creator中创建一个新的项目,并在.pro文件中添加对应的库引用。
  3. 初始化TSC打印SDK并测试与打印机的通信连接,确保开发机与打印机能够通过串口或其他通信方式进行数据交换。

5.2.2 编写标签打印程序

编写标签打印程序是与TSC标签打印机集成中的关键部分。在QT5.7环境下,可以使用QT的信号与槽机制来处理打印任务,代码示例如下:

#include <QPrinter>
#include <QPrintEngine>
#include <QPaintEngine>
#include <QPainter>

class TscLabelPrinter : public QPrinter {
public:
    TscLabelPrinter() {
        // 初始化打印机相关设置
    }

protected:
    QPaintEngine *createPaintEngine() override {
        // 设置打印机引擎
    }
};

void printLabel() {
    TscLabelPrinter printer;
    printer.setOutputFormat(QPrinter::NativeFormat); // 设置打印格式为打印机默认格式

    QPainter painter;
    painter.begin(&printer);

    // 设置打印内容和布局
    painter.setFont(QFont("Arial", 10));
    painter.drawText(QRectF(0, 0, 100, 50), Qt::AlignCenter, "Hello, TSC!");
    painter.end();
}

在上述代码中,我们定义了一个TscLabelPrinter类继承自QPrinter,创建一个用于标签打印的打印机对象,并使用QPainter在其中绘制文本内容。这里简单展示了一个文本打印的例子,实际应用中可能需要打印更复杂的图形或条形码等。

开发者需要根据实际的打印需求,设计打印内容的布局、字体、大小等,并在 paintEvent 中完成绘制。务必记得处理好与TSC标签打印机的通信协议,确保打印内容符合打印机的要求。

通过以上步骤,我们可以将TSC标签打印机集成到QT5.7开发环境中,并成功实现基本的打印任务。在后续的开发中,可以进一步优化打印程序,比如通过增加图形用户界面(GUI)让用户更方便地设计打印标签,或者添加更多的打印格式支持等。

6. 设备参数设置与管理

在第六章节,我们深入探讨设备参数设置与管理的重要性及其在嵌入式系统和物联网设备中的应用。设备参数的正确设置能够显著提升系统的性能,而动态的参数管理则确保了设备在各种环境下的稳定运行。

6.1 设备参数设置的重要性

6.1.1 设备参数对系统性能的影响

设备参数是影响嵌入式系统和物联网设备性能的关键因素。这些参数可能包括电源管理、通信频率、传感器灵敏度等,它们直接影响着设备的行为和效率。在ZigBee网络中,设备参数的设置尤其重要,因为它们决定了设备如何响应网络事件,如何与其他设备通信,以及如何达到最佳的功耗和性能平衡。

例如,一个ZigBee设备的通信功率参数的设置可能会显著影响到网络的整体传输距离和稳定性。如果设置过高,可能会造成不必要的能耗;而设置过低,则可能无法保证信号的有效覆盖。因此,理解每个参数背后的技术含义,并根据应用场景进行精细调整,对于实现设备最佳性能至关重要。

6.1.2 设备参数设置的方法和步骤

设备参数的设置通常通过软件接口进行,这些接口可能是设备提供的专用配置工具,或者是通用的配置命令集。无论使用哪种方法,都需要遵循一些基本步骤:

  1. 获取设备配置手册或技术文档 :这是理解设备可用参数及其功能的起点。
  2. 分析设备运行环境和需求 :了解设备将运行在什么环境下,以及用户的具体需求,这将指导参数设置的方向。
  3. 编写配置脚本或使用配置工具 :如果是通过脚本配置,你需要根据设备的技术规格书编写相应的配置命令;如果设备提供图形界面工具,可以通过图形界面进行设置。
  4. 测试和验证参数设置 :在实际设备上应用新配置后,必须进行全面的测试以确保新设置达到预期效果。
  5. 记录和归档 :为了便于未来的维护和故障排除,应该详细记录每次的设置和测试结果。

6.2 设备参数的动态管理

在设备部署后,可能会遇到需要调整参数以适应新的工作条件或解决突发问题的情况。因此,了解如何动态管理设备参数是至关重要的。

6.2.1 在线监控和调整

设备的在线监控和参数调整可以通过以下流程实现:

  1. 远程访问设备 :使用SSH、Telnet或专用的远程管理软件来访问设备。
  2. 实时监控指标 :读取设备的实时性能指标,如温度、电压、网络状态等。
  3. 分析数据并识别问题 :通过收集的数据来判断设备参数是否存在优化空间。
  4. 动态调整参数 :根据分析结果,动态调整设备运行参数。
  5. 验证参数调整效果 :调整后,再次监控设备性能,确保参数调整达到预期效果。

6.2.2 参数版本控制和备份

参数版本控制和备份是防止意外发生时能够快速恢复设备正常状态的关键措施。此过程涉及到以下步骤:

  1. 设置参数变更日志记录 :记录每次参数变更的详细信息,包括变更时间、人员、变更内容等。
  2. 使用版本控制系统 :利用Git或其他版本控制工具来管理参数设置文件,方便进行回滚和跟踪变更历史。
  3. 定期备份当前参数设置 :定期将设备当前的参数设置备份到安全位置,这可以在灾难发生时快速恢复设备状态。
  4. 自动化备份和恢复流程 :可以编写自动化脚本来定期备份参数,并在需要时恢复到某一特定版本。

示例代码块:使用Python脚本动态调整设备参数

import paramiko

# 创建SSH连接
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='device_ip', port=22, username='admin', password='password')

# 执行命令获取当前参数设置
stdin, stdout, stderr = ssh.exec_command('show system params')
current_params = stdout.read().decode('utf-8')

# 解析当前参数设置,找到需要修改的部分
# 此处省略解析过程...

# 修改参数并提交设置
ssh.exec_command('set system param1 new_value')
ssh.exec_command('set system param2 new_value')

# 验证设置是否成功
stdin, stdout, stderr = ssh.exec_command('show system params')
new_params = stdout.read().decode('utf-8')

# 比较并确认参数已经更新
assert new_params != current_params

# 断开SSH连接
ssh.close()

在上述脚本中,我们使用了Python的 paramiko 库来创建一个SSH连接,然后执行命令以获取当前的设备参数设置。接着,我们解析这些参数,并通过SSH连接发送新的设置值。最后,我们再次执行命令以确认参数已更改。需要注意的是,在实际应用中,必须确保对参数设置的权限进行严格控制,以防止未经授权的访问和修改。

以上即为第六章节“设备参数设置与管理”的内容。接下来,我们将深入第七章,探讨GUI设计和交互流程的重要性。

7. GUI设计与交互流程

GUI设计和交互流程对于提供用户友好和高效的软件界面至关重要。在这一章节中,我们将探讨设计原则和方法,以及如何绘制交互流程图,并对其进行优化。

7.1 GUI设计原则和方法

7.1.1 用户体验的重要性

用户体验(User Experience,简称UX)是衡量一个软件应用是否成功的关键因素。一个良好的GUI设计能够确保用户能够直观、轻松地完成任务。在设计时,需要考虑到用户的使用场景、操作习惯和心理预期,确保界面布局合理、功能清晰、引导明确。

7.1.2 GUI设计的最佳实践

在进行GUI设计时,有几个最佳实践是值得遵循的:

  • 简洁性 :界面不应过于拥挤,应突出主要功能,避免不必要的元素干扰用户的操作。
  • 一致性 :整个应用中的设计元素和交互行为应保持一致,以减少用户的学习成本。
  • 可访问性 :设计应考虑到不同用户的需求,包括残障人士,确保应用对所有用户都是可访问的。
  • 反馈及时 :用户操作后应立即收到反馈,无论是视觉上的变化还是听觉上的提示音。
  • 测试与迭代 :在设计过程中应不断进行用户测试,并根据反馈进行迭代优化。

7.2 交互流程设计

7.2.1 交互流程图绘制

交互流程图是描绘用户与软件界面交互过程的图示,它有助于理解用户如何完成特定任务。一个有效的流程图通常包含以下几个部分:

  • 起始和结束点 :明确流程的开始和结束。
  • 操作步骤 :用户需要执行的每个具体动作。
  • 决策点 :用户需要作出选择的时刻,通常用菱形表示。
  • 流程箭头 :指示操作步骤和决策点之间的流转方向。

使用流程图工具(如Visio、Lucidchart或在线的mermaid语法生成工具)可以帮助我们更直观地绘制和修改流程图。

7.2.2 流程的优化和用户反馈

绘制流程图之后,还需对其不断进行优化,以提升用户体验。这包括:

  • 移除不必要的步骤 :简化流程,减少用户操作。
  • 优化决策点 :确保决策点清晰易懂,避免用户混淆。
  • 测试与收集反馈 :实施用户测试,收集用户对流程的反馈,并据此进行调整。

优化后的流程应通过实际用户的使用来验证其有效性,持续迭代是提升软件易用性的关键。

在本章节,我们详细探讨了GUI设计与交互流程的理论和实践。在下一章节,我们将深入探讨上位机软件的开发与部署。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本文介绍了如何利用QT上位机对ZigBee网关节点进行配置,并集成了TSC标签打印机功能。ZigBee网关节点设置QT上位机是一个应用程序,基于QT5.7框架开发,提供了友好的图形用户界面,支持串口通信来设置和管理ZigBee网关节点的参数,如网络ID、设备地址、通信速率等。此外,软件还支持与TSC标签打印机交互,方便用户设置和打印标签,以标识和管理网络节点。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值