WAP基础知识

一、 WAP基础知识
1. 什么是WAP:WAP(无线通讯协议)是在数字移动电话、因特网或其他个人数字助理机(PDA)、计算机应用之间进行通讯的开放全球标准。现在很多人直接用WAP来代表手机上网。WAP的本质就是INTERNET,而且是可以移动的INTERNET。
2. WAP的实现:使用终端移动台(手机)通过移动网络访问网络资源(服务器),可以进行浏览、下载、或者互动参与。
3. WAP功能通俗表达:我们公司技术部,开发制作了一个WAP的电子公告版,那么我们公司的其他员工在全国各地都可以在手机有信号的情况下通过手机(具有WAP功能并且开通了WAP上网)来访问这个页面,了解公司的最新通知和公告,也可以通过这个WAP页面进行反馈,报告进度或者其他事情。
4. WAP网站流程:制作WAP页面或者程序,上传到支持WAP功能的服务器上,移动WAP用户就可以通过手机输入URL来进行访问。
5. WAP的应用范围:
l 公众信息 新闻天气、图片铃声下载、彩票信息、聊天交友
l 商业应用 证券财经、银行系统、特定的位置服务、电子商务、网上银行
l 个人服务 信箱相册、位置服务、信息定制、移动办公
6. 其他相关问题:
问:手机上网需要那些前提?答:1、一部WAP手机和开通数据通信功能的SIM卡。2、开通WAP上网功能,可以拨打1860咨询3、设置手机上网参数。4、现在您就可以上网浏览了
问:WAP能否提供号码本服务,通过号码链接直接拨号?答:新版本的WAP支持这个功能,比如在聊天室中你可以通过点击一个链接来拨叫对方的手机,虽然你可能还不知道他的号码。
问:WAP上网怎么收费呢?答:河南移动WAP手机上网每月使用量在 500分钟 以下(包括 500分钟)按 30元 计费,超过 500分钟按 0.15元/分钟 计费,WAP手机上网不收通话费和漫游费。
问:什么是GPRS?GPRS和WAP的关系如何?答:GPRS是中国移动先进的2.5代网络,为用户通过手机访问互联网提供更高的速率、更短的连接时间、更优惠的资费。
GPRS的开通为WAP业务的发展提供了更加广阔的空间,GPRS网络好象是高速公路,WAP好比是行驶在路上的汽车;在高速公路上汽车可以跑得更快,在GPRS网络上,WAP也将运行得更成功。
问:什么是OTA设置 答:如果您的手机没有进行GPRS上网参数预设而您对如何设置又存在疑问的话,就可以使用OTA设置功能来为手机自动设置上网参数。OTA是英文Over-The-Air的简称,意思是“空中下载”。

二、 WAP的起源、发展及现状
1. WAP的产生阶段:摩托罗拉、诺基亚、爱立信和美国的软件公司PHONE.COM(前UNWIRED PLANET)于1997年中联合发起设立无线应用协议(WAP)标准。它定义了一系列将互联网内容过滤和转化为适用移动通信的标准,使内容可以更容易地在移动终端上显示。
2. WAP的发展过程:虽然受到手机屏幕太小,无线网络带宽太窄,上网速度太慢,网络内容不够丰富等等制约,WAP业务的发展仍然成为2000年电信业和互联网业最“卖座”的热点。当时的摩托罗拉、诺基亚、爱立信、西门子等手机制造商正从普通手机向WAP手机全线过渡;中国移动、中国联通、中国电信相继宣布开通WAP业务;几乎所有网站都争先恐后推出WAP服务。可是,谁曾想到:轰轰烈烈的市场表现背后,WAP并没有真正带动无线上网的大规模应用。当国内申请开通WAP业务的用户尚不足10000户的现实摆在眼前时,虽然没有人愿意承认,但是无人喝彩的局面终于提前宣告了WAP的“悲剧”。
3. WAP的现状及前景:自2002年10月1日,中国移动的MMS粉墨登场以后,整个市场开始爆发,铃声、图片、游戏等基于WAP的产品吸引了众多的眼球,2003年8月份SP总收入1373万(分成后),9月份空中网收入最高,总共是220万。10月份WAP信息费收入为2014万(分成前)超过100万的有7家,超过200万的有3家,空中网的WAP图铃收入有260万,不知道其它的收入有多少,不过,估计总共会在300万左右。前十名的空中网、联动维纳、雷霆万钧、讯天、北京因特普斯、北京吉菲尔、新浪、腾讯QQ、三星安频、网易。按照每个月15%的速度增长,2004年的全年SP的WAP预计收入也只有8个亿,2003年SP的SMS结算收入预计有34亿,预计2004年的SMS结算收入应该有50亿以上。相对SMS来说,WAP的市场的发展空间间还是有一定的限制。不过作为新的技术,新的行业,WAP的移动性、便捷性、安全性会随着无线网络带宽的增加,手机终端数量的发展及用户消费心理的变换而成为未来2-5年内无线消费主流,到那个时候WAP会逐步取代SMS、MMS。

