必看内容!STM32使用ESP8266通过串口与阿里云物联网平台通信_8266连阿里物联网

在这里插入图片描述

在这里插入图片描述

四、使用串口助手发送AT指令连接物联网平台

  1. AT //返回 OK
  2. AT+RST //复位
  3. AT+RESTORE //恢复出厂设置
  4. AT+CWMODE=1 //设置模式,可连接wifi热点
  5. AT+CWJAP="WIFI名字","WIFI密码" //连接热点
    例如:AT+CWJAP="qjl","11111111"

★坑3:wifi名字必须为英文!!频率为2.4G!如果是苹果手机,在个人热点处打开–最大兼容性。

  1. AT+CWJAP? //检测是否连接上热点
  2. AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com" //连接阿里云的网站
  3. //配置MQTT
    (1)设置用户名、密码
    使用指令:AT+MQTTUSERCFG=0,1,"NULL",“下图的用户名",“下图的密码”,0,0,""
    例如:AT+MQTTUSERCFG=0,1,"NULL","LED1&a1n2p8YJOux","2f14f1e99372c0b47cc475804da435ddd2330bbde9dec9783a63f88b1c30797b",0,0,""
    在这里插入图片描述
    (2) 设置clientld
    使用指令:AT+MQTTCLIENTID=0,"下图的clientld"
    例如:AT+MQTTCLIENTID=0,"a1n2p8YJOux.LED1|securemode=2\,signmethod=hmacsha256\,timestamp=1709691140893|"

★坑4:下图的clientld复制完成后,要在“”里面的逗号前加上‘\’ 。如上述例子中一样!!

在这里插入图片描述

  1. //设置好信息后,连接MQTT。
    使用指令: AT+MQTTCONN=0,"下图的mqttHostUrl",1883,1
    例如:AT+MQTTCONN=0,"a1n2p8YJOux.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883,1
    在这里插入图片描述

★坑5:总显示连接失败。

解决:看一下之前的手机热点是不是长时间没连接给自动关闭了,我当时就是这个地方出问题,所以才一直显示ERROR。
//连接成功后,发现物联网平台设备在线。
在这里插入图片描述

  1. 使用相应的Topic进行通信。
    在这里插入图片描述
    (1)订阅内容。
    AT+MQTTSUB=0,"/sys/a1n2p8YJOux/LED1/thing/service/property/set",1
    ●测试:
    使用物联网平台发布调试。
    在这里插入图片描述
    串口助手接收到的内容:
    在这里插入图片描述

(2)发布内容,更改物联网平台数据,使用相应的Topic以及需要修改数据的参数名称。
AT+MQTTPUB=0,"/sys/a1n2p8YJOux/LED1/thing/event/property/post","{\"params\":{\"learningTime\":33}}",0,0
在这里插入图片描述

在这里插入图片描述

七、代码部分(完整工程代码私聊):

  1. usart.c
#include "usart1.h"
#include "delay.h" 
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "stm32f10x.h" 
#include "wifi.h"
#include "beep.h"

u32 UART1_read_count = 0;     //接收数据的个数
char ResultBuff[2] = {0};  //返回结果存放数组
#define MAX\_STRING\_LENGTH 250

char \*p;


// 在全局范围定义一个数组来存储接收到的字符串
char receivedString[MAX_STRING_LENGTH];


static void NVIC\_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /\* 嵌套向量中断控制器组选择 \*/
  NVIC\_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
  /\* 配置USART为中断源 \*/
  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
  /\* 抢断优先级\*/
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  /\* 子优先级 \*/
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  /\* 使能中断 \*/
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  /\* 初始化配置NVIC \*/
  NVIC\_Init(&NVIC_InitStructure);
}

