6_13_天天向上_TTYUSB0_embedded&&zigbee_3


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <termio.h>
#include <errno.h>
#include "GPRS.h"
//#include <afx.h>


#define ZIGBEE 3  //zigbee

 /*
  *函数功能:设置串口属性
  *参数:  
        @fd:   串口文件描述符
  @nSpeed:   比特率
  @nBit:     有效位个数
  @nEvent:   有无校验位
  @nStop:    几位停止位
  返回值:设置成功与否:
        secuss:1
  error: 0
  * */
/*
unsigned long *f(char* str)
{
 unsigned long *var;
 unsigned long t;
 int len = strlen(str);
 
 if (*var > 8) //最长8位
  return 1;
 //strupr(str);//统一大写
 toupper(str);

 for (; *str; str++)
 {
  if (*str>='A' && *str <='F')
   t = *str-55;//a-f之间的ascii与对应数值相差55如'A'为65,65-55即为A
  else
   t = *str-48;
  *var<<=4;
  *var|=t;
 }
 return var;
}
*/

int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nStop)
{
    struct termios newtio,oldtio;

 if(tcgetattr(fd,&oldtio) < 0)
    {
     perror("SetupSerial 1");
  return -1;
 }

 bzero(&newtio,sizeof(newtio));
 newtio.c_cflag |= CLOCAL|CREAD;
 newtio.c_cflag &= ~CSIZE;
 //设置有效数据位个数
 switch(nBits)
 {
 case 7:
  newtio.c_cflag |= CS7;
  break;
 case 8:
  newtio.c_cflag |= CS8;
  break;
 }
 switch(nEvent)
 {
    case 'O':
     newtio.c_cflag |= PARENB;
     newtio.c_cflag |= PARODD;
     newtio.c_iflag |= (INPCK|ISTRIP);
     break;
    case 'E':
     newtio.c_iflag |= (INPCK|ISTRIP);
     newtio.c_cflag |= PARENB;
     newtio.c_cflag &= ~PARODD;
     break;
    case 'N'://无奇偶校验
     newtio.c_cflag &= ~PARENB;
     break;

 }
 switch(nSpeed)
 {
 case 2400:
  cfsetispeed(&newtio,B2400);
  cfsetospeed(&newtio,B2400);
  break;
 case 4800:
  cfsetispeed(&newtio,B4800);
  cfsetospeed(&newtio,B4800);
  break;
 case 9600:
  cfsetispeed(&newtio,B9600);
  cfsetospeed(&newtio,B9600);
  break;
 case 38400:
 printf("38400\n");
  cfsetispeed(&newtio,B38400);
  cfsetospeed(&newtio,B38400);
  break;//之前漏写了这个break
 case 115200:
  cfsetispeed(&newtio,B115200);
  cfsetospeed(&newtio,B115200);
  break;
 default:
  cfsetispeed(&newtio,B115200);
  cfsetospeed(&newtio,B115200);
  break;
 }
 if(nStop == 1)
 {
     newtio.c_cflag &= ~CSTOPB;
 }
 else if(nStop == 2)
 {
     newtio.c_cflag |= CSTOPB;
 }
 newtio.c_cc[VTIME] = 0;
 newtio.c_cc[VMIN] = 0;
    tcflush(fd,TCIFLUSH);//刷新设置,使设置立即生效

 if((tcsetattr(fd,TCSANOW,&newtio)) != 0)
 {
     perror("com set error");
  return -1;
 }
 printf("set done\n");
 return 0;
}

/*
 * 函数功能:打开串口
 * 参数:
 *      @comport:打开的串口的号码
 *      @fd:     打开的文件描述符
 * 返回值:打开成功与否
 *      secuess: 返回打开的串口的文件描述符
 *      error:   -1
 * 最后修改时间:2011.12.22
 * */