三、 WAP产品的开发实现及业务宣传
1. WAP开发所需要的软硬件环境及技术:
无线设备(手机、PDA)<---->(WAP协定)<---->WAP网关<--->(HTTP协定)<---->WEB服务器<---->数据库服务器
从上面的流程图上我可以看出来,我们需要做的就是在WEB服务器和数据库服务器上进行程序开发,开发工具用一般的文本编辑器就可以,服务器需要在现有的基础上进行一些软件上的设置就可以符合要求。
WAP开发所需要的技术:WML、WMLSCRIPT+ASP、PHP、JSP、C
现在比较主流的技术是利用JSP编写程序进行WML页面的输出
2. WAP产品的接入及后台的管理维护:
WAP产品的接入基本类似现在的SMS产品接入,首先我们需要制作产品,在内部进行产品的各方面测试,测试通过后向移动公司申请产品测试,通过各方面测试后就可以上线。在河南移动公司接入的WAP产品上线后会出现在移动梦网WAP总站中的河南专区中,河南的所有的可以手机上网的用户登陆移动梦网后就可以在河南专区的分类中找到我们的产品。产品上线后公司管理人员可以通过网站的WEB后台对产品的用户数据统计进行查询,并且可以在后台填加、删除、修改相关内容,操作和现在的WEB后台基本一样。
3. WAP业务的宣传手段:
产品上线后还需要我们的推广与宣传,根据WAP的自身特点,目前的主要宣传手段有
l 媒体的广告及合作宣传
l 通过PUSH功能的短信息进行群发宣传
l 发放宣传卡片或资料
l 用户见的口碑宣传
l 网站WEB+WAP的互动宣传

四、 WAP相关名词解释

l WAP:(Wireless Application Protocol)的中文是无线应用协议,它与GPRS属于不同的范畴,它的目的是将互联网的丰富信息及先进的业务引入到移动电话等无线终端之中。打个比喻,GPRS和GSM都是马路,而WAP是在马路上的汽车。中国移动开通GPRS之后,WAP就行驶在GSM和GPRS两条马路上,而行驶在GPRS的马路上可以提高数据传输速度。因此,现有WAP上的内容一样可以通过GPRS 

 

1.WML与HTML有何不同?

  答:WML将文件分割成一套容易定义的用户交互操作单元,而每个交互操作单元被称为一个卡,用户通过在一个或多个这样的卡之间来回导航来实现对Internet的接入。针对手机电话通信的特点,WML提供了一套数量更小的标记标签集,这使它比HTML更适合于移动通讯产品中使用。使用WAPTM网关,所有的WML内容都可以通过HTTP1. 1来进行Internet接入,这样,传统的Web服务器、工具和技术都可以继续使用。

2.WAP论坛(WAPFORUM)是什麽?
  答:WAP论坛是一个拥有200多个成员的行业协会,它致力于开发用于数字移动电话和其他无线终端设备的全球性标准。WAP论坛的主要目标是确保无线行业各公司的产品的互相相容持续发展。WAP论坛的成员拥有90%以上的全球手机市场。