void USART\_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	// 打开串口GPIO的时钟
	DEBUG\_USART\_GPIO\_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
	
	// 打开串口外设的时钟
	DEBUG\_USART\_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

	// 将USART Tx的GPIO配置为推挽复用模式
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO\_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  // 将USART Rx的GPIO配置为浮空输入模式
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO\_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
	
	// 配置串口的工作参数
	// 配置波特率
	USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
	// 配置 针数据字长
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	// 配置停止位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	// 配置校验位
	USART_InitStructure.USART_Parity = USART_Parity_No ;
	// 配置硬件流控制
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	// 配置工作模式,收发一起
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	// 完成串口的初始化配置
	USART\_Init(DEBUG_USARTx, &USART_InitStructure);
	
	// 串口中断优先级配置
	NVIC\_Configuration();
	
	// 使能串口接收中断
	USART\_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);	
	
	// 使能串口
	USART\_Cmd(DEBUG_USARTx, ENABLE);	    
}



//空闲中断
void USART1\_IRQHandler(void)//串口中断服务函数
{ 
	    u8 rxd = 0;//接收缓存
	if (USART\_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
			USART\_ClearITPendingBit(USART1, USART_IT_RXNE);
			rxd = USART\_ReceiveData(USART1);
			Recive\_Data(rxd);
	}
}


/\*
1.功能:将阿里云下发的数据 存到 字符串数组中。
2.接收数据格式例子:
 +MQTTSUBRECV:0,"/sys/a1n2p8YJOux/LED1/thing/service/property/set",159,{"method":"thing.service.property.set","id":"1891523621","params":{"brightness":77,"learningTime":78,"powerstate":1,"AlarmFrequencyLevel":2},"version":"1.0.0"}
3.因为下发的数据格式第一个字符为'+',所以以'+'为开始接收标志的头。
\*/
void Recive\_Data(u8 rxd)
{
		static u8 Start_recive = 0;//开始接收标志
		static u8 stringIndex = 0;	

		if(rxd=='+')  //如果接收到 '+'
			{
				memset(receivedString,0,400); //清空接收数组
				stringIndex=0;                //字符串索引号,从0开始接收
				Start_recive=1;               //开始接收标志
			}
	  if(Start_recive == 1)      
		{
				receivedString[stringIndex++] = rxd;
				if(stringIndex == MAX_STRING_LENGTH)
				{
					stringIndex=0;
					Start_recive=0;
				 }
		}	
}


/\*
1.功能:输入模块名称,返回该模块的值。用于读取阿里云平台模块的值。
2.订阅消息后接收的数据格式如下,用于理解代码:
 +MQTTSUBRECV:0,"/sys/a1n2p8YJOux/LED1/thing/service/property/set",159,{"method":"thing.service.property.set","id":"1891523621","params":{"brightness":77,"learningTime":78,"powerstate":1,"AlarmFrequencyLevel":2},"version":"1.0.0"}
3.如果输入模块名称不存在,则返回-1。
\*/
int Get\_Module\_Val(char \*Module_name)   
{
	 int Module_Val=-1;
   if( (p=strstr(receivedString,Module_name) )!=NULL ) //判断receivedString中是否包含模块名。执行完此行代码后,指针p指向模块名的第一个字符!!!
 	 {
					p=p+strlen(Module_name)+strlen("\":");                   //将指针后移至第一位值的位置。具体需要后移多少位到该位置,请分析开头注释2中数据格式。
					Module_Val= \*p -'0';                                      //解析出该值。 
			 
				 while( (\*(p+1)-'0') >=0 && (\*(p+1)-'0')<=9 )               //用于判断模块的值,是一位数,还是两位数,还是更多位。直到不为0~9的值为止。
				 {
						Module_Val=Module_Val\*10+(\*(p+1)-'0');                  //计算模块的值。
						p++;                                                    //后移指针。
				 } 
	 }
	 return Module_Val;
}



/\*
 发送字符串,用于发送AT指令