int open_port(int fd,int comport)
{
 long vdisable;
 if(1 == comport)
 {
     fd = open("/dev/s3c2410_serial0",O_RDWR|O_NOCTTY|O_NDELAY);
  if(-1 == fd)
  {
     perror("can not open the port");
     return -1;
  }
 }
 if(2 == comport)
 {
     fd = open("/dev/s3c2410_serial1",O_RDWR|O_NOCTTY|O_NDELAY);
  if(-1 == fd)
  {
     perror("can not open the port");
     return -1;
  }
 }
 if(3 == comport)
 {
     fd = open("/dev/s3c2410_serial2",O_RDWR|O_NOCTTY|O_NDELAY);
  if(-1 == fd)
  {
     perror("can not open the port");
     return -1;
  }
 }
 if(8 == comport)
 {
  fd=open("/dev/ttyUSB0",O_RDWR|O_NOCTTY|O_NDELAY);
  //fd=open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY);
  //fd=open("/dev/tty",O_RDWR|O_NOCTTY|O_NDELAY);
  if(-1 == fd)
  {
     perror("can not open the port");
     return -1;
  }
 }

 if(fcntl(fd,F_SETFL,0) < 0)
  printf("fcntl error\n");
 else
  printf("fcntl=%d\n",fcntl(fd,F_SETFL,0));
 if(isatty(STDIN_FILENO) == 0)
  printf("standard input is not a terminal device\n");
 else
  printf("is a tty success \n");
 printf("fd-open=%d\n",fd);

 return (fd);
}

/*
int Ascii2Hex(const char *hex,char * ascii)             //16进制转ASCII

{
 int len = strlen(hex), tlen, i, cnt;
 
 for (i = 0, cnt = 0, tlen = 0; i<len; i++)
 {
  char c = toupper(hex[i]);

  if ((c>='0'&& c<='9') || (c>='A'&& c<='F'))
  {
   BYTE t = (c >= 'A') ? c - 'A' + 10 : c - '0';

   if (cnt)
    ascii[tlen++] += t, cnt = 0;
   else
    ascii[tlen] = t << 4, cnt = 1;
  }
 }
 
 return tlen;
}*/