3.通过手机拨号上网跟手机上网有何分别?
  答:目前市场上有一类手机,商家称为"能上网"。其实它只能与笔记本电脑通过数据线相连,使笔记本电脑通过手机拨号上网。这种手机自身并不具备浏览互联网功能,只是一部能拨号上网的移动电话而已。在构造上它只是比普通手机多一个数据传输口或红外接口。因此严格说起来,它其实只能"通过手机上网",而算不上"能上网(浏览互联网)的手机"。

4.WAPTM与WML之间的关系是什麽?
  答:WAP利用数据压缩技术与窄带环境相适应。WML(无线标识语言)是用于产生WAP内容的,它充分利用小屏幕的特点,且可单手进行操作。WAP内容既可以是一两行文本,也可以是全屏图表。

5.如果想参加WAPTM技术开发园地,应该怎办?
  答:请浏览爱立信WAP开发者园地网站:
  http://www.ericsson.com/developerszone/index.asp(英文 )
  您可获得最新行业信息,爱立信WAP产品简介,及下载常用开发工具,如WAP伺服器等。

6.爱立信跟WAPTM科技研发有甚麽紧密的关系?
  答:爱立信是WAP科技最初的研发者,具备了成熟并完整的WAP科技发展技术,由系统,垂询及移动装置一应俱全,现已拥有超过四百个垂询顾问,协助WAP解决方案的发展,并已向电话商提供超过二十个WAP系统。

7.为什么我放在apache服务器上的WML文件不能被打开?
  答:在apache上设置WAP Server需要设置以下参数才可以被WAP终端访问。
  增加类型text/vnd.wap.wml wml
  增加类型text/vnd.wap.wmlscript wmls
  增加类型image/vnd.wap.wbmp wbmp
  增加类型application/vnd.wap.wmlc wmlc
  增加类型application/vnd.wap.wmlscriptc wmlsc

8.deck的文件极限是多大?
  答:deck文件的极限是1397 bytes,假如文件中有中文,文件应该控制在1.2K以内。

9.我们能否使用java applets来增强WAP服务?
  答:WML不支持java applets,但是将来的java将加载到无线设备的CPU和内存上。

10.WML是否支持cookies?
  答:今天的WML尚不支持cookies。

11.我想在页面中提供电话号码的链接,让用户直接通过链接来拨号,请问这种功能如何实现?
  答:当前还不可能通过WML链接去拨号,这一功能会在新版的WAP中实现。

12.如何申请免费的wap网关代理?如何设置?
  答:不用申请。例如在诺基亚7110里有一个设置项:"IP地址", 直接在上面填上WAP网关的IP即可,如Ericsson的网关IP为:195.58.110.201。

 


问: 如何使用php建立wap页面?
答: 在php的第一句加上header ("Content-Type: text/vnd.wap.wml"); 就可以了:) 
 
问: WAP适用于何种无线网络?
答: 得益于WAP协议的分层设计,它能够应用于绝大多数的无线网络,包括 GSM, CDMA,CDPD, PDC, PHS, TDMA, FLEX, ReFLEX, iDEN, TETRA, DECT, DataTAC, Mobitex以及未来的第三代移动通讯网。
 
问: 什么操作系统能实现WAP?
答: WAP是一种通讯协议和应用环境,任何操作系统上都能实现WAP,比如:PalmOS、EPOC、Windows CE、FLEXOS、OS/9、JavaOS 。它还可以为不同类型的设备(比如手机和呼机)之间提供互操作性。 
 
问: 我制作的图像链接为什么在7110下不能工作? 
答: 原因很简单,Nokia 7110 不支持wbmp图像做链接。
 
问: WML声明中的DTD是什么意思? 
答: DTD=Document Type Definition。用于定义WML正式语法,关于WML语法的定义可以到http://www.wapforum.org/DTD/wml_1.1.xml我查找。 
 