\*/
void SendChar(char \*buff){   
	unsigned char i=0;
	while(buff[i]!='\0'){
			while(USART\_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //等待接收完成标志
			USART\_SendData(USART1,buff[i]);
			USART\_ClearFlag(USART1,USART_FLAG_TC);  //清除完成标志
			i++;	
	}	
}




//---------------------------------------------下面没用用到/ 备用----------------------

/\*
 串口1发送一个字节
\*/
void usart1\_send\_byte(u8 data)
{
	while(!(USART\_GetFlagStatus(USART1,USART_FLAG_TC)==SET)); //获取发送完成标志位
	USART\_SendData(USART1,data);  //传输数据
}


/\*
 串口1接收一个字节
\*/
char usart1\_read\_byte(void)
{
	while(!(USART\_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)); //获取发送完成标志位
	return USART\_ReceiveData(USART1);    //返回数据 
}



/\*
 发送命令字符串,参数:命令、预期返回结果
\*/
bool USRT\_Send\_ATCmd(char \*cmd,char \*result)
{
	unsigned char i = 0;
	unsigned char ret = 0;
	while(1)
	{	
			USART1\_Clear\_Buf();
			SendChar(cmd);
			delay\_ms(100);
			if(NULL != strstr(ResultBuff,result))
			{
				ret = SUCCESS;
				break;
			}
			else if(i++ >=10)
			{
				ret = ERROR;
				break;
			}
  } 
	return ret;
}


/\*
 清空数组
\*/
void USART1\_Clear\_Buf(void)  
{
	  memset(ResultBuff, 0, strlen(ResultBuff));
    UART1_read_count = 0;
}




  1. usart.h
#ifndef \_\_USART1\_H
#define \_\_USART1\_H
#include "stm32f10x.h" 
#include "stdio.h"



#define DEBUG\_USART1 1

#if DEBUG\_USART1

// 串口1-USART1
#define DEBUG\_USARTx USART1
#define DEBUG\_USART\_CLK RCC\_APB2Periph\_USART1
#define DEBUG\_USART\_APBxClkCmd RCC\_APB2PeriphClockCmd
#define DEBUG\_USART\_BAUDRATE 115200

// USART GPIO 引脚宏定义
#define DEBUG\_USART\_GPIO\_CLK (RCC\_APB2Periph\_GPIOA)
#define DEBUG\_USART\_GPIO\_APBxClkCmd RCC\_APB2PeriphClockCmd
	
#define DEBUG\_USART\_TX\_GPIO\_PORT GPIOA 
#define DEBUG\_USART\_TX\_GPIO\_PIN GPIO\_Pin\_9
#define DEBUG\_USART\_RX\_GPIO\_PORT GPIOA
#define DEBUG\_USART\_RX\_GPIO\_PIN GPIO\_Pin\_10

#define DEBUG\_USART\_IRQ USART1\_IRQn
#define DEBUG\_USART\_IRQHandler USART1\_IRQHandler


#endif
void Recive\_Data(u8 rxd);  //接收数据,将字符串数据存到数组中。
int Get\_Module\_Val(char \*Module_name);       //获得模块的值
void USART\_Config(void);  
static void NVIC\_Configuration(void); 
char usart1\_read\_byte(void);    //读取字节
void SendChar(char \*buff);    //发送字符串
void usart1\_send\_byte(u8 data); //发送字节
void USART1\_Clear\_Buf(void);   //清除buff
#endif 


  1. wifi.c
#include "wifi.h"
#include "usart1.h"


//需要修改的内容: 在物联网平台查看MQTT参数
#define Device\_name "LED1" //设备名称
#define ProductKey "a1n2p8YJOux" //产品密钥
#define User\_Password "2f14f1e99372c0b47cc475804da435ddd2330bbde9dec9783a63f88b1c30797b" //用户密码
#define ClientId "a1n2p8YJOux.LED1|securemode=2\\,signmethod=hmacsha256\\,timestamp=1709691140893|"
#define MqttHostUrl "a1n2p8YJOux.iot-as-mqtt.cn-shanghai.aliyuncs.com" //MQTT代理地址

#define Wifi\_Account "JL" //手机热点的账号 一定要是2.4Ghz频段
#define Wifi\_Password "88888888" //手机热点的密码


//不需要修改的内容:
#define User\_Name ""Device\_name"&"ProductKey"" //用户账号
#define Publish\_TOPIC "/sys/"ProductKey"/"Device\_name"/thing/event/property/post" //发布Topic
#define Subscribe\_TOPIC "/sys/"ProductKey"/"Device\_name"/thing/service/property/set" //订阅Topic

/\* ESP8266连接阿里云的AT指令--连接方法一: (可用)
void Esp8266\_ALiyun\_Init() //初始化wifi连接
{ 
 USRT\_Send\_ATCmd("AT\r\n","OK"); //测试
 USRT\_Send\_ATCmd("AT+RST\r\n","OK"); //重启
 // USRT\_Send\_ATCmd("AT+RESTORE\r\n","OK"); //回复出厂设置
 USRT\_Send\_ATCmd("AT+CWMODE=1\r\n","OK"); //使用wifi
 USRT\_Send\_ATCmd("AT+CWJAP=\"JL\",\"88888888\"\r\n","WIFI CONNECTED"); //连接热点
 USRT\_Send\_ATCmd("AT+CIPSNTPCFG=1,8,\"ntp1.aliyun.com\"\r\n","OK"); //连接阿里云
 USRT\_Send\_ATCmd("AT+MQTTUSERCFG=0,1,\"NULL\",\"LED1&a1n2p8YJOux\",\"2f14f1e99372c0b47cc475804da435ddd2330bbde9dec9783a63f88b1c30797b\",0,0,\"\"\r\n","OK");//设置MQTT的信息
 USRT\_Send\_ATCmd("AT+MQTTCLIENTID=0,\"a1n2p8YJOux.LED1|securemode=2\\,signmethod=hmacsha256\\,timestamp=1709691140893|\"\r\n","OK"); //设置MQTT的信息
 USRT\_Send\_ATCmd("AT+MQTTCONN=0,\"a1n2p8YJOux.iot-as-mqtt.cn-shanghai.aliyuncs.com\",1883,1\r\n","OK");//开始连接阿里云的MQTT
} 
\*/

//ESP8266连接阿里云的AT指令---连接方法二:
void Esp8266\_ALiyun\_Init()   
## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**

**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/5dab60ba274fafdb1e97baf522486c54.png)

