垃圾分类子项目-识别垃圾类型

TypeScript 7性能飞跃与AI应用工程化:从开发效率到架构实践 类型系统是现代编程语言的核心机制,它通过静态检查在编译阶段发现潜在错误,提升代码的健壮性和可维护性。其原理是在代码执行前对变量、函数参数和返回值的数据结构进行约束与验证。这一技术价值在于能显著降低大型项目的维护成本,并增强开发工具(如IDE)的智能提示能力。在AI应用开发这一典型场景中,复杂的异步数据流、多模型API集成以及前后端类型同步都对类型系统的性能提出了更高要求。TypeScript作为JavaScript的超集,其类型检查速度直接影响着AI应用前端的开发体验与迭代效率。近期TypeScript 7 阅读详情

思路: 阿里云图像识别 +  语音模块实现

主程序:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h> // access()

#include <error.h>  // remove()

#include "uartTool.h"

#include "garbage.h"

static int detect_process(const char *process_name) // 判断某个进程是否在运行

{

    int n = -1;

    FILE *strm;

    char buf[128] = {0};

    sprintf(buf, "ps -ax | grep %s|grep -v grep", process_name); // 组合进程名字,为完整命令

    if ((strm = popen(buf, "r")) != NULL)                        // 通过 popen 的 方式去执行

    {

        if (fgets(buf, sizeof(buf), strm) != NULL) // 执行完后 判断是否能拿到正确的进程号,空格分开,第一个字符串就是进程号

        {

            n = atoi(buf); // 拿到就放回 进程号,不然  返回 -1

        }

    }

    else

    {

        return -1; // 执行失败

    }

    pclose(strm);

    return n;

}

int main(int argc, char **argv)

{

    int serial_fd = -1;

    int len = 0;

    int ret = -1;

    char *category = NULL;

    unsigned char buffer[6] = {0xAA, 0x55, 0x00, 0x00, 0x55, 0xAA}; // 初始化 buffer[2] --  关联垃圾类型

     garbage_init();     // 先初始化 阿里云接口

    ret = detect_process("mjpg_streamer"); // 用于判断mjpg_streamer服务是否已经启动

    if (-1 == ret)

    {

        goto END;

    }

                           

    serial_fd = myserialOpen(SERIAL_DEV, BAUD); // 初始化串口,打开串口设备(语言模块)

    if (serial_fd == -1)

    { // 初始化串口失败

        goto END;

    }

    while (1) // 等待语言输入

    {

        len = serialGetstring(serial_fd, buffer); // 通过串口获得语言输入

        printf("lend=%d, buf[2]=0x%x\n", len, buffer[2]);

        if (len > 0 && buffer[2] == 0x46)         // 判断是否 需要启动识别

        {

            buffer[2] = 0x00;// 判断完后 恢复,方便下次判断

            system(WGET_CMD); // 拍照

           

           

            //if (access(GARBAGE_FILE, F_OK) == 0) // 判断 文件存在

           // {

                category = garbage_category(category); // 通过通过阿里云接口图像识别 获取垃圾类型

                if (strstr(category, "干垃圾"))

                {

                    buffer[2] = 0x41;

                }

                else if (strstr(category, "湿垃圾"))

                {

                    buffer[2] = 0x42;

                }

                else if (strstr(category, "可回收垃圾"))

                {

                    buffer[2] = 0x43;

                }

                else if (strstr(category, "有害垃圾"))

                {

                    buffer[2] = 0x44;

                }

                else

                {

                    buffer[2] = 0x45;

                }

            //}

            // else

            //{ // 没有获取到图片

            //  buffer[2] = 0x45;

            //}

            serialSendstring(serial_fd, buffer, 6); // 将识别到的数据发送到串口

            buffer[2] = 0x00;                       // 发送完后,一堆有效数据位清零,方便下一次调用

            remove(GARBAGE_FILE);                   // 清理缓存 删除刚刚拍摄的图片,避免对下一次拍摄造成干扰

        }

    }

END:

    garbage_final();

    return 0;

}