问: WAP协议共有几个版本,新版的WAP有什么进步的地方? 
答: AP1.0版本是WAP的第一个版本,在1998年夏被通过。这一版本推介出了WAP的核心内容、i.e.WAP协议条款、WML以及WMLScript等。
WAP1.1版本于1999年夏推出,这是1.0版本的改良版,是对以前的版本进行归纳反馈的结果。1.1版是第一个商业版,在这一版本中的主要变化仍然是用XHTML对WML进行编排以得出W3C的详细说明。这一版本支持WBMP格式的图像操作,从而提高了无线电话应用(WTA)-规格及WML的所有标记,现在它已用小写取代了大写。
WAP1.2版本现已被通过,这一版本采用了WAP推进架构、用户代理结构(UAPROF)、WDP通道、提高无线电话应用(WTA)规格以及包括支持附加的用户网络技术。
WAP1.3版将会在今年7月在WAP论坛上进行讨论,届时有关WAP安全性问题将会得到进一步的加强。 
 
问: 可恶的cache几乎让我无法调试页面,我该怎样清除cache? 
答: 其实你只要观察up的错误提示页面源代码就明白了,只要插入以下head内容就可以有效杜绝cache。
<head>
<meta http-equiv="Cache-Control" content="max-age=0" forua="true"/>
</head> 
 
问: WAP手机最大可以支持几列表格?为什么我制作的表格效果在7110下一塌糊涂? 
答: WML支持表格和相关的标签,但是Nokia 7110 不支持多列表格,所有的表格都会被转换成单列显示。 
 
问: 我制作的WBMP图片为什么不能显示? 
答: 可能的原因有三个:wap服务器没有定义wbmp的显示类型;使用了height或width参数;图片大小超过1.4K。 
 
问: 如何定义通用返回按钮? 
答: 通用返回按钮的标准用法是把type定义为"prev"。
<do type="prev" label="Back"> </prev> </do>
这个按钮可以定义在<template>中,也可以直接定义在card内
问: 我制作的WBMP图片为什么不能显示? 
答: 可能的原因有三个:wap服务器没有定义wbmp的显示类型;使用了height或width参数;图片大小超过1.4K。  
 
问: 如何定义通用返回按钮? 
答: 通用返回按钮的标准用法是把type定义为"prev"。
<do type="prev" label="Back"> </prev> </do>
这个按钮可以定义在<template>中,也可以直接定义在card内 
 
问: WML如何实现表单的post功能
答: WML下POST/CGI的标准方法是使用 go 与 postfield 结合。
> <go method="post" href="http://wap.sina.com.cn/cgi-bin/test2.pl">
<postfield name="stockcode" value="$stockcode"/>
</go>  
 
问: 请问识别用户设备的标签是什么?
答: 识别用户设备的标签与HTML相同: HTTP_USER_AGENT  
 
问: 我想在页面中提供电话号码的链接,让用户直接通过链接来拨号,请问这种功能如何实现? 
答: 当前还不可能通过WML链接去拨号,这一功能会在新版的WAP中实现。  
 
问: WML是否支持cookies? 
答: 今天的WML尚不支持cookies。  
 
问: 我们能否使用java applets来增强WAP服务? 
答: WML不支持java applets,但是将来的java将加载到无线设备的CPU和内存上。  
 
问: deck的文件极限是多大?
答: deck文件的极限是1397 bytes,假如文件中有中文,文件应该控制在1.2K以内。虽然很多手机可以成功的下载超过2K的页面,但是我们仍然建议大家把页面大小控制在1K以内。 
 
问: 为什么我放在apache服务器上的WML文件不能被打开?
答: 在apache上设置WAP Server需要设置以下参数才可以被WAP终端访问。
增加类型 text/vnd.wap.wml wml
增加类型 text/vnd.wap.wmlscript wmls
增加类型 image/vnd.wap.wbmp wbmp
增加类型 application/vnd.wap.wmlc wmlc
增加类型 application/vnd.wap.wmlscriptc wmlsc  
 
问: 我写了如下友情链接代码,希望读者能够选择进入对应网站,但是每次打开页面都会自动激活第一个选项。
<select>
<option onpick="http://wap.sina.com.cn">sina</option>
<option onpick="http://wap.chnmobile.net">china mobile</option>
</select>
答: 并非所有手机都会遇到类似问题,不过在 select 中加上 ivalue="0" 可以避免第一个选项被缺省选择。
 
 
WAP上网实现步骤如下:
  1、用户根据WAP手机显示界面进行操作,按下一个有URL请求指向的电话键;


  2、该用户WAP手机使用WAP协议向该设备指定的一个WAP网关发送URL请求;

  3、WAP网关为这个请求创建一个常规的HTTP请求,并发送到相应的Web服务器