int gprs(int type)
{
 int fd;
 int pid;
 char string[100];
 int n = 0;
 /*小偷进屋*/
 char send_thief[100] = "0891683110102105F011000D91685115607830F70008000A5C0F50778FDB5C4BFF01";
 /*家里着火*/
 char send_fire[100] = "0891683110102105F011000D91685115607830F70008000A5bb691cc7740706bff01";
 /*zigbee*/
 unsigned char send_zigbee[] = {0x02,0x08,0xCB,0x01,0x00,0xD3,0x42,0x00,0x01,0x00,0x09};
 
// char send_zigbee[100]="";
// char send_zigbee[100]= "02 20 08 20 CB 20 01 20 00 20 D3 20 42 20 00 20 01 20 00 20 50";
 
// unsigned char send_zigbee[12]={(char)0X02,(char)0X08,(char)0XCB,(char)0X01,(char)0X00,(char)0XD3,(char)0X42,(char)0X00,(char)0X01,(char)0X00,(char)0X50,(char)0};
// char send_zigbee[100]= "50 00 01 00 42 D3 00 01 CB 08 02";
// unsigned char send_zigbee[1024]= {0X30,0X02,0X08,0XCB,0X01,0X00,0XD3,0X42,0X00,0X01,0X00,0X50};
// unsigned char send_zigbee[100]= {0X30,0X50,0X00,0X01,0X00,0X42,0XD3,0X00,0X01,0XCB,0X08,0X02};
//  unsigned send_zigbee[100]= {0X30,0X02,0X08,0XCB,0X01,0X00,0XD3,0X42,0X00,0X01,0X00,0X50};
// (char)0x20 ASCII 码值 0x20H 就是 空格
//    char send_zigbee[100]= {(char)0X50,(char)0X20,(char)0X00,(char)0X20,(char)0X01,(char)0X20,(char)0X00,(char)0X20,(char)0X42,(char)0X20,(char)0XD3,(char)0X20,(char)0X00,(char)0X20,(char)0X01,(char)0X20,(char)0XCB,(char)0X20,(char)0X08,(char)0X20,(char)0X02};

 /*打开串口,并设置属性(115200,8位有效数据位,无奇偶校验,1位)*/
// extern pthread_mutex_t GPRS_lock;
//   pthread_mutex_lock(&GPRS_lock);
/*fd=open_port(fd,2);
 set_opt(fd,9600,8,'N',1);
 n = write(fd,"at\r",strlen("at\r"));
 printf("write=%d\n",n);
 printf(".................\n");
    /*发送AT,返回ok*/
/* sleep(2);
 bzero(string,sizeof(string));
 n = read(fd,string,100);
 printf("read AT=%d\n",n);
 printf("read AT=%s\n",string);*/
 
 fd=open_port(fd,8);
 set_opt(fd,38400,8,'N',1);
// n = write(fd,"at\r",strlen("at\r"));
// printf("write=%d\n",n);
// printf(".................\n");
    /*发送AT,返回ok*/
// sleep(2);
// bzero(string,sizeof(string));
// n = read(fd,string,100);
// sleep(1);
// printf("read TYYS1=%d\n",n);
 //printf("read AT=%s\n",string);
// printf("read zigbee=%s\n",string);


 
    /*短信中心号码*/
 //write(fd,"AT+CSCA=\"+8613010112500\"\r",strlen("AT+CSCS=\"+8613010112500\"\r"));
 /*write(fd,"AT+CSCA=+8613010112500\r",strlen("AT+CSCS=+8613010112500\r"));
 sleep(2);
 bzero(string,sizeof(string));
 n = read(fd,string,100);
 printf("read AT+CSCA = %d\n",n);
 printf("read AT+CSCA =%s\n",string);
    */
    /*
 write(fd,"AT+CCID\r",strlen("AT+CCID\r"));
 sleep(2);
 bzero(string,sizeof(string));
 n = read(fd,string,100);
 printf("read AT+CCID %d\n",n);
 printf("read AT+CCID =%s\n",string);
 */
    /*发送目标号码*/
 //n = write(fd,"AT+CMGS=+8615510687037\r",strlen("AT+CMGS=+8615510687037\r"));
 
 /*发送设置的短信模式*/
 
/* write(fd,"AT+CMGF=0\r",strlen("AT+CMGF=0\r"));
 sleep(2);
 bzero(string,sizeof(string));
 n = read(fd,string,100);
 printf("read AT+CMGF = %d\n",n);
 printf("read AT+CMGF =%s\n",string);

 

 write(fd,"AT+CMGS=25\r",strlen("AT+CMGS=25\r"));
 sleep(2);
 bzero(string,sizeof(string));
 n = read(fd,string,50);
 printf("read AT+CMGS = %d\n",n);
 printf("read AT+CMGS =%s\n",string);
*/

 


// write(fd,send_zigbee,11);
// printf("ok\n");
 unsigned char cmd[11];
// bzero(cmd,100);
 
   
 
 /*火灾时发出的短信*/
    if(THIEF_INTO == type)
 {
  strcpy(cmd,send_thief);
 }
 
 /*盗贼进入时发出的短信*/
 
    if(FIRE == type)
 {
  strcpy(cmd,send_fire);
 }
 
 /*zigbee*/
 if(ZIGBEE== type)
 {
  write(fd,send_zigbee,11);
  strcpy(cmd,send_zigbee);//强大功能
  //printf("ok\n");
 }
  
 /*
 n = write(fd,0x02,1);
  n = write(fd,0x08,1);
  n = write(fd,0xCB,1);
  n = write(fd,0x01,1);
  n = write(fd,0x02,1);
  n = write(fd,0xD3,1);
  n = write(fd,0x42,1);
  n = write(fd,0x00,1);
  n = write(fd,0x01,1);
  n = write(fd,0x00,1);
  n = write(fd,0x09,1);*/
  
// }
 //02 08 CB 01 00 D3 42 00 01 00 09
 
/*
char* out2=new char[strlen("0208CB0100D34200010009")/2];
int count=0;
for(char *s="0208CB0100D34200010009";strlen(s)>0;s+=2)
{
if(*s>='0' && *s<='9')
out2[count]=*s-'0';
else if(*s>='A'&& *s<='F')
out2[count]=*s-'A'+10;
if(strlen(s)>1)
{
out2[count]*=16;
if(*(s+1)>='0' && *(s+1)<='9') out2[count++]+=(*(s+1)-'0');
if(*(s+1)>='A'&& *(s+1)<='F') out2[count++]+=(*(s+1)-'A'+10);
write(fd,out2,13);
}
}
delete[] out2;  
 */
// strcat(cmd,"\x1a");
 
// write(fd,cmd,11);
// write(fd,f("02 08 CB 01 00 D3 42 00 01 00 09"),12);
/*
 printf(".................\n");
 
 printf("发送cmd=%x\n",f(cmd));
// n = write(fd,&cmd[1],1);
 printf("发送cmd=%x\n",f(cmd));
// n = write(fd,&cmd[2],1);
 printf("发送cmd=%x\n",f(cmd));
// n = write(fd,&cmd[3],1);
 printf("发送cmd=%x\n",f(cmd));
// n = write(fd,&cmd[4],1);
 printf("发送cmd=%x\n",f(cmd));
// n = write(fd,&cmd[5],1);
 printf("发送cmd=%x\n",f(cmd));
// n = write(fd,&cmd[6],1);
 printf("发送cmd=%X\n",f(&cmd[6]));
// n = write(fd,&cmd[7],1);
 printf("发送cmd=%X\n",f(&cmd[7]));
// n = write(fd,&cmd[8],1);
 printf("发送cmd=%X\n",f(&cmd[8]));
// n = write(fd,&cmd[9],1);
 printf("发送cmd=%X\n",f(&cmd[9]));
// n = write(fd,&cmd[10],1);
 printf("发送cmd=%X\n",f(&cmd[10]));
// n = write(fd,&cmd[11],1);
 printf("发送cmd=%X\n",f(&cmd[11]));*/
// n = write(fd,cmd[12],strlen(cmd[12]));
// printf("发送cmd=%X\n",cmd[12]);
// n = write(fd,cmd,strlen(cmd));
// printf(".................\n");
/* 
 printf(".................begin\n");
/*
unsigned   char     a=0x02;
n = write(fd,a,1);
unsigned   char     b=0x08;
n = write(fd,b,1);
unsigned   char     c=0xCB;
n = write(fd,c,1);
unsigned   char     d=0x01;
n = write(fd,d,1);
unsigned   char     e=0x00;
n = write(fd,e,1);
unsigned   char     f=0xD3;
n = write(fd,f,1);
unsigned   char     g=0x42;
n = write(fd,g,1);
unsigned   char     h=0x00;
n = write(fd,h,1);
unsigned   char     i=0x01;
n = write(fd,i,1);
unsigned   char     j=0x00;
n = write(fd,j,1);
unsigned   char     k=0x09;*/
 /*
unsigned char a=f("02");
 int j;
 j=write(fd,&a,2);
  printf("%X\n", f("02"));
 
 unsigned char b=f("08");
 write(fd,&b,2);
  printf("%X\n", f("08"));
 
 unsigned char c=f("CB");
 write(fd,&c,2);
  printf("%X\n", f("CB"));
 
  unsigned char d=f("01");
 write(fd,&d,2);
  printf("%X\n", f("01"));
 
  unsigned char e=f("00");
 write(fd,&e,2);
  printf("%X\n", f("00"));

 unsigned char l=f("D3");
 write(fd,&l,2);
  printf("%X\n", f("D3"));
 
  unsigned char g=f("42");
 write(fd,&g,2);
  printf("%X\n", f("42"));
 
 unsigned char h=f("00");
 write(fd,&h,2);
  printf("%X\n", f("00"));
 
  unsigned char i=f("01");
 write(fd,&i,2);
  printf("%X\n", f("01"));
 
 unsigned char m=f("00");
 write(fd,&m,2);
  printf("%X\n", f("00"));
 
  unsigned char k=f("09");
 write(fd,&k,2);
  printf("%X\n", f("09"));
  write(fd,"ok",2);*/
/*  int x;
  x=write(fd,"hello world!\r",12);
 
 
 printf(".................end\n");
/*

 unsigned char *i=0x02;;
 //*i=0x02;
 strcat(cmd,&i);
 n = write(fd,cmd,1);
 printf("发送cmd=%x\n",cmd[0]);
 *i=0x08;
 strcat(cmd,&i);
 n = write(fd,cmd,1);
 printf("发送cmd=%x\n",cmd[1]);
 *i=0xcb;
 strcat(cmd,&i);
 n = write(fd,cmd,1);
 printf("发送cmd=%x\n",cmd[2]);
 *i=0x01;
 strcat(cmd,&i);
 n = write(fd,cmd,strlen(cmd));
 printf("发送cmd=%x\n",cmd[3]);
 *i=0x00;
 strcat(cmd,&i);
 n = write(fd,cmd,strlen(cmd));
 printf("发送cmd=%x\n",cmd[4]);
 *i=0xd3;
 strcat(cmd,&i);
 n = write(fd,cmd,strlen(cmd));
 printf("发送cmd=%x\n",cmd[5]);
 *i=0x42;
 strcat(cmd,&i);
 n = write(fd,cmd,strlen(cmd));
 printf("发送cmd=%x\n",cmd[6]);
 *i=0x00;
 strcat(cmd,&i);
 n = write(fd,cmd,strlen(cmd));
 printf("发送cmd=%x\n",cmd[7]);
 *i=0x01;
 strcat(cmd,&i);
 n = write(fd,cmd,strlen(cmd));
 printf("发送cmd=%x\n",cmd[8]);
 *i=0x00;
 strcat(cmd,&i);
 n = write(fd,cmd,strlen(cmd));
 printf("发送cmd=%x\n",cmd[9]);
 *i=0x09;
 strcat(cmd,&i);
 n = write(fd,cmd,strlen(cmd));*/
/* int j=0;
 for(j=0;j<11;j++)
 {
  printf("发送cmd=%x\n",(cmd[j]));
  write(fd,cmd[j],strlen(cmd[j]));
 }
*/
 
 
 //printf("发送cmd=%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x\n",cmd[0],cmd[1],cmd[2],cmd[3],cmd[4],cmd[5],cmd[6],cmd[7],cmd[8],cmd[9],cmd[10]);
/*
 printf("发送cmd=%x\n",cmd[0]);
  printf("发送cmd=%x\n",cmd[1]);
   printf("发送cmd=%x\n",cmd[2]);
    printf("发送cmd=%x\n",cmd[3]);
     printf("发送cmd=%x\n",cmd[4]);
      printf("发送cmd=%x\n",cmd[5]);
       printf("发送cmd=%x\n",cmd[6]);
        printf("发送cmd=%x\n",cmd[7]);
         printf("发送cmd=%x\n",cmd[8]);
          printf("发送cmd=%x\n",cmd[9]);
           printf("发送cmd=%x\n",cmd[10]);*/
          
// n = write(fd,send_zigbee,strlen(send_zigbee));
   

/*int CSerialPortTestDlg::Str2Hex(CString str, char* data)
{
 int t, t1;//int hexData, lowhexData;  
 int rlen=0, len=str.GetLength();
 //data.SetSize(len/2);
 for(int i=0; i<len; )//注意循环条件
 {
 char lstr, hstr = str[i];//获得地址的高8位和低8位  
 if(hstr ==' ')
 {
 ++i;
 continue;
 }
 i++;
 if(i>=len)
 break;
 lstr= str[i];
 t = HexChar(hstr);
 t1= HexChar(lstr);
 if((t==16)|| (t1==16))
 break;
 else 
 t= t*16+t1;
 ++i;
 data[rlen]= (char)t;
 ++rlen;
}*/

//    CString zigbee;
//    zigbee("02 08 CB 01 00 D3 42 00 01 00 09");
   
//    int len = Str2Hex(str_Message, data);
   
//    n = write(fd,zigbee,strlen(zigbee));
//    printf("发送send_zigbee=%x\n",send_zigbee);
//    n = write(fd,send_zigbee,strlen(send_zigbee));
//    unsigned char Buffer[1024];
//  unsigned char *src_buf;
//   src_buf = Buffer;
   
//   Buffer[0]=0x02;
 //   Buffer[1]=0x20;
   
//   Buffer[1]=0x08;
//    Buffer[3]=0x20;
   
//    Buffer[2]=0xCB;
// Buffer[5]=0x20;
 
//    Buffer[3]=0x01;
// Buffer[7]=0x20;
 
//    Buffer[4]=0x00;
// Buffer[9]=0x20;
 
//    Buffer[5]=0xD3;
// Buffer[11]=0x20;
 
//    Buffer[6]=0x42;
// Buffer[13]=0x20;
 
//  Buffer[7]=0x00;
//   Buffer[15]=0x20;
   
// Buffer[8]=0x01;
// Buffer[17]=0x20;
 
// Buffer[9]=0x00;
// Buffer[19]=0x20;
 
// Buffer[10]=0x50;
// Buffer[21]=0x00;

 
//    j=write(fd,Buffer,11);
//    printf("发送Buffer=%x\n",Buffer);
//    printf("---------------------------\n");
/*  if (x == -1)
    {
   printf("write operation is error!\n");
    }
*/
   
   /*
 strcat(cmd1,(char)0X02);strcat(cmd1,(char)0X20);
    strcat(cmd1,(char)0X08);strcat(cmd1,(char)0X20);
    strcat(cmd1,(char)0XCB);strcat(cmd1,(char)0X20);
    strcat(cmd1,(char)0X01);strcat(cmd1,(char)0X20);
    strcat(cmd1,(char)0X00);strcat(cmd1,(char)0X20);
    strcat(cmd1,(char)0XD3);strcat(cmd1,(char)0X20);
    strcat(cmd1,(char)0X42);strcat(cmd1,(char)0X20);
    strcat(cmd1,(char)0X00);strcat(cmd1,(char)0X20);
    strcat(cmd1,(char)0X01);strcat(cmd1,(char)0X20);
    strcat(cmd1,(char)0X00);strcat(cmd1,(char)0X20);
    strcat(cmd1,(char)0X50);*/
  
//  write(fd,cmd1,strlen(cmd1));
//  printf("发送cmd=%s,datalength=%d\n",cmd1,strlen(cmd1));
   
   /*
 write(fd,0x02,strlen(0X02));
    write(fd,0x08,strlen(0X08));
    write(fd,0xCB,strlen(0XCB));
    write(fd,0x01,strlen(0X01));
    write(fd,0X00,strlen(0X00));
    write(fd,0XD3,strlen(0XD3));
    write(fd,0X42,strlen(0X42));
    write(fd,0X00,strlen(0X00));
    write(fd,0X01,strlen(0X01));
    write(fd,0X00,strlen(0X00));
    write(fd,0X50,strlen(0X50));*/
   
// sleep(2);
 /*查看网络注册*/
/* printf("search the internet...............\n");
 write(fd,"AT+CREG=?\r",strlen("AT+CRGE=?\r"));
 sleep(2);
 bzero(string,sizeof(string));
 n = read(fd,string,50);
 printf("read AT+CRGE = %d\n",n);
 printf("read AT+CRGE =%s\n",string);
*/
 /*拨号  ATD + 电话号码(别忘了加";")*/
/* printf("call..................\n");
 write(fd,"ATD +8615510687037;\r",strlen("ATD +8615510687037;\r"));
 sleep(2);
 bzero(string,sizeof(string));
 n = read(fd,string,50);
 printf("read ATD = %d\n",n);
 printf("read ATD =%s\n",string);
*/ 
/* if(n < 0)
 {
  printf("send message error\n");
  return -1;
 }
 printf("write message = %d\n",n);
 printf("send end\n");
 sleep(1);
    close(fd);
*/


//    pthread_mutex_unlock(&GPRS_lock);
 /*sleep(2);
 bzero(string,sizeof(string));
 n = read(fd,string,100);
 printf("read message %d\n",n);
 printf("read message =%s\n",string);
    */
    close(fd);
 return 0;
}
 
 int main(void)
 {
  
  //gprs(FIRE);
  gprs(ZIGBEE);
  //gprs(THIEF_INTO);
  return 0;
 }
 
 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

doublewei1

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

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

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

打赏作者

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

抵扣说明:

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

余额充值