头文件

  garbage.h

#ifndef __GARBAGE__H
#define __GARBAGE__H


void garbage_init(void);
void garbage_final(void);
char *garbage_category(char *category);

//为什么能用 127.0.0.1  我们是vscode 远程连接到香橙派 --  实际上是在orangepi上运行,用本地ip即可
#define WGET_CMD "wget http://127.0.0.1:8080/?action=snapshot -O/tmp/garbage.jpg"
#define GARBAGE_FILE "/tmp/garbage.jpg"

#endif

uartTool.h

#ifndef __UARTTOOL_H
#define _UARTTOOL_H

int myserialOpen (const char *device, const int baud);
void serialSendstring (const int fd, const unsigned char *s,int len);
int serialGetstring (const int fd,unsigned char *buffer);

//设置串口5  和 波特率 115200
#define SERIAL_DEV "/dev/ttyS5"
#define BAUD 115200

#endif

其他源文件: 

  garbage.c



#include<Python.h>
#include "garbage.h"

void garbage_init(void)
{
	Py_Initialize();
	PyObject *sys = PyImport_ImportModule("sys");

	PyObject *path = PyObject_GetAttrString(sys,"path");

	PyList_Append(path, PyUnicode_FromString("."));

}
void garbage_final(void)
{
         Py_Finalize();

}



char *garbage_category(char *category)
{

	PyObject *pModule= PyImport_ImportModule("garbage");
	if(!pModule)
	{
		PyErr_Print();
		printf("Error: failed to load garbage.py\n");
	        goto FAILED_MODULE;
	}

	PyObject *pfunc =PyObject_GetAttrString(pModule,"alibaba_garbage");


	if(!pfunc)
	{
		PyErr_Print();
		printf("Error: failed to load alibaba_garbage\n");
                goto FAILED_FUNC;
	}



	PyObject *pValue = PyObject_CallObject(pfunc, NULL);


	if(!pValue)
	{
		PyErr_Print();
		printf("Error:function call failed\n");
                goto FAILED_VALUE;

	}

	char * result = NULL;
	if(!PyArg_Parse(pValue,"s",&result))
	{

		PyErr_Print();
		printf("Error:garbage failed\n");
                goto FAILED_RESULT;

	}	
	printf("result=%s\n",result );
        // pValue 下面会被释放,他的result值就拿不到,得先存起来
        category = (char*)malloc(sizeof(char)*(strlen(result)+1));
        memset(category,0,(strlen(result)+1));
        strncpy(category,result,(strlen(result)+1));

	//注意释放顺序是反的,从新到旧
	// 添加跳转位置,当发生错误的时候,跳转过来将他释放
FAILED_RESULT:
	Py_DECREF(pValue);

FAILED_VALUE:
	Py_DECREF(pfunc);

FAILED_FUNC:
	Py_DECREF(pModule);

FAILED_MODULE:


	return  category;
}







uartTool.c 

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "wiringSerial.h"
int myserialOpen (const char *device, const int baud)
{
struct termios options ;
speed_t myBaud ;
int status, fd ;
switch (baud){
case 9600: myBaud = B9600 ; break ;
case 115200: myBaud = B115200 ; break ;
}
if ((fd = open (device, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK)) == -1)
return -1 ;
fcntl (fd, F_SETFL, O_RDWR) ;
// Get and modify current options:
tcgetattr (fd, &options) ;
cfmakeraw (&options) ;
cfsetispeed (&options, myBaud) ;
cfsetospeed (&options, myBaud) ;
options.c_cflag |= (CLOCAL | CREAD) ;
options.c_cflag &= ~PARENB ;
options.c_cflag &= ~CSTOPB ;
options.c_cflag &= ~CSIZE ;
options.c_cflag |= CS8 ;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG) ;
options.c_oflag &= ~OPOST ;
options.c_cc [VMIN] = 0 ;
options.c_cc [VTIME] = 100 ; // Ten seconds (100 deciseconds)
tcsetattr (fd, TCSANOW, &options) ;
ioctl (fd, TIOCMGET, &status);
status |= TIOCM_DTR ;
status |= TIOCM_RTS ;
ioctl (fd, TIOCMSET, &status);
usleep (10000) ; // 10mS