![img](https://img-blog.csdnimg.cn/img_convert/07c3db3561bc6e7d4aeb45052f7421e3.jpeg)

![img](https://img-blog.csdnimg.cn/img_convert/192ef50b0428e9d5479e0b38e28da4b7.png)

 ![img](https://img-blog.csdnimg.cn/img_convert/451713bd9a74df0fb15cfbbb1433892d.png)

![img](https://img-blog.csdnimg.cn/img_convert/6536c4cfeb8fc7eeefd3b7de8d3a6c24.png)

![img](https://img-blog.csdnimg.cn/img_convert/2b87fe262328684054c5c21271dd01ca.png)

![](https://img-blog.csdnimg.cn/img_convert/790db0657bbf20f03f1e5a7efdf962bf.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


18866906)]

 [外链图片转存中...(img-lWYjG6K2-1715718866907)]

[外链图片转存中...(img-rP5AVqz8-1715718866907)]

[外链图片转存中...(img-4k0r1be1-1715718866908)]

[外链图片转存中...(img-Hj32RUAu-1715718866908)]

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很抱歉,由于代码内容过多,无法在此回答中全部展示。不过,我可以为您提供一些关于如何连接阿里云物联网的指导方针: 1. 首先,您需要拥有一个阿里云账号并创建一个物联网套件。 2. 然后,您需要在STM32芯片上配置ESP8266模块,以便它可以通过Wi-Fi与阿里云服务器进行通信。 3. 接下来,您需要使用物联网套件的ProductKey、DeviceName和DeviceSecret等信息,在STM32代码中配置ESP8266以连接阿里云物联网服务。 4. 最后,您可以在STM32代码中编写代码,通过ESP8266阿里云物联网服务进行通信,实现对设备状态的上传和下发控制命令等功能。 希望对您有所帮助。如果您需要更详细的代码示例,可以在网上搜索相关资料或者咨询技术专家。 ### 回答2: 为了实现STM32ESP8266连接阿里云物联网的功能,在编写代码之前,需要了解一些基本的概念和步骤。 步骤1:搭建硬件连接 首先,将STM32ESP8266通过串口进行连接。将STM32串口TX引脚连接到ESP8266的RX引脚,STM32串口RX引脚连接到ESP8266的TX引脚。确保电源和地线也正确连接。 步骤2:配置ESP8266 使用ESP8266的AT指令进行初始化和配置。例如,设置ESP8266工作模式、连接WiFi、连接阿里云服务器等。 步骤3:编写STM32代码 在STM32上编写代码,与ESP8266进行通信并发送数据到阿里云。 以下是一个简单的示例代码: #include "stm32f10x.h" #include <stdio.h> void USART1_SendChar(char c) { while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); USART_SendData(USART1, c); } void USART1_SendString(char* s) { while(*s) { USART1_SendChar(*s++); } } int main(void) { // 初始化串口 USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_Mode = USART_Mode_Tx; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); // 连接ESP8266 USART1_SendString("AT+CWMODE=1\r\n"); // 设置ESP8266为Station模式 USART1_SendString("AT+CWJAP=\"SSID\",\"Password\"\r\n"); // 连接WiFi,将SSID和Password替换为你的WiFi信息 // 发送数据到阿里云 USART1_SendString("AT+CIPSTART=\"TCP\",\"YourAliyunHost\",8883\r\n"); // 连接阿里云服务器,将YourAliyunHost替换为阿里云服务器地址 USART1_SendString("AT+CIPSEND=10\r\n"); // 发送10个字节的数据 USART1_SendString("Hello World\r\n"); // 发送数据到阿里云 while (1) { // 循环执行其他任务 } } 以上代码,通过USART1与ESP8266进行串口通信,具体的AT指令通过USART1_SendString函数发送到ESP8266。通过修改对应的参数和指令,可以实现相应的功能。 需要注意的是,该代码仅为示例,实际需根据具体的硬件和需求进行适配和修改。同时,还需要根据阿里云物联网平台提供的文档,进行相关配置和认证等操作。 ### 回答3: 下面给出一个示例的代码来展示如何使用STM32ESP8266连接阿里云物联网平台: ```c #include <stdio.h> #include <string.h> // ESP8266所需的AT指令宏定义 #define AT_COMMAND "AT\r\n" #define AT_RST_COMMAND "AT+RST\r\n" #define AT_CWMODE_COMMAND "AT+CWMODE=1\r\n" #define AT_CWJAP_COMMAND "AT+CWJAP=\"<ssid>\",\"<password>\"\r\n" #define AT_CIPSTART_COMMAND "AT+CIPSTART=\"TCP\",\"<aliyun server>\",<port>\r\n" #define AT_CIPSEND_COMMAND "AT+CIPSEND=<data_size>\r\n" void esp8266_send_command(char* command) { // 将命令发送给ESP8266模块 } void stm32_send_data(char* data) { // 将数据发送给STM32 } int main() { // 初始化STM32ESP8266 // 重启ESP8266 esp8266_send_command(AT_RST_COMMAND); // 设置ESP8266为STA模式 esp8266_send_command(AT_CWMODE_COMMAND); // 连接到Wi-Fi网络 esp8266_send_command(AT_CWJAP_COMMAND); // 建立与阿里云服务器的TCP连接 esp8266_send_command(AT_CIPSTART_COMMAND); // 发送数据到阿里云物联网平台 char data[] = "{\"temperature\": 25, \"humidity\": 50}"; char command[50]; sprintf(command, "%s%d\r\n", AT_CIPSEND_COMMAND, strlen(data)); esp8266_send_command(command); stm32_send_data(data); return 0; } ``` 以上是一个简单的示例代码,你需要根据实际情况进行适当的修改和调整。其中,需要替换的内容有: - `<ssid>`和`<password>`:你要连接的Wi-Fi网络的SSID和密码。 - `<aliyun server>`:阿里云物联网平台的服务器地址。 - `<port>`:阿里云物联网平台的TCP端口号。 另外,你还需要根据具体外设的接口和协议规范,实现`esp8266_send_command`和`stm32_send_data`函数,以将命令发送给ESP8266模块并将数据发送给STM32

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值