上去;

  4、Web服务器执行该HTTP请求。如果URL请求指向的是一个静态的文本文件,
则Web
服务器获取该文件,并附上HTTP格式的题头;如果URL请求指向的是一个CGI或ASP
或是其
他的脚本程序,那Web服务器就会运行这个脚本程序;

  5、Web服务器返回带有Http题头的WML文件(WML文件在WAP环境下称为deck,
意即用
于手机面板上显示的文件)或是由CGI或ASP等其他脚本语言生成的WML文件;

  6、WAP网关识别HTTP题头和WML内容,将它们编成二进制码, 然后生成一个针
对该
请求的一个包含有这些二进制码的响应并将它们发送到用户的WAP手机中;

  7、用户WAP手机接收该WAP响应,它解析该WML响应并将内容显示在手机的显示
屏上

 

11.6  JSP技术在WAP开发中的应用
使用JSP(Java Server API)技术可以简单而快速地在WAP终端上生成动态的WAP页面,而且能够利用JSP的诸多功能,实现复杂的WAP应用。我们仍以WML为例,讲解JSP技术在WAP开发中的应用。

11.6.1  基本规则
使用JSP技术前,首先要建立它的开发环境。一般是在Windows NT上安装并建立Java Server Web Development Kit(JSWDK),其版本可为1.01版或更高的版本。

为了测试和浏览JSP实现的WAP应用,还需要安装WAP模拟器(浏览器),如Nokia WAP Toolkit,并安装Java Runtime Environment (JRE) 1.2.2或以上版本。

完成以上准备工作之后,就可以按照以下的基本规则使用JSP编写WML程序了。

(1) WML的标签和语句均可直接写在JSP程序中。

(2) 如果想使用JSP来处理WML的标签和语句,则需要使用“<%”和“%>”引起来,格式为:

 

<%

……(JSP编写的WML语句行);

%>

 

例如,以下几行语句就是利用JSP的out.println来输出WML的标签和语句:

 

<%

         out.println("<p>");

                   out.println("Hello from script code!<br/>");

         out.println("</p>");

%>

 

(3) JSP编写的WML语句要用引号(" ")引起来,然后再用括号括起来,而且后面还要加上分号( ; ),格式为:

JSP对象.方法/关键字(" ……WML标签或语句行 ");

例如,下面就是反映JSP书写WML语句格式的例子:

out.println("Hello from script code!<br/>");

(4) WML的文件类型可以使用JSP的response对象进行声明,也可以在声明页面语言时一块儿声明,它们的格式分别如下:

 

<% response.setContentType("text/vnd.wap.wml"); %>

或 <%@ page language="java" contentType="text/vnd.wap.wml" %>

 

(5) 最后的程序文件保存时要采用“.jsp”的扩展名,即保存为JSP的程序文件。JSP将被编译成Java源文件,最后成为servlet。

了解了以上基本规则,我们下面给出一个利用JSP向WAP浏览器显示“Hello from script code!”信息的简单程序,通过该程序大家可以进一步认识利用JSP开发WML页面的具体方法。

 

<?xml version="1.0"?>

<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/ wml_1.1.xml">

<% response.setContentType("text/vnd.wap.wml"); %>

<wml>

         <card id="start">

                   <do type="accept">

                            <go href="index.jsp#test"/>

                   </do>

                   <p>JSP Test:<br/>

                            Press accept to continue!<br/>

                   </p>

         </card>

 

         <card id="test">

                   <do type="prev">

                            <prev/>

                   </do>

         <%

                   out.println("<p>");

                            out.println("Hello from script code!<br/>");

                   out.println("</p>");

         %>

         </card>

</wml>

 