return fd ;
}
//0xAA 0x55  0x64 00  0x55 0xAA  //0x AA > 157 unsigned
void serialSendstring (const int fd, const unsigned char *s,int len)
{
int ret;
ret = write (fd, s, len); //我们有结束位,而且不为'\0',所以不能用strlen
if (ret < 0)
printf("Serial Puts Error\n");
}
int serialGetstring (const int fd,unsigned char *buffer)
{
int n_read;
n_read = read(fd, buffer,32);
return n_read;
}

垃圾分类最终篇 -- 添加网络控制功能 连接是否存活的机制,它的原理是在一定时间内没有数据往来时,发送探测包给对方,如果对方 没有响应,就认为连接已经断开。心跳包的实现,心跳包就是服务器定时向客户端发送查询信息,如果客户端有回应就代表连接正常, 类似于linux。突然断网,断电,客户端卡死等,客户端根本没机会做出反应,正常断开,强制关闭客户端等,客户端能够做出反应。机制可以通过设置一些参数来调整,如探测时间间 隔、探测次数等。服务器更不了解客户端状态,导致服务器异常等待。: -E -- 保留当前用户的 环境变量。以下代码已经加到主程序中。 阅读详情

相关推荐

代码分享手把手教你:图像识别的垃圾分类系统

主要介绍如何使用python搭建:一个基于深度残差网络(ResNet)的图像识别垃圾分类系统。完整代码使用方法可参考博文:https://blog.youkuaiyun.com/weixin_43486940/article/details/120267108

Python基于树莓派的垃圾分类识别代码,含垃圾分类数据集和tf代码,使用神经网络进行图像识别处理

Python基于树莓派的垃圾分类识别代码,含垃圾分类数据集和tf代码,使用神经网络进行图像识别处理。

Python代码大全 2303

图像智能识别小程序源码+项目说明(垃圾智能分类 通过拍照或者上传照片完成智能垃圾分类).zip

【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 图像智能识别小程序源码+项目说明(垃圾智能分类。通过拍照或者上传照片完成智能垃圾分类).zip 图像智能识别小程序源码+项目说明(垃圾智能分类。通过拍照或者上传照片完成智能垃圾分类).zip 图像智能识别小程序源码+项目说明(垃圾智能分类。通过拍照或者上传照片完成智能垃圾分类).zip 图像智能识别小程序源码+项目说明(垃圾智能分类。通过拍照或者上传照片完成智能垃圾分类).zip 图像智能识别小程序源码+项目说明(垃圾智能分类。通过拍照或者上传照片完成智能垃圾分类).zip 图像智能识别小程序源码+项目说明(垃圾智能分类。通过拍照或者上传照片完成智能垃圾分类).zip 图像智能识别小程序源码+项目说明(垃圾智能分类。通过拍照或者上传照片完成智能垃圾分类).zip 图像智能识别小程序源码+项目说明(垃圾智能分类。通过拍照或者上传照片

基于YOLOv8深度学习的生活垃圾分类目标检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测

基于YOLOv8深度学习的生活垃圾分类目标检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测

阿旭的博客 1万+

深度学习基于卷积神经网络的校园垃圾分类识别系统源代码.zip

深度学习基于卷积神经网络的校园垃圾识别分类系统源代码。 本项目是一个非常完整的深度学习实践项目。借助AI进行垃圾识别分类识别。深度学习基于卷积神经网络的校园垃圾识别分类系统源代码。 本项目是一个非常完整的深度学习实践项目。借助AI进行垃圾识别分类识别。深度学习基于卷积神经网络的校园垃圾识别分类系统源代码。 本项目是一个非常完整的深度学习实践项目。借助AI进行垃圾识别分类识别。深度学习基于卷积神经网络的校园垃圾识别分类系统源代码。 本项目是一个非常完整的深度学习实践项目。借助AI进行垃圾识别分类识别。深度学习基于卷积神经网络的校园垃圾识别分类系统源代码。 本项目是一个非常完整的深度学习实践项目。借助AI进行垃圾识别分类识别。深度学习基于卷积神经网络的校园垃圾识别分类系统源代码。 本项目是一个非常完整的深度学习实践项目。借助AI进行垃圾识别分类识别。

【入门篇】第五章 第一次与 AI Agent 交互

本文介绍了OpenClaw中最基本的用户与AI Agent交互方式,剖析了Agent和Gateway两个核心组件的作用,通过简单示例展示了从用户请求到结果返回的完整执行流程,说明了最小交互过程对验证系统可用性的重要意义,为后续学习复杂任务执行机制奠定基础。

lanyv的博客 512

基于python pyotrch开发的垃圾分类程序,含数据集,基于深度学习的垃圾分类程序

垃圾分类是目前社会的一个热点,分类的任务是计算机视觉任务中的基础任务,相对来说比较简单,只要找到合适的数据集,垃圾分类的模型构建并不难,这里我找到一份关于垃圾分类的数据集,一共有四个大类和245个小类,大类分别是厨余垃圾、可回收物、其他垃圾和有害垃圾,小类主要是垃圾的具体类别,果皮、纸箱等。为了方便大家使用,我已经提前将数据集进行了处理,按照8比1比1的比例将原始数据集划分成了训练集、验证集和测试集,大家可以从下面的链接自取。

Python代码大全 1942

从仿真到部署:基于ROS2与Gazebo的UR5e机械臂全流程控制实践

本文详细介绍了基于ROS2与Gazebo的UR5e机械臂全流程控制实践,从环境准备、模型构建到控制器开发和仿真优化,最终实现真实机器人部署。通过实战案例和避坑指南,帮助开发者掌握机器人仿真与控制的关键技术,提升UR5e机械臂在物料分拣等任务中的性能与稳定性。

weixin_29184371的博客 288

用Python做垃圾分类代码

【代码】用Python做垃圾分类代码。

m0_74262323的博客 6500

javaFx + SpringBoot 启动时报错:No auto configuration classes found in META-INF/spring.factories 解决方法

javaFx+SpringBoot+(de.roskenet:springboot-javafx-support:2.1.6)开发。 直接在idea中运行正常,但打包成jar,之后使用java -jar xxx.jar启动报错,发现日志中有: java.lang.IllegalArgumentException: No auto configuration classes found in META-INF/spring.factories. 以及 at de.felixroske.jfxsuppo

long117long的专栏 4612

FFmpeg流媒体开发避坑指南:avformat_open_input超时设置的那些坑

本文深入剖析了FFmpeg流媒体开发中avformat_open_input函数的超时设置难题。针对默认阻塞行为、无效的timeout参数以及不稳定的线程取消方案等常见误区,文章详细解读了官方推荐的interrupt_callback机制,并提供了健壮的超时控制器实现方案与最佳实践,帮助开发者构建稳定可靠的流媒体应用。

weixin_29239279的博客 237

Python案例——垃圾分类

分析:因为有四种类型的垃圾,所以可以定义三个全局变量的列表,用来存储可回收垃圾,厨余垃圾,有害垃圾,其他不在这3个列表中的就属于其他垃圾。根据用户输入的垃圾判断属于哪一类垃圾。4个不同颜 色的垃圾桶。本案例的任务是根据用户所要丢弃的垃圾,告诉用户这是什么类型的垃圾,需要放入 到哪个颜色的垃圾桶。生活垃圾一般可分为四大类:可回收垃圾、厨余垃圾、有害垃圾和其他垃圾,对应。

m0_74076532的博客 1276

线性代数——(期末突击)行列式(上)-行列式计算、行列式的性质

简单解释一下:4213原本的顺序应为1234,对于‘4’而言,‘2’、‘1’、‘3’都应该排在它的前面,所以此处记逆序数为3;对于‘2’而言,‘1’应该排在它的前面,而‘3’排在它之后 是合理的,所以此处只有一个逆序数;最后看‘1’,其后面的‘3’排在后面显然也是合理的,故而4213的逆序数为4.一般我们使用这个性质来计算四阶行列式,也就是将其变换成三角行列式,再计算对角线的值;以主对角线为分界线的就为正三角,反之则为反三角行列式。若行列式某一行(列)为0,则该行列式=0.将和的那一行分开,其余行。

li13437542099的博客 1万+

垃圾分类子项目2 - 加入舵机控制

本文为项目阶段性记录,继承自上一篇,也将被下一篇所继承

mx_jun的博客 865

Python使用netmiko配置华为交换机

1.netmiko就是专门为网络设备做的模块,非常强大。1.更适合网络设备的自动化运维模块。2、批量配置变更、备份。1.安装netmiko。2. 创建SSH连接。一、netmiko介绍。

博然的宝藏库 2795

量化 insider 爆料! 散户打板必亏?(打板必看!量化资金如何“隔日砸盘”收割散户)

量化开发 insider 爆料💥 散户追的涨停板📉,可能是机构故意做的陷阱!本文从技术视角拆解“涨停陷阱”,帮你看清市场真实逻辑🧠。

XiaoqiangClub的博客 451

垃圾分类子项目三 - 添加oled显示

我们要使用oled,就需要添加 i2c 功能需要在这个文件中添加这行,使用 i2c 协议。

mx_jun的博客 290

Plant Simulation 快速建模与布局(3)——自动生成的对象 代码“安全”删除管理

《PlantSimulation快速布局建模课程》教授利用SimTalk语言实现高效建模的技术要点,包括批量对象创建、阵列布局、属性管理及自动连接功能。重点讲解对象安全删除机制,通过existsObject检查对象存在性后使用deleteObject方法删除,避免程序报错。课程提供完整代码示例,展示如何通过循环结构实现矩阵布局对象的创建与安全删除,确保代码健壮性,显著提升建模效率。

qq_31964455的博客 119

AI智能清理开发环境垃圾文件:释放磁盘空间与提升项目整洁度

在软件开发过程中,项目依赖管理和构建缓存是常见的工程实践,它们能提升开发效率,但也带来了磁盘空间占用和项目结构冗余的问题。其原理在于包管理器和构建工具会在本地生成大量的临时文件、缓存目录(如node_modules、__pycache__)以及构建产物。这些文件虽然对单个项目的构建和运行是必要的,但长期累积会占用大量存储空间,并可能引发依赖冲突或构建错误。从技术价值看,智能清理工具通过结合规则匹配与上下文理解,能够自动化、安全地识别并移除这些冗余文件,从而释放宝贵的磁盘空间,提升开发环境的整洁度与可维护性。

weixin_34198881的博客 315

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

腾讯柠檬清理版本更新历史:从1.0到5.1.20的功能演进

腾讯柠檬清理作为macOS系统专属的清理工具,自发布以来经历了多次重大版本更新,功能不断完善,用户体验持续优化。这款专业的macOS清理软件通过版本迭代,从基础的垃圾清理功能发展为包含重复文件识别、相似照片检测、磁盘空间分析等全方位系统优化工具。🚀 ## 📈 早期版本奠定基础(1.0-2.0系列) 腾讯柠檬清理的初始版本专注于macOS系统垃圾清理,为后续功能扩展奠定了坚实基础。早期版本主

gitblog_00577的博客 1189

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

瑞萨CS+项目转换与项目树管理:嵌入式开发环境迁移与工程组织实战

在嵌入式系统开发中,集成开发环境(IDE)是工程师进行代码编写、构建和调试的核心平台。项目迁移作为开发流程中的常见需求,其本质是将基于特定工具链的工程文件、配置和源代码,适配到新的编译与调试环境中,以确保代码资产的可延续性和团队协作的统一性。这一过程不仅涉及文件格式的转换,更关键的是对微控制器型号、编译器选项、链接脚本及调试配置的精准映射与重构。从技术价值看,成功的项目迁移能显著提升开发效率,避免因环境差异导致的隐蔽错误,并让团队能充分利用新IDE在代码分析、性能优化和调试方面的增强功能。其典型应用场景包括

chubaisheng8627的博客 474

Folia sync-server 五分钟免费部署:从零跑通跨设备 AI 主题同步

Folia 是以歌词动画见长的本地音乐播放器,曲库支持本地文件夹和 Navidrome、网易云、QQ、酷狗等在线源。仓库自带的 Folia sync-server 负责把你的外观设置和 AI 主题在多台设备间同步。你不需要服务器和运维经验,照下面的步骤做完,电脑上新生成的主题,手机打开 Folia 就是同一套歌词动画和字体。 [![Folia 歌词动画主题效果预览](https://raw.gi

gitblog_00939的博客 142

Dism++:Windows系统优化与维护的一站式解决方案

Dism++是一款功能全面的Windows系统维护工具,专注于系统清理、优化、更新管理和备份恢复等核心功能。作为开源项目,它支持15种语言界面,提供专业级的系统管理能力,同时保持轻量级和用户友好的设计理念。无论你是普通用户还是技术爱好者,Dism++都能帮助你高效管理Windows系统,释放磁盘空间,提升系统性能。 ## 📊 功能矩阵:四大核心模块对比分析 Dism++的功能设计采用模块化架

gitblog_00916的博客 386

Unity静态代码分析器Microsoft.Unity.Analyzers:原理、配置与实战排错指南

静态代码分析是提升软件质量、保障代码规范性的关键技术,它能在不运行程序的情况下,通过分析源代码来发现潜在缺陷、性能问题和不良实践。其核心原理是基于编译器平台(如Roslyn)对代码的语法树和语义模型进行扫描,匹配预定义的规则模式。在游戏开发领域,这项技术的价值尤为突出,它能将团队的最佳实践自动化,在编码阶段就拦截那些在特定引擎环境下(如Unity)容易引发运行时错误或性能瓶颈的代码模式,从而显著提升项目的健壮性和可维护性。Microsoft.Unity.Analyzers正是这样一款专为Unity C#开发

weixin_30621711的博客 334

Lively Wallpaper深度解析:打造Windows动态桌面的终极方案

Lively Wallpaper是一款基于WinUI 3开发的开源动态桌面软件,它通过创新的技术架构让Windows桌面焕发生机。这款软件不仅支持视频、GIF、网页等传统动态壁纸,还能运行Unity游戏、ShaderToy特效等高级内容,为技术爱好者和桌面美化爱好者提供了前所未有的自定义能力。本文将从核心技术架构、实战配置指南、性能优化策略和高级应用场景四个维度,深度解析Lively Wallpa

gitblog_00561的博客 944

3步掌握iCloud匿名邮箱生成器:从隐私焦虑到安全掌控

想象一下这样的场景:你在注册一个新的在线服务时,面对邮箱输入框犹豫不决。使用真实邮箱意味着可能面临垃圾邮件轰炸,而使用临时邮箱服务又担心数据安全。这种隐私焦虑已经成为数字时代每个人的日常困扰。当你需要在不同平台注册账号、参与在线活动或下载资源时,如何既能保护个人信息,又能享受便捷的邮件接收服务? iCloud匿名邮箱生成器正是为解决这一痛点而生的隐私保护利器。这款开源工具通过自动化批量生成iCl

gitblog_00105的博客 485
上一篇: C语言调用Python
下一篇: 垃圾分类子项目2 - 加入舵机控制
mx_jun
博客等级 码龄5年 1605粉丝 148原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值