11.6.2  程序举例
我们下面利用JSP和WML实现一个为移动用户定时更新约会的例子。该例的应用程序共包括两个页面。第一个页面的文件是pick_appointment.jsp,它提供了一个选择卡片,当用户选择了其中某一个约会时间时,浏览器就会带着本次约会的ID号进入到第二个页面,即文件名为show_appointment_data.jsp的页面。我们在第二个页面编写了两个卡片,其中第一个卡片用于显示会面的时间,第二个卡片用于显示数据输入,让用户通过输入ID而取消约会。

程序中动态的约会数据是通过Java Bean的实例来取得的,具体过程其实是通过JDBC连接到数据库的过程。取消约会的操作是通过servlet实现的。由于用户可能随时取消某个约会,所以我们需要对pick_appointment.jsp页面进行定时刷新。下面我们就给出这一应用程序的源程序。

pick_appointment.jsp页面文件的程序代码如下:

 

<%@ page language="java" contentType="text/vnd.wap.wml" %>

 

<jsp:useBean id="appointmentBean" class="mwebber.samples.AppointmentBean" scope
="application" />

 

<%!

// 下面创建针对每次约会的选项<option>元素

private String getOptions(mwebber.samples.AppointmentBean appointmentBean) {

         StringBuffer sb = new StringBuffer();

         int[] appointmentIDs = appointmentBean.getAppointmentIDs();

         for(int i=0; i<appointmentIDs.length; i++) {

                   sb.append("<option onpick=/"show_appointment_data.jsp?id=");

                   sb.append(i);

                   sb.append("/">");

                   sb.append(appointmentBean.getAppointmentTime(i));

                   sb.append("</option>");

         }

         return sb.toString();

}

%>

 

<%! String strXMLPrologue = "<?xml version=/"1.0/"?>"; %>

 

<%-- WML内容开始 --%>

<%= strXMLPrologue %>

<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/ wml_1.1.xml">

 

<wml>

         <card id="pick" title="Appointments">

                   <!-- 每分钟刷新一次卡片组 -->

                   <onevent type="ontimer">

                            <go href="pick_appointment.jsp"/>

                   </onevent>

 

                   <timer value="600"/>

 

                   <!-- 回显卡片 -->

                   <do type="prev">

                            <prev/>

                   </do>

 

                   <!-- 为要选择约会而显示"select" -->

                   <p>

                            <select title="Appointments">

                                     <%= getOptions(appointmentBean) %>

                            </select>

                   </p>

         </card>

</wml>

<%-- WML内容结束 --%>

show_appointment_data.jsp页面文件的程序代码如下:

<%@ page language="java" contentType="text/vnd.wap.wml" %>

 

<jsp:useBean id="appointmentBean" class="mwebber.samples.AppointmentBean" scope="application" />

 

<%

// 使用request对象的方法获取"id"参数的值

int intAppointmentID = Integer.parseInt(request.getParameter("id"));

%>

 

<%! String strXMLPrologue = "<?xml version=/"1.0/"?>"; %>
P>
<%-- WML内容开始 --%>

<%= strXMLPrologue %>

<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/ wml_1.1.xml">

 

<wml>

         <card id="main_data" title="Main Data">

                   <p align="center">

                            <b>

                                     <%= appointmentBean.getAppointmentTime(intAppointmentID) %>

                            </b>

                   </p>

 

                   <p>

                            <br/>

                                     <%= appointmentBean.getAppointmentDetails(intAppointmentID) %>

                            <br/>

                            <a href="#check_off">Check off this appointment</a><br/>

                            <a href="http://localhost:8080/pick_appointment.jsp">Back to appointments list</a>

                   </p>

         </card>

 

         <card id="check_off" title="Check Off">

                   <!--设置向服务器发送输入数据的选择项 -->

                   <do type="accept">

                            <go href="/servlet/ProcessCheckOff" method="post">

                                     <postfield name="check_off_code" value="$check_off_code"/>

                            </go>

                   </do>

 

                   <p>

                            <input name="check_off_code" emptyok="false" maxlength="6"/>

                   </p>

                   <p>

                            <a href="#main_data">Back to appointment data</a>

               &nbsp;            <br/>

                            <a href="http://localhost:8080/pick_appointment.jsp">Back to appointments list</a>

                   </p>

         </card>

 

</wml>

<%-- WML内容结束 --%>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值