目录
一、 关于WAP的常见问答
二、 关于WML的常见问答
三、 关于WAP开发的常见问答
四、关于WMLScript的常见问答
五、关于WBMP的常见问答
六、关于WAP网关的常见问答
七、关于WAP浏览器的常见问答
八、关于WAP手机的常见问答
九、关于WAP安全的常见问答
十、关于WAP其他方面问答
十一、关于WAP站点建设的常见问答
一、关于WAP的常见问答
1. 简单的说WAP代表什么? WAP代表“Wireless Application Protocol”。WAP标准也就是无线应用协议(Wireless Application Protocol )。它的作用就是使移动电话和其他无线设备能够访问各种服务和信息,特别是Internet上的服务与信息。
2. 什么是WAP ?
WAP是Wireless Application Protocol的首字母缩写。其定义来自于无线工业界,例如Nokia和Ericsson。它基于现有的Internet技术,例如XML和IP,主要是为无线用户( WAP设备,例如移动电话)提供Internet上的应用和服务。
WAP不是简单的一个协议,它由许多协议组成的,涵盖了从WAP设备到用户代理以及传输协议与GSM信道的各个方面。许多站点都有关于WAP的信息,具有权威的资料一般来自于WAP Forum。但是从WAP Forum来的信息非常专业,技术性强,因此对于新手来说是很困难的。虽然WAP目前还处在刚刚诞生的婴儿阶段,看起来的确有很多不尽人意的地方,但是随着无线通讯工具的普及、网络技术日益成熟、生产商和网络服务商的不断进步,WAP一定会实现现在人们使用IE等浏览器上网冲浪一样的快捷、愉悦,并且更能享受随时随地想上就上的轻松自在。
3. 谁发展了WAP ?
WAP是由一个名叫“WAP论坛”的公开组织发展的。这个讨论组的主要职责是制定WAP的标准和规范。该讨论组的网址为:www.wapforum.com。
4. WAP论坛有哪些公司加盟?
几乎所有的大型通讯公司、无线网络设备提供商,手持设备制造商和软件开发商等等都是WAP讨论组的成员。
5. 为什么要投资WAP ?
WAP允许持有支持该协议的移动设备访问信息和事务服务,例如:饭店和旅馆信息、证券交易、银行服务、目录服务、外汇牌价、航班时刻表、火车和汽车时刻表等等。基于WAP的设备是全球化的,易于使用,并且具有很高的安全级别。它兼容现有的应用程序和IT系统。
预测到2003年,将通过移动电话连接到Internet网络的人将超过使用PC机连接的人。策略分析学家认为,将有超过5.25亿部WAP手机投放市场。
通过交叉的合作,WAP提供了许多潜在的重要商机。它将开辟新的服务方式和新的服务渠道。拥有WAP合作伙伴的公司将能够为他们的客户随时随地提供服务。
WAP将允许合作伙伴使用现有的所有协议或载体为用户服务。最重要的就是通过一个统一的途径来访问全球的用户。
面对这样广阔的前景,当然有理由投资WAP了。
6. 什么服务可以利用移动的优点?
移动服务当然比经典的Web服务更适合于移动的Internet。这些应用正在合并,正像冰山一点点地融化。
以下的应用是其中的一个例子,这个应用将从移动网络受益非浅(被称作“应用杀手”)。
定位服务(Location Based Services)
总的来说定位服务为用户提供全球定位服务,并且还能提供和位置相关的各种信息。在不久的将来,移动设备将能够告诉Web服务器特定的用户在哪儿。当然也可以采取直接向用户询问他们的位置,然而用户的回答描述往往是不准确的。
一个简单的例子就是显示一个城市的公共交通。假设某人想到某个站下车去参加一个会议。因为公共汽车可能会误点,他需要知道公共汽车上次离停的时间,或者知道它到底晚点多少。
在公共汽车站点一般都有一个时间表,还有一个唯一的标识。他可以访问公共交通的Web站点,输入必要的信息后,Web服务器就可以告诉他到底在什么地方,并且可以显示最近的公共汽车站点。虽然现在的公共汽车、火车等交通工具还没有GPS,但是相信总有办法得到位置的精确信息。总的来说,系统可以不用等到新技术的出现就能得到相关的服务。
当技术成熟到可以自动得到用户地理位置的时候,一个好的基于位置的服务将可以提供一个城市停车服务。例如不需要停车灭表,用户拥有一个设备和唯一的号码。当他想停车的时候,只要简单地告诉系统他想停在什么地方、停多久。当离停车结束只有5分钟的时候,系统将使用SMS系统告诉他的停车时间快到了,他必须开车离开或者再付钱。同时,这个系统还可以自动地通知用户哪里有停车位置,哪里发生了交通堵塞并提出智能化的建议。
7. 在中国能得到WAP手机吗?
能。现在有很多厂家都生产WAP手机并且在中国销售。例如:Ericsson,Mitsubishi,Neopoint,Samsung,Ericsson。
8. WAP可以在GPRS上运行吗?
可以。GPRS是一种新的无线服务方式。它将使WAP的传输比在现在的SMS或者CSD要快。
9. 在GSM中WAP使用什么信道?
在GSM中,WAP可以使用Short Message Service(SMS)信道或者Circuit Switched Data (CSD)信道,后者的带宽比较大。
10. WAP可以在什么样类型的网络上运行?
WAP是为了可以在多种网络环境中运行而设计的。包括:GSM、PDC、CDPD、CDMA、TDMA、PHS和DECT,还包括将来的3G。
11. WAP设备是如何连接到Internet上的?
一个普通的WAP应用的场景如图10-1所示:
图 10-1 普通的WAP应用
在上图中,从左边开始,移动网络(GSM、CDDA等)中的移动WAP设备,通过拨号连接到接入服务器(RAS,或者远程控制服务器)的Modem上。这个服务器使得WAP设备可以使用协议来工作。有一些如同Internet Service Provider将提供给用户底层协议,被称作为PPP(Point-to-Point)协议。这个协议是用在整个WAP链中的下一个环节设备——由移动营运商提供的WAP网关。网关连接无线和“Web”世界,基本上是使得WAP设备能够操作普通的Internet。
更详细地说,当用户在WAP设备上输入URL的时候,例如 http://wap.colorline.no/ WAP设备首先检查用户的连接设备是否已经打开。如果没有就拨号到如上面所描述的PPP提供者。在PPP提供者已经给WAP所需要的协议和指定的IP地址之后,请求的URL将发送给网关(WAP网关)。在WAP设备请求的URL的“控制”下,发出一个普通的HTTP请求(例如:GET http://wap.colorline.no)给Internet 。在Internet 那边有一个普通的Web服务器,里面装有WAP和Web的内容,现在接收到了从WAP网关过来的HTTP请求。这个Web服务器通过判断浏览器的类型(WAP或者Web)来发送相应的内容给浏览器。接着请求的内容发送到WAP设备。因为一个WAP设备的WML浏览器只能读懂二进制的WML,所以如果这些请求的内容是文本的WML编码,WAP网关就进行编译工作,将WML编译成二进制的WML,也就是设备可以读懂的WMLC(一些经过压缩的二进制代码),并把这些二进制代码发送到WAP设备;如果内容已经是二进制的WML格式,WAP网关将跳过这个操作。这就是为什么转换文本WML到二进制WML减小了带宽的缘故。最后,当WAP设备的WML浏览器接收到二进制的WML代码,浏览器就显示其内容在WAP设备上供用户使用。
这是一种WAP设备连接到Internet的主要方式。
当WAP设备使用的是公共的WAP网关,而不是移动营运商提供的网关的时候,只需要简单地将WAP网关移动到Internet上。需要说明的是这不是普通的WAP设备的配置。在放置的时候,可能要遇到一些问题,图10-2说明了这个方式:
图10-2 使用公共网关
这个时候WAP设备请求了另外的一个在Internet上的WAP网关。这个图没有什么特别的地方需要说明。只是当那些没有移动营运商提供WAP服务的地方,或者是想自己建立WAP服务的地方,可以使用这样的方法。
如果内容提供者想完全控制在Web Server和WAP设备之间的数据流发送和接收。那么就应该安装一个所谓的WAP server。这个设备其实是一个Web Server和WAP 网关的混合体。并且经常是在一个防火墙的后面。
图10-3说明了这个问题。防火墙是可选的,但是强力推荐。
图 10-3 加入防火墙
WAP设备就像前面所说的那样进入Internet,但是现在连接到防火墙的时候,它将接受或者拒绝一些连接,然后将连接发送给WAP 服务器内的WAP网关。在这个图中,在内容服务器和WAP设备之间是使用点对点的WTLS加密协议。
WAP服务器对于一个普通的站点来说是不必要的。
12. 能从服务器推送消息到WAP设备吗?
WAP1.1不允许推送。可以用SMS来达到这个目的。
13. WAP如何同Bluetooth, EPOC和Windows CE竞争?
这有点不大可能。WAP是使得Web的内容迁移到移动设备上。EPOC和Windows CE是设备的操作系统,它将使得微型浏览器可以浏览WML页面。Bluetooth 是一个RF (Radio Frequency)技术,它是一种小范围的无线网络。
14. WAP能持续多久?
笔者个人的观点来看,WAP能持续多久,最终还是要取决于用户对WAP的信心。一个好的技术往往在市场选择了其他的方式之后就被浪费掉了。例如VHS,Beta和Video 2000家庭视频标准。从技术的角度上来讲Video 2000提供最好的质量,但是市场选择了VHS,而且是三个里面最差的那个。对于WAP的前景问题,很不幸的是WAP现在被标上了“移动电话上的Internet”这样一个条框限制。相信多数的WAP设备是移动电话,但是WAP并没有电话这个限制,说WAP是一个Web浏览器是错误的。
WAP是可以在一个“瘦”客户端上提供类似于Internet上的服务和应用。所谓“瘦”就是低能力的处理器,非常有限的显示屏幕等等。这些应用如何能更好的工作,完全取决于开发人员。WAP现在的确是限制了开发人员,但它是一个新技术,毕竟在发展的过程中有很多障碍。
有很多人当他们见到手持的微型PC和PDA的时候说,因为小的显示屏幕和缺乏好的输入机制WAP就要死亡。笔者个人认为这是错误的,首先是设备的问题,当人们外出时需要尽可能的少带设备;其次是花费问题,两个设备肯定比一个设备花费多,并且主要的WAP设备普通人都能够承受,而且花费也少。
制造厂商可能想通过将PC和移动电话集成在一起来解决这个问题。那么设备的尺寸又是另外一个问题。对于这样一个能够让人们使用的设备,肯定有很多限制。首先是输入设备,当前最好得输入设备就是键盘。若给移动电话配一个合适的键盘,那么这样一个键盘的每个按键之间的间隔可能只有小孩子才可以使用。其次是输出界面,一个人的眼睛最适合于观看五英寸的屏幕,任何比这再小的屏幕,用户都不得不再移近观看,这么大的一个屏幕将使得设备显得特别庞大并且无法放在一个普通的口袋里,而典型的移动电话的显示屏幕是2英寸,如果用户想显示普通的640*480图像在这个屏幕上,那将是不太现实的。
一个典型的混合PDA和移动电话的设备有点像今天的Nokia Communicator。用户无法方便地使用这个设备,除非用一只手来抓住它另一只手来操作或者让它完全固定住。而一个普通的移动电话,用户只需用一只手就可以操作,包括抓住和输入。
有人可能要说在一个电话上使用数字键盘来输入是不可能。使用普通的键盘的确是很方便,但是这并不意味着你在WAP设备上书写不方便。现在成亿的SMS都是从移动电话上发出的,就证明了这一点。
最后要说的是WAP不是在移动电话上的Web。WAP将拥有很长的生命期,只要有开发者能够理解它并且应用它。
15. 有哪些成功的WAP应用?
表10-1给出了很好的WAP应用的实例。也许不是非常有用或者非常高科技,但是它们是很好的例子:WAP可以提供Web的功能应用。
这些应用是基于WML的,在普通的HTML下将无法得到预期的效果。
表10-1 WAP应用
应用 | 类型 | 地址 |
翻译 | 翻译成英文 | http://www.zenith.ie/wap/translate |
WAP CAM | 在线的 | http://wap.colorline.no/demos.html (从菜单选择WAP CAM) |
域名检测 | 检测 | http://kronkel.com/domain.wml |
登记本演示 | 登记本演示 | http://cgi.cse.unsw.edu.au/cgi-bin/cgiwrap/s2231995/GB/GuestBook.wml |
波兰 | 波兰 | http://www.polish-airports.com/wap/main.wml |
SETI@Home | 显示 | http://seti.matrix.pl/setiatwap/ |
域名 | 检测和注册 | http://wap.tldnames.com/ |
PDFmail | 安全的 | http://www.sanface.com/wap/pdfmail.wml |
有一些URL地址非常长,可以从下面的地址来选择:http://wap.colorline.no/links.wml。
16. 可以推荐一些好的WAP服务商吗?
下面有两个列表。表10-2提供免费的WAP主机服务,他们的服务相差很大,但是都是免费的。表10-3列出的是商业的WAP服务商,需要支付服务费。
表10-2 免费的WAP服务商
提供商 | 服务类型 | 地点 |
Tag Tag | 免费的WAP站点主机和在线的基于Java的WAP站点编辑器 | 美国 |
http://www.tagtag.com/ | ||
wapHQ | 免费和独立的移动Internet操作 | 英国 |
http://www.waphq.co.uk/ | ||
WAP Service | 免费的WAP公共服务 | 瑞典 |
http://www.wapservice.com/ | ||
Wappy | 免费的WAP站点和重导向服务 | 荷兰 |
http://www.wappy.to/ | ||
SoWAP | 免费的WAP主机(法文) | 法国 |
http://www.sowap.com/ | ||
Freedom2Surf | 真正免费的HTML服务,但是他们支持PHP3来提供WAP内容服务 | 英格兰 |
http://www.freedom2surf.net/ | ||
Anytimenow.com | 免费的20M空间,在线编辑和存储wml和wmls文件。同样提供WAP email服务,包括Hotmail | 英格兰 |
http://www.anytimenow.com/ | ||
Hoiley.com | 免费的离线WAP builder - WMLedit (仍在"beta"版本) | 德国 |
http://www.hoiley.com/ | ||
Waphome.ch | 免费提供商,在德国,包括在线的基于WAP的转换服务 | 瑞士 |
http://www.waphome.ch/ | ||
WapSpy | 免费提供商,文件上传,图像库 |
|
http://www.wapspy.com/ | ||
WapMine | Windows离线编辑器,WAPpage | 美国 |
http://www.wapmine.com/ | ||
WapDrive | 免费提供商"beta" version |
|
http://www.wapdrive.net | ||
WAP Homes | 免费提供商(在德国) | 德国 |
http://www.wap-homes.de/ | ||
AddCom | 免费提供商(在德国) | 德国 |
http://www.addcom.de/ | ||
WapMatic | 免费提供商(在英国和德国) | 德国 |
http://www.wapmatic.de/ | ||
DeZines Webhosting | 几乎免费提供WAP环境,包括PHP | 国际 |
http://www.web-hosting.com/ | ||
Done | 免费提供商(在土尔其和英国)。包括字典,游戏等 | 土尔其 |
http://www.donetr.com/index.html | ||
Start.no | 很好的免费WAP站点。还有很多服务。在挪威 | 挪威 |
http://wap.start.no/ |
表10-3 商业的WAP服务商
提供商 | 服务类型 | 地点 |
wapHQ | WAP,应用主机,合作应用 | 英国 |
http://www.waphq.co.uk/ | ||
Brainstorm | Wireless Application Service 提供和开发商 | 英国伦敦 |
http://www.brainstorm.co.uk/ | ||
IntegrationWireless | 创建移动商务 | 美国华盛顿 |
http://www.integrationwireless.com/ |
17. 以前没有WAP的经验,但是想学,如何动手?
建议在站点wap.com查看一下《Beginner's Guide to WAP/WML》。
另外可以从ASP Today(http://www.asptoday.com)中发现一些如何书写WMLScript的文章。许多人都会发现在阅读了一些文档之后能很容易的上手。笔者也建议你在阅读了一些文章之后再开始做。
哪儿有一个WAP词汇表?
这里有一个词汇表(表10-4)
表10-4 词汇表
WAP Server | 一个经常错用的词汇。一个WAP Server从真正的意义上来说和一个HTTP Server没有太多不同。Nokia将他们的HTTP Server和WAP Gateway集成产品也叫做WAP Server。其实是一个内容提供服务器和网关。网关完成网关的内容,内容提供服务器完成内容提供服务器的功能 |
WAP Gateway | WAP Gateway是一个两种模式的设备(像许多网关一样)。从WAP设备这边来看,WAP设备只懂得二进制格式的WML,WAP网关的功能就是转换内容为这种格式。从HTTP服务器这边来看,WAP网关可以通过HTTP头提供附加的有关WAP设备的信息,例如WAP设备的电话号码,电话ID甚至是位置信息 |
WML Card | 一个在WML Deck中包含导航、用户交互的完整的WML块。一个或者多个WML卡片必须包含在WML Deck中。WML Deck就是XML文档。(Deck就是扑克牌盒,Card就是每张牌) |
WML Deck | 一套WML卡片。整个Deck在请求的时候都将装入到浏览器中,然后针对其中的每个卡片进行处理 |
SGML | Standardized Generalized Markup Language |
UA | User Agent.能够解释WMLWML,WMLScript,WTAI或者其他格式的代码的软件 |
WMLScript | Scripting language for WAP devices。基于JavaScript,但是功能比较弱 |
XML | Extensible Markup Language。W3C的Internet Markup Languages标准. WML是这些语言中的一种。XML是SGML的子集 |
HDML | Handheld Markup Language |
W3C | World Wide Web Consortium。http://www.w3c.org |
WAE | Wireless Application Environment |
WSP | Wireless Session Protocol |
PDA | Personal Digital Assistant。通常是一个手持的设备,例如 Palm Pilot。WAP不是仅仅为蜂窝电话设计的,PDA也可以支持 |
Element | 一个元素指的是在WML Deck中的标记和结构信息 |
DTD | Document Type Definition |
WTP | Wireless Transaction Protocol |
WTLS | Wireless Transport Layer Security。一个“等价于”SSL (Secure Sockets Layer)的协议 |
WDP | Wireless Datagram Protocol |
19. 除了这个FAQ,我在哪儿能找到更多关于WAP和WML的信息?
可以在本书的第8章WAP资源中找到很多相关的资源。
20. WAP 1.1和WAP 1.2有什么不同?
现在主要的设备和应用或多或少的遵循WAP 1.1协议。WAP Forum 已经发布了WAP 1.2 ,里面没有太多值得注意的不同。毕竟一个协议不能进化得太快。
总的来说,WAP 1.2中有以下几个最重要的新特点。对每个特点最好参考 WAP 1.2 Specifications。
l 新协议
UAPROF(User Agent Profile)。它基本上同意用户代理(可以近似理解为浏览器)使用一种方式来告诉内容提供者它有什么样的功能。这样使得提供者可以格式化输出最好的功能到这个专门的用户代理。
PUSH. PUSHing简单的说就是让应用服务器可以发送数据直接给用户代理。
l WML
accesskey属性加入到<a>、<anchor>和<input>标签中。accesskey属性将允许用户只需要按一个专门的按键转跳到一个专门的锚或者输入框中。
<pre>标签看起来还没有在发布的版本中公布。我们将假设它和HTML中的pre标签具有同样的意义。
enctype属性加入到<go>。使用这个可以知道发送的数据将进行加密处理,要么是application/x-www-urlencoded或者multipart/form-data。对于GET,只引用前者。
align属性增加到<table>。指定对齐内容使用L、R、C和D分别对左,右,中和默认。
<input>的格式化属性Nf已经从绝对数值变化到可以从0到n。
字符编码不在依靠指定的专门的<meta>标签。
l WMLScript标准库
URL库已经确认为RFC2396。
在字符串中如何表示非US-ASCII字符。非US-ASCII字符必须转换成本地可用的字符集。
21. 在WAP中如何实现多媒体流?
在一家叫做Sontora (http://www.sontora.com)的公司发布一些有关Mobicast的信息之前,这被认为是不可能的。Sontora的一些有关Mobicast的信息将可以在任何WML 1.1的设备上使用声音流,包括MP3、Windows Media和RealAudio,并且不需要对设备进行任何的修改。要想得到更多的信息,可以浏览他们的站点。
以前说不能是因为WAP协议不允许操作硬件。更谈不上播放音乐了。即使是Web的协议也不可能。对于Web环境是使用插件来解决的。但是对于WAP环境没有插件。
其实,可以使用WAP来点播歌曲,然后使用电话呼叫,将歌曲传送过来,就像语音传递那样。
1. 简单说WML代表什么?
WML代表“Wireless Markup Language”。WML就是无线标记语言(Wireless Markup Language),内置于移动设备中的微型浏览器能够解释这种标记语言。虽然它和HTML语言很相像,但WML其实是XML的一个应用子集。
2. 什么是WML?
WML代表Wireless Markup Language,就象HTML对普通的Web浏览器一样。有人说它是基于XML,但是更准确地说WML是XML的一个应用。虽然在语法上和HTML相似,但更多的是XML。如果准备从HTML到WML,但是没有任何的XML知识,将会发现WML“非常”严格。就像HTML,WML被读取并且通过WAP设备中的浏览器解释,然后显示在屏幕上。对于WAP设备,浏览器,或者用户代理,通常叫做微型浏览器。微型浏览器的功能是受到WAP设备的限制的。
为什么使用WML而不是使用广泛的HTML原因是由于WAP的工作方式以及WAP是为一个“窄小”的无线世界工作的。在Netscape、Opera或者IE上显示HTML需要更强的计算能力。计算能力某种意义上是移动设备中的电能。由于移动设备中的电能是有限的,所以WML在发送给WAP设备之前,通常要经过转换和压缩。所以WAP使用的是WML。
读者也许可能想到WML非常简单,甚至不能处理HTML中的多媒体类型。这个不是问题。标记语言(WML、HTML等等)没有操作设备的权限,例如播放声音或者显示动画。仔细地观察HTML,就会发现没有一个HTML标签能够显示动画或者播放音乐。限制是来自于运行标记语言的浏览器。毕竟在大多数情况下,是谈论移动电话。但是这个限制应该随着无线Internet的发展而逐渐取消。
3. WML与HTML有什么区别?
虽然WML看起来十分像HTML,但是在技术上两者的差别还是很大的。WML是为微型浏览器所设计的HTML的一个子集。WML的标准定义是基于XML的。
4. Phone.com的 HDML和WML有什么区别?现在有电话支持 HDML吗?
HDML(Hand-held Devices Markup Language)是Phone.com开发的。它使得Web页面可以在移动电话上显示,其标准的公布先于WAP标准。Motorola、 Neopoint、Qualcomm 等等公司的电话使用Phone.com的浏览器,它支持HDML。最新的UP.Browser支持HDML和WAP。
5. 为什么使用WML而不是HTML?
首先是WAP协议要求使用WML。可能已经有能够支持HTML的WAP设备,但是那不是真正的。有一些和无线设备很像的WAP设备支持HTML,但它们也不是直接使用HTML(例如:Microsoft Mobile Explorer支持HTML和WML)。MME设备只是将两个分离的部分做到了一起。当然也有HTML的变种,例如 iMode 浏览器使用Compact HTML。简单的说,如果谈论WAP设备,那么标记语言就是WML。
有很多理由说明选择WML而不是HTML。现在最重要的一个原因就是WML与HTML相比需要很小的带宽。随着无线技术的提高,带宽会越来越宽。这个原因可能不再是主要原因,但是在达到这么高带宽之前需要许多年的时间。
另外一个就是HTML需要相对来说比较强的处理器。处理器的能力意味着需要更强的能量。在无线设备中能量来自于电池。而一个低处理能力的处理器就意味着电池的使用时间可以更长。
另外,HTML的确需要一个很大的显示屏幕。移动电话上的屏幕显然不能满足要求。当然也许会有一个大屏幕的移动电话,但是这样它就离移动更远(也就是说越不像移动电话)。即使iMode支持彩色和一个类似HTML的显示,它的尺寸已经是你可以方便携带的最大尺寸。
6. 为什么对于无线设备要专门设计一种特别的语言才能访问Internet ?
许多年来,HTML标记越来越丰富,越来越庞大。此外,浏览器对各种HTML标记的支持也大不相同。这种状况已经与当初想建立一个简单的标准相背离。
移动设备(例如:移动电话)具有小屏幕、内存少、缺少方便的输入设备和带宽窄的特点。这种状况驱使WAP讨论组发展一种新的为无线设备所使用的语言,WML就此诞生了。
7. 无线设备也能支持HTML格式吗?
从技术的角度上来说答案是肯定的。既然HTML是为普通PC浏览器所编写的,也可以使用微型浏览器来浏览一个HTML页面,但是可能没有效果。因为移动电话不知道如何显示该文件。这样通常导致微型浏览器出现混乱。并且HTML页面通常都比较大,它会把移动设备“撑坏”的。
8. 如何将HTML转换成WML?
当考虑转换HTML时,要想到WML是为小屏幕设计的,不可能像HTML那么丰富多采。任何转换都将忽略很多HTML标记和许多内嵌的脚本。只有一些简单的HTML页面可以被满意地转换。转换可以使用工具包如:Spyglass Prism,也可以通过在线的WAP网关过滤。
9. 用什么可以浏览到WML页面?
首先需要一个具有WAP功能的手机,例如:Nokia 71110,Ericsson R320等等。用于PC机的桌面WML浏览器也很多,例如:WinWap、WapMan等等。
10. 在哪里可以学到更多的关于XML的知识?
可以访问站点:www.w3c.org/xml。在该网站上有许多关于XML的知识有详细的讲解。
11. WML的一般语法是什么?
WML非常像XML。和HTML相比其语法规则更加严格,从而保证当微型浏览器解析和解释的时候不会有太多的错误信息。
和HTML一样,WML使用“<”和“>”组成的格式化标签。许多标签都是以<tag>开头,以</tag>结尾。在开头或者结尾中包含的部分叫做元素。有些标签叫做空元素,只有标签,没有内容,如:<tag/>。
许多元素有属性来描述应其中还有那些内容。属性名字必须小写,并且属性值必须使用双引号括起来。有些属性是必须的,有些是可选的。一般的属性标签格式就像:<tag attribute1="value">。
变量可以在WML卡片中定义,它们的一般格式是 $(variablename)。
一个WML页面有一个专门的格式,它必须以XML的文档声明为开头:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM/DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
所有的页面中的元素,都必须在<wml>和</wml>标签之间。
12. 什么是一个“deck”?
一个WML文档有许多卡片(cards)组成。一个卡片是一系列完整的WML代码。这些卡片被称为一个“deck”。卡片和“deck”的概念就有点像HTML中的锚标记<a name="#achor1">和一个HTML页面。也就是说卡片是“deck”中的一个组成部分。也可以把“deck”称为WML中的页面。它们之间的关系可以比做一副扑克牌。整副扑克牌就是deck,而每一张牌就是card。
13. 什么是WML的“deck”?
WML的“deck”或者WML文件是指decks。每个deck包含一个或者更多的card。每个deck都以<wml>开始和结束。并且每个card都以<card>开头或者结束。
当WML微型浏览器处理WML文件或者deck的时候,它阅读整个deck,并且在deck内的各个card之间进行导航。当装入deck的时候,deck里面所有的card都已经装入到内存中,直到浏览器装入另外的deck。
如果熟悉 HTML中的<a name>标签。WML的<card>标签将是非常类似的:
<wml>
<card id="start_menu">
...some code...
</card>
<card id="purchase">
...some more code...
</card>
</wml>
deck和card可以按照这种方式调用:[deckname][#cardname]。如果deckname省略,那么浏览器就会查找当前内存里的cardname名字的card。如果使用了deckname和#cardname,那么浏览器将装入deckname的整个deck,然后跳入到#cardname。这个和HTML的工作方式很像。
14. WML是大小写敏感的吗?
是的!要注意WAP 1.1使用小写的标签。
15. 如何显示一个美元符号?
使用两个在一起的美元符号来表示,即“$$”。
16. 想显示价格的格式该怎么办?
“$”是一个特殊的字符,使用“$$”来显示一个“$”。
例如:
<p>
The price is $$11.20
</p>
17. fieldset标签有什么作用?
编写WML页面的时候要考虑到设备的屏幕很小。如果试图想把一个大的form在一个屏幕里面显示,就要指定那些标签保持在一个屏幕中。那么fieldset标签将这些标签捆绑在一个屏幕上。
18. postfield标签有什么作用?
postfield标签使允许提交参数到服务器端。注意有些早期的模拟器还不支持该标签,这将给开发工作带来麻烦!
19. WML有类似HTML的<mailto>标签吗?
没有。但是你可以使用WML表单和服务端脚本来得到同样的效果。
20. 无法让<input/>格式正常工作是怎么回事?
至少Nokia WML Reference没有讲清楚有关<input/>标签的用法。format参数控制着用户输入数据的类型和长度。
注意到不是所有的WAP 1.1浏览器都接受所有的格式化代码。例如:Nokia 7110就支持得不是很好。Mitsubishi Trium在处理“*f”代码的时候有点问题,“*”必须为1或者更大。专门的格式化代码如下:
A
从A到Z的任何大写字母,没有数字或其他字符。
a
从a到z的任何小写字母,没有数字和其他字符。
N
任何0到9的数字。
X
从A到Z从0到9的任何字符。
x
从a到z从0到9的任何字符。
M
任何字符,输入默认从大写开始。
m
任何字符,输入默认从小写开始。
*f
(星号)意味着任何数字(包括0),f是格式的代码。
nf
意味着恰好要输入的字符个数。n从1到9。f是格式代码。
/
是转义输出字符。
格式化字符可以组合使用来表示一种特定的格式输入。但是强制一定的输入应当避免在用户出错的时候没有提示信息。如果输入是不正确的,该填写的区域一般仍保持空白,直到让用户知道应该输入什么。如果只想输入数字,使用“*N”那么将直接转跳到数字输入模式。如果只想输入大写的字符,使用“*M”转跳到大写输入模式。现举一些例子:
“N” 只接受一个数字字符。
“*N” 接受任何数字字符。
“NN” 只接受2个数字字符,不多不少。
“ANN” 接受一个大写字符(没有数字),后面跟着两个数字,不多不少。
“X*N” 表示可以接受一个字符(没有数字)后面跟着任意多的数字字符。
“NNN/-NNN/-NNNN”表示接受美国的电话号码格式,例如:“123-456-1234”。
“2N/:2N/:2N” 表示接受时间格式,例如:“12:02:34”。
“NNNNNNNNN” 表示接受9个数字字符。
“9N” 同样表示接受9个数字字符。
maxlength参数控制着输入字符的总个数。
21. 如何防止一个空的field?
在大多数情况下需要知道用户确实是输入了一些内容在field中,不能让这些内容为空。这个可以通过在服务端的检测来完成,也可以通过WML来完成。
在WML中,这个检查可以通过合适的格式化代码来完成,或者使用一个在input标签中叫做emptyok="false" 的参数来实现(只有当必须要求用户输入的时候才使用)。如果使用了value="something" 或者value="" 用户仍然可以发送空的fields。
以下的行将接收任何值到username field, 甚至用户将整个field清空。另外field中没有任何东西,也能够提交form。
<input name="username" type="text" value="things" format="*M"/>
除了用户将整个field清空,以下的行将接收任何值到username field。如果field是空的,他将不能提交form,。
<input name="username" type="text" value="things" format="M*m"/>
以上的应用是针对大多数的浏览器。在Nokia 7110 ,emptyok参数可以有同样的效果:
<input name="username" type="text" value="things" format="*M" emptyok="false"/>
22. 使用option标签的时候,无法一屏显示完该怎么办?
许多WAP电话的显示屏幕只能显示三到四个选项。按以下的方法分割option字段就可以输入更多的选项。
<select title="longselectlist">
<optgroup title="option1">
<option>option1-1</option>
<option>option1-2</option>
<option>option1-3</option>
</optgroup>
<optgroup title="option2">
<option>option2-1</option>
<option>option2-2</option>
<option>option2-3</option>
</optgroup>
<optgroup title="option3">
<option>option3-1</option>
<option>option3-2</option>
<option>option3-3</option>
</optgroup>
</select>
23. 想有一个永久的BACK在屏幕的右下方。有些好像是自动的,若没有,该怎么做?
可以加入以下代码。
<do type="prev" label="Back">
</prev>
</do>
更好的是使用template。
……
<template>
<do type="prev" label="Back" name="back">
</prev>
</do>
</template>
……
24. WAP支持列表吗?
是的,WAP1.1支持列表和相关的标记。
25. 可以在WML中使用表单吗?
可以。但是Nokia 7110在显示表单的时候有些问题。
26. WML支持什么样的表单提交方式?
WML支持GET和POST方式。但是Nokia 7110在处理GET方式的时候有些问题。
27. WML中如何增加参数到URL字符串中?
和HTML的工作方式很像,如下所示:
……
www.someserver.com/someurl?parameter1=value1&parameter2=value2
……
唯一的不同是将“&”变成“&”。
28. 如何从WML向ASP传送数据?
假设有一个ASP叫做“myasp.asp”,并且有一个WML变量叫做 “wmlvar”。当发出请求“myasp.asp?wmlvar=something”,可以使用下面的方法得到变量的内容。
dim aspvar
aspvar = Request.QueryString("wmlvar")
ASP变量“aspvar”将包含字符串“something”。当然ASP变量也可以与WML变量同名。
29. 如何让WML页面自己更新?
有过Web经验的人喜欢使用:
<meta http-equiv="refresh" content="1;http://somewhere.com/">
来强制浏览器自动更新。
虽然在WAP中也支持一些META标签,一个更好的办法是使用<ontimer>标签。
以下的代码显示了如何自动转跳到另外一个卡片:nextdeck.wml。
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="splashscreen" ontimer="nextcard.wml">
<timer value="40"/>
<p>Please wait for the timer to run out...</p>
</card>
</wml>
下面的代码将强制浏览器在一段时间后重新装入同一个卡片。这个页面叫做loop.wml。
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="loop" ontimer="loop.wml">
<timer value="40"/>
<p>This text will be shown over and over again...</p>
</card>
</wml>
注意必须避免浏览器可能要使用的cache机制。
30. WML页面的最大大小是多少?
1397 bytes/deck
31. WML页面的限制是多少?
由于WAP设备只有很少的内存,因此就存在着一个最大的WML deck的界限。这里没有一个绝对的标准,根据浏览器的不同而不同。表10-5列出了几种浏览器的限制。
注意WML deck的大小是指编码压缩成二进制格式下的大小,一个没有压缩的WML deck可能很大,但是压缩后可能比较小。
表10-5 不同浏览器的限制
浏览器 | 压缩后的WML大小限制 |
UP.Browser 3.2 | 1492 bytes |
UP.Browser 4.x | 2048 bytes |
Ericsson R320 | 大约3000 bytes |
Ericsson R380 | 大约3500 bytes |
Ericsson MC218 | 多于8000 bytes |
Nokia 7110 | 1397 bytes |
32. 如何防止对WML页面的非法访问?
WAP可以防止通过HTTP协议对文件和目录的非法操作。注意:有些WAP模拟器和虚拟的WAP浏览器可能不支持这个特点。在这个时候是不知道是否有可能使用其他类型的验证方式。
为了使用这种方式,用户的HTTP服务器必须支持这个特点,其实大多数服务器都支持。当一个WAP浏览器请求一个URL,它将提醒用户输入用户名和密码。这些都转换成无法直接阅读的字符,但不是加密。也就是说如果网络上有人在使用合适的设备监听,那么用户名和密码将被泄露。
这个特点在Apache文档中有详细的说明,但是文档的描述很弱,这里有如何在Apache HTTP服务器上配置的说明:
要保证Apache已经配置过,使得一个名叫.htaccess的文件可以覆盖全局的操作配置。操作配置既可以在每个目录使用分离的文件,也可以在全局的access.conf中。但是在这个例子中,我们将集中在.htaccess文件上。并且检查AllowOverride的设置。这个必须设置到AuthConfig,那样意味着Apache在目录中寻找.htaccess文件,并且使用该文件中的规则。记住在配置后要重新启动Apache服务器。
下一步是在目录里放置需要保护的文件叫做.htaccess。(注意点代表文件名的开头)。一个.htaccess文件的基本内容如下:
AuthType Basic
AuthName "WAP FAQ Authentication Demo"
AuthUserFile /home/httpd/html/wap-faq/extras/auth/auth.passwd
require valid-user
AuthType设置是指定验证的类型,AuthName指定领域,AuthUserFile指定口令文件的位置,require指定所想得到的操作。在这个例子中,任何在口令文件中的用户都有一个正确的口令。
现在需要产生一个口令文件,Apache使用一个叫做 .htpasswd来完成这个特殊格式文件的生成。运行程序如下:
#htpasswd /home/httpd/html/wap-faq/extras/auth/auth.passwd demo
New password:
Re-type password:
Adding password for user demo
注意:在第一次创建文件的时候,必须使用“-c”选项。
现在加入了一个叫做“demo”的用户,并且输入了他的密码两次。考虑到安全的原因,口令文件不应该放在文件根目录下。笔者在这里只是做演示。
现在最后就是测试,笔者建议使用HTML浏览器。输入含有想保护的URL目录的地址,一个对话框就会弹出来询问用户名和口令。如果一切顺利,就可以使用WAP浏览器来测试了。
一个目录保护的例子在这个服务器上,用户名是demo,口令是demo。可以使用HTML或者WML浏览器来做测试。
这个例子同样可以通过输入http://wap.colorline.no/demos.html来得到。
或者只要点到保护的区域:
http://wap.colorline.no/wap-faq/extras/auth/
或者查看.htaccess文件。
最后点击查看口令文件的内容。
33. 怎么使用非拉丁字符?
在文件开头加上:
encoding="ISO-8859-1"?
或者:
encoding="UTF-8"?
ISO-8859-1和UTF-8编码支持更多的字符。
34. 一些特殊字符破坏了代码和连接该怎么办?
锚/链接有时候包含了一些字母和数字之外的字符。典型的如:“~”(波浪号)和“&”(与号)。如果根据书编程,就应该告诉WAP浏览器使用的是什么字符集。这个在XML定义中可以完成:
<?xml version="1.0" encoding="iso-8859-1"?>
“iso-8859-1”是Latin字符集。这个应该在大多数场合下能满足需要。但是,还是需要对那些转义字符进行转义。即使指定了字符集,也是没有用处的。
字符实体是某些特殊字符的标准名字,例如:“&”就是“&”。
大多数浏览器在反编码名字实体的时候会出现问题,例如Nokia列出了7个兼容的名字实体:“quot”、“amp”、“apos”、“lt”、“gt”、“nbsp”和“shy”。只有在使用它们的十进制代码的时候(在上述所说的Link中),浏览器可以显示几乎所有字符。如果Nokia的浏览器接收到无法支持的实体名,它就会崩溃。
通过使用HTML或者WML浏览器(在HTML格式下,虽然不是很好),可以操作在线的实体名列表,该列表在http://wap.colorline.no/wap-faq/apps/charentref.html。
这个表同样有一个例子在:http://wap.colorline.no/demos.html。
第一步,选择将要使用的字符集,Latin1,Latin1 Mathematical和Greek symbols,最后是Latin1 Markup symbols。注意到列表被分割了,是由于deck的限制。真正的列表显示了实体名,实体的十进制值和真正的符号。从这里就可以看到哪个字符浏览器可以显示。
注意上面的在线列表,不要设置为“charset=iso-8859-1”(真正的Latin1),那是个XML定义。
35. 可能在WML页面上显示一个可选的Link吗?当用户选择后就可以直接拨号?
现在不行。但是一旦支持WTAI的设备出现,那么就可能实现。
1. 开发WAP软件需要哪些工具?
为了开发WAP应用程序,需要一个WAP网关(注意:这里的网关可能是指支持WML的服务器。可以通过配置WWW服务器达到这个目的)和WAP工具包。工具包应当包括模拟器和能让开发者浏览WML网页。WML页面的开发和HTML页面的开发一样,可以使用Notepad或者其他文本编辑器来进行编辑。
2. 有哪些公司现在提供这样的开发环境?
Nokia、Ericsson、UpPhone和Motorola都提供免费的WAP网关和工具包。
Nokia:Nokia Toolkit和Nokia WAP Server。
Ericsson:Ericsson R320和WapIDE。
UpPhone:UpPhone SDK。
Motorola:Motorola ADK。
3. 开发WAP应用一定要有WAP手机吗?
不是,当开发WAP应用的时候,不一定需要WAP手机。模拟器可以帮助开发者解决大部分的问题。但是如果是开发商业网站,特别是想知道各种移动电话在显示WML页面上的差别的时候,最好是配备一个。目前各种手机对WML标记的支持和中文的支持状况大不相同,因此WAP手机还是必要的。
4. 开发者需要一个WAP网关吗?
不是很必要。如果只想进行简单的WAP内容服务,可以使用现有的Web服务器(只需要修改MIME类型)。移动电话会通过坐落在本地的网关连接到你的服务器上。
但是在网关上驻留开发者的程序有很多好处。既然开发者的程序是网关的一个部分,开发者就可以知道呼叫号码、身份、位置等等。
5. 可以看到WML的源代码么?
如果开发者使用SDK浏览的时候将能够看到WML的代码。如果只有一个HTML浏览器,可以访问“Fetch Page”服务(http://www.webcab.de)来取得代码。这个可以显示在Internet上的任何WML页面中。
6. 可能在WML中加入applets吗?
不能。
7. 可以使用HTML开发工具来开发WAP应用吗?
在大多数情况下开发工具是使用基于PC的浏览器。HTML、JavaScript和Java对于WAP开发来说都没有用处。但是,越来越多的开发工具在加入对WML的支持。
Allair的Cold Fusion 4.5 和 HomeSite已经有WML支持,虽然Allair也许需要清除一些BUG。另外PHP和ASP在Coldfusion/HomeSite也能支持。
可以到 Marjolei Katsma的 HomeSite Help site 上得到更多的信息。
8. 可以通过WML页面来操作数据库吗?
可以,与创建HTML页面相同。任何相关的服务器端的技术都可以用来生成WML页面。
9. 可以使用CGI生成WML页面吗?
当然。可以用创建HTML同样的方法来创建WML。如果想书写一个CGI来创建WML,只要记住在页面的开头正确设置MIME类型。具体的形式根据所使用的语言不同而不同。例如在Perl中:
print ("Content-type:application/vnd.wap.wml /n/n/n");
注意至少要使用2个换行。
10. 如何使用Cold Fusion来生成页面?
使用Cold Fusion只需要加上:
<CFCONTENT type="text/vnd.wap.wml">
11. 如何使用PHP来书写动态的WML页面?
PHP(和大多数其他服务端脚本语言一样)可以被用来书写动态的WML内容。只需要将输出的标记限制在WML微型浏览器可接受的范围内。
注意PHP有很多内建的HTML功能,特别是错误功能,这些功能WML微型浏览器可能无法识别。
PHP同样可以在一个HTML文件中编写出既适合于HTML,也适合于WML的内容。PHP的源代码对于客户端来说是不可见的。因此可以针对HTML浏览器输出HTML页面,针对WML浏览器输出WML页面。
可以在开发PHP编写的WML页面的时候把以下代码加在开头:
<?
// header("Content-type: text/vnd.wap.wml");
echo("<?xml version=/"1.0/"?>/n");
echo("<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/"
//"http://www.wapforum.org/DTD/wml_1.1.xml/">/n/n");
?>
基于PC的浏览器将忽略这些无法理解的WML标记。但是如果想在WAP设备或者模拟器上测试的时候,只需要将"//"去掉,页面自动变成WML页面。
12. 使用PHP动态输出WML
这些例子生成一个非常有用的应用叫做:PizzaCalc。它将输入所有的pizza的帐单和人的数目,可以算出每个人的花费。
应用生成一个动态的页面叫做“calc”或者“input”。注意到所有的转义字符例如双引号。该页显示了一个简单的变量处理,和如何传递参数到另外的卡片:
使用WML浏览器就可以测试应用程序:
http://wap.colorline.no/wap-faq/apps/pizzacalc.html。
或者输入:
http://wap.colorline.no/demos.html选择应用。
<?
header("Content-type: text/vnd.wap.wml");
echo("<?xml version=/"1.0/"?>/n");
echo("<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/"
/"http://www.wapforum.org/DTD/wml_1.1.xml/">/n/n");
echo("<!--The application PizzaCalc was originally made by The Crusaders
www.crusaders.no on the Commodore Amiga -->/n");
echo("<!-- It was unfortunately not possible to emulate the crap interger handling of the
original program -->/n");
?>
<wml>
<?
if($action == "calc") {
echo("<card id=/"result/" title=/"PizzaCalc/">/n");
echo("<do type=/"prev/" label=/"Back/">/n");
echo("<go href=/"pizzacalc.html#input/"/>/n");
echo("</do>/n");
echo("<p>/n");
echo("The cost per eater will be ".$total / $eaters."<br/>/n");
}
else {
echo("<card id=/"input/" title=/"PizzaCalc/">/n");
echo("<p>/n");
echo("<anchor>Split Pizza bill
<go href=/"pizzacalc.html?total=/$(total)&eaters=/$(eaters)&action=calc/"/>
</anchor>/n");
echo("<br/>/n");
echo("Total cost: <input type=/"text/" name=/"total/" format=/"*N/"/>/n");
echo("Eaters: <input type=/"text/" name=/"eaters/" format=/"*N/"/>/n");
}
?>
</p>
</card>
</wml>
13. 可以使用Java Servlet来生成WML页面吗?
当然。可以使用创建HTML同样的方法来创建WML。如果想书写一个CGI来创建WML,只要记住在页面的开头正确设置MIME类型:
response.setContentType("text/vnd.wap.wml");
14. 可以使用ASP、Perl等生成动态的应用吗?
是的。可以使用任何服务器端的脚本语言来生成WAP应用。
15. 如何使用ASP书写WML内容?
ASP(Active Server Pages)可以做到和PHP一样,也可以用来书写动态的WML。如果需要一些好的例子请参考Luca Passani's WAP and ASP articles。或者查看Jean-Luc Praz's (jeanluc@corobori.com)。更多的ASP例子在:http://www.corobori.com/wap/。
16. 使用ASP动态输出WML页面时候,已经设置了Content-type,但浏览器返回的仍然是text/html,有什么问题吗?
如果在ASP脚本中有一个错误,那么诊断程序会发还一个HTML页面,请检查脚本。
17. 在使用ASP生成WML页面的时候出现了错误: <MIME type "text/html" is not supported>,会是什么问题?
这个问题是Web浏览器不知道WML的正确类型,修改ASP的第一行,加入:
<Response.ContentType = "text/vnd.wap.wml">
后就可以工作了。
18. 下面的代码有什么问题吗?
<%Response.ContentType = "text/vnd.WAP.WML"%>
<?xml version="1.0"?>
去掉<?xml version="1.0"?>之前的空格。XML解释器希望在这行中没有其他字符,甚至是空行。
19. ASP代码可以在模拟器上工作,在真正的浏览器上怎么不行?
在很多模拟器上没有像真正的WML浏览器那么严格。这些对于那些没有使用网关的模拟器(Nokia SDK/Toolkit)来说更是这样,有些就根本没有使用网关(WinWAP、WapMAN)。
一个真正的WML浏览器应该只读取二进制的数据(从WML编码得来的)WMLC,对于网关应该将文本WML转换/编译成WMLC。语法是非常严格的。ASP是为HTML浏览器设置的,但是HTML没有WML那么严格。
这里在ASP生成动态页面的时候有一个微小的“bug”。它在WML浏览器上不允许有任何地方输出白行(例如:空格,回车,换行)。注意到有些网关可能会修正这些问题,但有的则不管(例如:CMG网关)。
下面是一个常见的ASP代码用来输出WML页面开头的MIME类型:
<%Response.ContentType = "text/vnd.wap.wml"%>
<?xml version="1.0"?>
问题就在ASP将会在 .wml"%> 和 <?xml vers 之间输出换行和回车。这两行就被分割了。这将打乱WML代码的内容。WML必须以“<”开头,而且第一行是<?xml version="1.0"?>。就上面的WML页面回车/换行将会出现问题。
最简单的解决办法是:
<%Response.ContentType = "text/vnd.wap.wml"%><?xml version="1.0"?>
在XML定义正确的格式化以后,后面的部分WML对空格就没有那么严格的要求。
要注意的是有些网关在输出ASP的时候会有问题,因此在WML代码中最好使用 Response.Write 而不是<%=MyVar%>。
20. 如何使用Perl来生成WML内容?
和其他Server端程序一样。Perl也可以用来书写漂亮的WAP应用程序。
最常见的就是如何使用Perl输出正确的MIME类型,下面的例子说明了这一点:
print "Content-type: text/vnd.wap.wml/n/n";
print "<?xml version=/"1.0/"?>/n";
print "<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/"
/"http://www.wapforum.org/DTD/wml_1.1.xml/">/n";
print "<wml>/n";
……
21. 应当如何下手书写WAP应用程序?
其实需要的只是Text编辑器。但是使用一个开发工具可以节约很多时间。
在这之前应该浏览一下WAP的权威站点:www.wapforum.com。
在Nokia WAP 开发论坛中进行注册,并且下载Nokia WAP Developer Toolkit 。Toolkit中的PDF文件可以给出一定的WML和WMLScript指导。Nokia Toolkit需要JRE (Java Runtime Environment) v.1.2.2 或者更高版本。
虽然工具可以用来为WAP设备设计应用,但是不是为专门的移动电话。在WAP开发工具上所看到的并不代表用户在手机上所看到的。为了确定想看到的事情,最好需要一个WAP设备,例如移动电话,或者模拟器。
Nokia WAP SDK 2有一个7110的模拟器。模拟器是一个有效的检测方式,能检测程序中的bug。 Nokia SDK 同样还包括一个小的WAP server让开发者可以从本地或者HTTP服务器上下载WML页面。
到 Phone.com 开发站点注册后,Phone.com 提供UP.browser。这是最流行的浏览器,特别是在美国,Phone.com 提供UP.SDK。 在注册之后就可以下载。
对于Ericsson R320 和 R380是最近的事情。应该注册并查看Ericsson's Developer's Zone 来得到开发工具。R380是一个非常好的模拟器,在 Symbian 不需要注册就可以下载。Ericsson 没有公开的为R320的模拟器。
Motorola 有一个平台叫做 Mobile Internet eXchange 或者 MIX 。Mobile Application Development Kit 已经开发出一个开发平台,即为WAP也为Motorola的 VoxML。在注册后,可以在下面的网址找到数据包。
http://www.motorola.com/MIMS/MSPG/cgi-bin/spn_madk.cgi.
WAPmine 是一个独立的应用,叫做 WAPPage 是一个所见即所得的编辑工具。而且有一个XML树型控件来编辑WML标签。
如果在开发公共应用程序时,想在很多设备上测试你的程序,就像在不同的浏览器上测试HTML页面一样。注意在不同的WML浏览器上的差别,可能比在不同的HTML浏览器上的差别要大。
22. 如何编写和测试WML页面?
现在有很多SDK。AnywhereYouGo.com有WAP SDK和IDE列表,可以下载一个来用。任何文本编辑器都可以书写一个简单的WML页面,当然HTML编辑器也可以(特别是那些支持个人定义标签的),例如:Allaire Homesite (http://www.allaire.com )。可以使用SDK来做简单的测试,但是对于大的项目可能要困难些。AnywhereYouGo.com已经建立一套基于Web的工具来帮助WAP测试。
23. 哪儿可以在找到WML的测试工具?
首先确定WML代码是正确的,然后再使用WML测试工具。
有一个非常好的测试工具在Zygo Communications(http://wap.z-y-g-o.com/tools/),测试工具是用Perl写的。里面还有其他的工具可供下载。
24. 如何操作WML页面?
操作WML页面或者卡片,最简单的办法是通过现有的网关。大多数移动电话提供者将功能都放在主页上,在上面可以通过WAP设备操作。网关的链接一般叫做“Go to URL”。当选择以后,WAP设备将通过网关操作指定的普通IP或者URL。在这种情况下,网关读取从WAP设备发送给网关的WML内容,就像PC浏览器读取内容的过程一样。
有些营运商选择不让他们的用户操作其他的站点。这个就像Internet Service Provider只允许用户操作ISP自己的站点。像这样的做法是不明智的,这样会发现自己的用户去其他地方了。
如果要坚持这种方法,可以通过ISP拨号或者使用一个公共的网关来取得其他的WAP资源。
25. 有没有一个友好的方式来管理WML内容?
还没有。虽然Oracale正在开发数据库驱动的文档服务,被称为Panama,可以支持WAP分发。
26. 如何防止用户代理cache页面?
如果用户使用ASP,应该加入一行<%Response.expires=-1%> ,这个将阻止Cache。
27. 怎样防止从Cache中读取WML页面?
当WML页面下载到WAP设备后,它将保存在WAP设备内存中一段时间,直到这个时间过期。在这之后,页面将从服务器下载,而不是从WAP设备的缓存读取。这个过程被称做Cache。
但是有些时候不想让页面从缓存中读取,而是从服务器端读取。一个典型的例子就是当服务器的内容不断在更新的时候,通过在HTTP头中加入一定的cache信息,来告诉WAP设备该页面将不存储在缓存中。
可以在服务器端生成HTTP头,或者使用PHP、ASP、Perl或者其他服务端开发语言。这一行不能被包括在页面里,既然是HTTP的信息头,就不是WML元素。
对于静态页面,或许没有使用服务器端脚本语言,许多浏览器支持META标签来控制浏览器的Cache。看本部分的最后的例子。
将下面代码加入到HTTP头中,页面将马上过期:
Expires:
Mon, 26 Jul 1997
05:00:00 GMT
Last-Modified: DD. month YYYY HH:MM:SS GMT
Cache-Control: no-cache, must-revalidate
Pragma: no-cache
第一行告诉微型浏览器,页面已经过期一段时间了。第二行告诉浏览器页面最后一次修改的时间。DD应该换成当天的日期,month YY HH MM SS等等类推。第三行和第四行有同样的效果。告诉浏览器页面不被Cache(第三行适用于 HTTP 1.1,第四行适用于HTTP 1.0)。
下面的是PHP的一个例子:
<?
// set the correct MIME type
header("Content-type: text/vnd.wap.wml");
// expires in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
// Last modified, right now
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
// Prevent caching, HTTP/1.1
header("Cache-Control: no-cache, must-revalidate");
// Prevent caching, HTTP/1.0
header("Pragma: no-cache");
?>
下面是使用WebClasses(VB)的例子。使用"Response.Expires=-1",防止Cache。
Private Sub WebClass_Start()
'Set correct MIME type
Response.ContentType = "text/vnd.wap.wml"
'Make sure no caching
Response.Expires = -1
Response.AddHeader "Pragma", "no-cache"
Response.AddHeader "Cache-Control", "no-cache, must-revalidate"
'Use basicwml(my own) as template
Set NextItem = basicwml
End Sub
这里有一个ASP的例子,同样使用“Response.Expires=-1”防止Cache。
<%
Response.ContentType = "text/vnd.wap.wml"
Response.Expires = -1
Response.AddHeader "Pragma", "no-cache"
Response.AddHeader "Cache-Control", "no-cache, must-revalidate"
%>
最后是使用META的例子:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
<meta forua="true" http-equiv="Cache-Control" content="max-age=0"/>
</head>
<card id="alwaysexpire">
<p>This deck will never be stored in the cache</p>
</card>
</wml>
下面的页面是在经过86400秒(24 hours)后过期。
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
<meta forua="true" http-equiv="Cache-Control" content="max-age=86400"/>
</head>
<card id="expire1day">
<p>This card will live in the cache for a day</p>
</card>
</wml>
有些浏览器例如:UP.Simulator如果可以通过“返回”达到另外一个卡片,那么它将不会重新装载卡片。为了强制这个更新动作,用户必须在META标签中使用must-revalidate 参数。
<meta forua="true" http-equiv="Cache-Control" content="must-revalidate"/>
28. 如何防止变量被保存在Cache中?
变量保存在Cache中,这样变量还可以再利用。例如当用户返回到上一个输入卡片,他不需要重新输入,只需要改变需要改变的地方。但是在某些情况下这会造成一些问题。例如以WAP聊天系统,有些变量用了一遍又一遍,但是需要不同的内容。有些浏览器,例如:Nokia 7110,就会存在类似的在该清除的时候无法清除的问题。
在WML中,<card>标签有一个参数叫做newcontext。
当newcontext="true" 时清除所有的变量。但是这样也清除了所有导航的历史记录,这意味着back按钮不再工作。
为了清除变量,可以告诉浏览器将变量设为空:
<setvar name="one_variable" value=""/>
<setvar name="another_variable" value=""/>
但是,不是每个时候都有效果。在某些情况下必须使用一个难以想象的方法来清空变量。就是使用 onenterforward 事件。
<onevent type="onenterforward">
<refresh>
<setvar name="one_variable" value=""/>
<setvar name="another_variable" value=""/>
</refresh>
</onevent>
29. 怎么能够知道请求是从WML浏览器来的还是HTML浏览器来的?
既然要利用已经存在的为HTML浏览器编写的代码,就需要知道请求是从HTML浏览器还是从WML浏览器过来的。同样地,如果想重新引导的HTML浏览器直接到相应的HTML文档上,WML浏览器到WML页面上,以下的PHP代码就可以做到这些。
<?
// Because this script sends out HTTP header information,
// the first characters in the file must be the <? PHP tag.
// relative URL to your HTML file
$htmlredirect = "/html/my_htmlpage.html";
// ABSOLUTE URL to your WML file
$wmlredirect = "http://wap.mysite.com/wml/my_wmldeck.wml";
if(strpos(strtoupper($HTTP_ACCEPT),"VND.WAP.WML") > 0)
{// Check whether the browser/gateway says it accepts WML.
$br = "WML";
}
else {
$browser=substr(trim($HTTP_USER_AGENT),0,4);
if($browser=="Noki" || // Nokia phones and emulators
$browser=="Eric" || // Ericsson WAP phones and emulators
$browser=="WapI" || // Ericsson WapIDE 2.0
$browser=="MC21" || // Ericsson MC218
$browser=="AUR " || // Ericsson R320
$browser=="R380" || // Ericsson R380
$browser=="UP.B" || // UP.Browser
$browser=="WinW" || // WinWAP browser
$browser=="UPG1" || // UP.SDK 4.0
$browser=="upsi" || // another kind of UP.Browser ??
$browser=="QWAP" || // unknown QWAPPER browser
$browser=="Jigs" || // unknown JigSaw browser
$browser=="Java" || // unknown Java based browser
$browser=="Alca" || // unknown Alcatel-BE3 browser (UP based?)
$browser=="MITS" || // unknown Mitsubishi browser
$browser=="MOT-" || // unknown browser (UP based?)
$browser=="My S" || // unknown Ericsson devkit browser ?
$browser=="WAPJ" || // Virtual WAPJAG www.wapjag.de
$browser=="fetc" || // fetchpage.cgi Perl script from www.wapcab.de
$browser=="ALAV" || // yet another unknown UP based browser ?
$browser=="Wapa") // another unknown browser (Web based "Wapalyzer"?)
{
$br = "WML";
}
else {
$br = "HTML";
}
}
if($br == "WML") {
// Force the browser to load the WML file instead
header("302 Moved Temporarily");
header("Location: ".$wmlredirect);
exit;
}
else {
// Force the browser to load the HTML file instead
header("302 Moved Temporarily");
header("Location: ".$htmlredirect);
exit;
}
?>
这个判断是在服务端完成的, PHP代码将首先查看网关是否接收text/vnd.wap.vml MIME类型。如果不是,将检测前面的字符,查看是否为WML浏览器。如果不符合,那么就假设为HTML浏览器。如果有新的WML浏览器,那么ID字符串也要增加。
这个代码基于Robert Whitinger(robert@wapsight.com)的代码,使用了Don Amaro(donamaro.concepcion@nl.unisys.com)提供的列表。
注意:由于只需要四个字符串就可以辨别,因此例如:"WapIDE-SDK/2.0;(R320s(Arial))" 可以使用“WapI”来代替是可行的做法,也是足够的。
同样的功能也可以通过ASP来解决。先判断请求的是“/index.wml” 或者 “/index.html” 和所需要的MIME类型。另外以下的脚本辨别的方式和上面不一样。另外还需要网关告诉服务器它能接收 的text/vnd.wap.wml MIME类型。该例子如下所示:
<%
Response.Buffer = TRUE
Dim IsWap
httpAccept = LCase(Request.ServerVariables("HTTP_ACCEPT"))
if Instr(httpAccept,"wap") then
IsWap=1
Else Response.Redirect "/index.html" : Response.Flush : Response.End
End if
%>
<%Response.ContentType = "text/vnd.wap.wml"%><?xml version="1.0"?>
<%Response.Flush%>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="redirect">
<onevent type="onenterforward">
<go href="/index.wml"/>
</onevent>
<p>
<a href="/index.wml">enter</a>
</p>
</card>
</wml>
<%Response.Flush:Response.End%>
30. 如何判断访问者是来自哪个浏览器或者移动电话?
可以通过检查HTTP_USER_AGENT标签来判断。例如试着使用Microsoft Internet Explorer访问一个站点的时候,HTTP_USER_AGENT将返回:Mozilla/4.0 (compatible;MSIE 5.0; Windows 98);在同样的情况下使用Nokia 7110访问这个站点,HTTP_USER_AGENT就会是:Nokia7110/1.0(04.73)。据此可以判断用户代理是什么类型的。
31. 可以得到用户代理的电话号码吗?
不可以,除非网关支持这个特点,WAP没有办法知道用户的电话号码。
32. 可以通过WML使得可以用WAP设备进行拨号吗?
WAP的电话功能可以使用Wireless Telephony Application Interface(WTAI)。
例如:
WMLScript: WTAPublic.MakeCall("9287787");
但是第一代的WAP设备不支持这个功能。
33. 能够从WAP设备中读取数据吗,例如:电话号码?
这里有一些通过HTTP的信息,但是十分有限。既然只有网关发送过来少量的信息,像WAP设备的号码可能无法读取。同时,在某些国家这还涉及到个人隐私的问题。
基本上丢弃的内容就是WAP网关传送给HTTP服务器的内容。这不同于WAP网关到网关。Phone.com的UP.Link网关是一个最好的例子。因为它在HTTP头中返回一个字符串叫做 UP_X_SUBNO,里面包含了电话号码。Ericsson网关将传送一个辨别设备用的字符串,但是在明文中没有电话号码。
每次WAP设备向HTTP服务器请求一个URL,WAP网关就会将信息传送给HTTP服务器。
以下的PHP脚本显示了从网关过来的所有HTTP头的信息。可以使用WML浏览器进行测试。(http://wap.colorline.no/clientinfo.html)。其他的例子也可以在下面的UTL中找到:http://wap.colorline.no/demos.html
第一个部分是取得所有的标准HTTP头信息。第二个部分是提取一个内容。
<?
header("Content-type: text/vnd.wap.wml");
echo("<?xml version=/"1.0/"?>/n");
echo("<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/"
/"http://www.wapforum.org/DTD/wml_1.1.xml/">/n/n");
echo("<!—Code written in Microsoft NOTEPAD.EXE à /n");
?>
<wml>
<card id="init" title="Client Info">
<p>
<?
// First part – standard HTTP stuff
$headers = getallheaders();
while (list($header, $value) = each($headers)) {
echo strtoupper($header). ": ". $value. "<br/>/n";
}
// Second part
// IP address of the client side
echo("REMOTE_ADDR: ".$REMOTE_ADDR. "<br/>/n");
// Port at the client side
echo("REMOTE_PORT: ".$REMOTE_PORT. "<br/>/n");
// Name of authenticated user
echo("REMOTE_USER: ".$REMOTE_USER. "<br/>/n");
// Gateway Interface type
echo("GATEWAY_INTERFACE: ".$GATEWAY_INTERFACE. "<br/>/n");
// Protocol used by the server
echo("SERVER_PROTOCOL: ".$SERVER_PROTOCOL. "<br/>/n");
// Request Method
echo("REQUEST_METHOD: ".$REQUEST_METHOD. "<br/>/n");
// Connection type
echo("HTTP_CONNECTION: ".$HTTP_CONNECTION. "<br/>/n");
// Host it connected via (proxy)
echo("HTTP_VIA: ".$HTTP_VIA. "<br/>/n");
?>
</p>
</card>
</wml>
Henrik Gemal (gemal@dk.net)也有一个在线的基于WML的工具BrowserSpy,来显示更多关于HTTP头的信息、服务器环境和用户的浏览器等等。有关这个工具的详细情况可以浏览http://wap.gemal.dk/
Werner Forkel 提交了一个Perl的脚本,可以显示电话号码(如果有)。可以在以下位置测试:http://wap.colorline.no/wap-faq/apps/subnotest.wml,同样也收集在:http://wap.colorline.no/demos.html.
这些程序只适合某个网关。如果要测试其他的网关,可能就显示不出电话号码。因此电话号码不能作为ID号来处理。至少因为不是一个全球的标准。
34. 有没有办法连接到电话号码?
在某些情况下,当在显示了一连串的号码之后,需要中断功能连接到一个电话号码上并拨号。例如:执行一个 dial:12345678 就非常像 mailto: 标签。
越来越多的浏览器都支持这个功能,但还不是所有。Phone.com, Mitsubishi 和 Ericsson 已经在浏览器中集成了这个基于Wireless Telephony Interface specifications (WTAI)的功能。 WTAI将允许以下的URL将关闭连接并且拨号:
<go href="wtai://wp/mc;+4712345678">Make a call to +47-12345678</go>
Nokia 7110 已经有个功能叫做“Use Number”。它可以通过WML卡片查找一个类似于电话号码的列表,然后用户可以选择进行呼叫。注意用户必须分离这些数字以便它能正常工作。
35. 使用GET或者POST方式能传送多少字符?
使用GET或者POST方式所能传送的字符数目,不同的设备有不同的限制。一个GET通过UTL传送变量,能传送的数据总量比使用POST方式所能传送的数据要小。例如,Nokia 7110似乎对每个GET 限制在512个字节左右,但是POST最大可以达到一个编译后卡片的大小(约1300字节)。UP.SDK 4.0将GET请求限制在970左右,最大可以达到一个编译后卡片的大小。
显然,卡片有时候保存了要发送给服务器的参数的内容,既然编译后的卡片大小有限制,那么肯定要影响到整个所能传输的数据。
在POST和GET之间没有太多的区别。比如这个没有很好地使用GET的例子。
<input type="text" name="var1" format="*N"/>
<p>
<anchor>Send it
<go href="somescript.cgi?variable=$(var1)" method="get"/>
</anchor>
</p>
下面仍然是一个使用GET的请求,但是使用了<postfield>来传送参数。这个代码就漂亮多了。既然可以定义为GET,同样也很容易转成POST。
<input type="text" name="var1" format="*N"/>
<p>
<anchor>Send it
<go href="somescript.cgi" method="get">
<postfield name="variable" value="$(var1)"/>
</go>
</anchor>
</p>
直接改为POST:
<input type="text" name="var1" format="*N"/>
<p>
<anchor>Send it
<go href="somescript.cgi" method="post">
<postfield name="variable" value="$(var1)"/>
</go>
</anchor>
</p>
最好是做测试找到到底能传输多少数据。这里有个测试程序:
http://wap.colorline.no/wap-faq/apps/putsize.php3。
这个程序也可以在下面的URL中找到:http://wap.colorline.no/demos.html。
该程序将产生一个卡片包含一个变量,里面包含了一定数量的字符X。用户可以选择传输是使用GET还是POST。在传输之后,脚本将要显示接收到的字符个数。
脚本生成一个页面来测试使用GET或者POST方式到底能发送多少个字符:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
<meta forua="true" http-equiv="Cache-Control" content="max-age=0"/>
<meta forua="true" http-equiv="Cache-Control" content="must-revalidate"/>
</head>
<card>
<do type="prev" label="Back">
<go href="putsize.php3"/>
</do>
<p>
<anchor>GET data
<go method="get" href="putsize.php3">
<postfield name=/"a/"
value="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"/>
</go>
</anchor>
</p>
</card>
</wml>
36. 如何同HTML站点一样POST/CGI,返回表单数据到服务器?
如果使用:
<go method="post" href="mycgi.cgi">
并且使用:
<postfield name="fieldname" value="$NameOfInputField"/>
就可以POST数据给CGI程序了。
37. POST无法工作是怎么回事?
有很多说POST参数将会丢失的流言,特别是在Nokia 7110。就笔者所知,还没有哪个Nokia 7110有这样的问题。这个问题主要是存在于网关或接收方。
测试显示Nokia SDK 2.18,当使用内建网关的时候,使用POST会出现问题。甚至当method 设置成“POST”的时候,服务器那边还是将POST请求作为 GET。
当使用POST的URL时 ,Nokia SDK 将会崩溃。在某些情况下URL的最后的字符将被删除。
POST Test页面将简单的POST的两个变量叫做“var1”和“var2”来显示整个变量的内容和HTTP头的内容。如果不能看到正确的变量内容,肯定有问题。检查HTTP头中的application/x-www-form-urlencoded(注意!需要在变量中输入一些内容)。
这个方法解决了Nokia SDK 2.18的问题,可以把它配置到任意的公共网关来测试。笔者推荐使用 wapHQ 网关。
在其他的情况下,POST确实不工作,问题可能是HTTP头在服务器端解释的时候有问题。脚本语言,例如:ASP、Java或是CGI等等都是通过查看在HTTP头中的 application/x-www-form-urlencoded 完全匹配的字符串。在某些情况下字符串可能有附加的数据,例如:charset="utf8" 。既然服务器端不是精确的匹配,它就不会查看HTTP头,因此POST就变量丢失了。
注意这不是浏览器的问题,在HTTP头加入字符集描述,将造成脚本语言方面的错误。
为了检测有关网关或浏览器的问题,仍使用上面的POST Test页面来测试。同样查看application/x-www-form-urlencoded 的输出,检查有没有附加的字符在结尾部分,如果有,那么这就是服务器端的问题。
解决这个问题的方案很复杂,它随用户使用的脚本描述语言不同而不同,而且需要操作原代码。简单地说,解决方案就是需要人工读取HTTP头,不要使用脚本语言已经写好的读取方式。
这里有一个用ASP编写的解决方法。它显示了如何在POST中抓取数据。用户需要从二进制数据中发现需要的变量。
Dim lngToalByteCount
Dim vntRequestData
lngTotalByteCount = Request.TotalBytes
vntRequestData = Request.BinaryRead(lngTotalByteCount)
全部的代码,就应该像下面的代码:
<%@ Language=VBScript %>
<%
Dim Temp, i, sPost, sWMLDeck
'Converts the binary data to a string.
For i = 1 To Request.TotalBytes
Temp = Request.BinaryRead(1)
sPost = sPost & Chr(AscB(Temp))
Next
'Parses out the values of the POSTED variables (in this
'example myvar1 and myvar2).
Dim sVar1, sVar2
sVar1 = getVar("myvar1", sPost)
sVar2 = getVar("myvar2", sPost)
'Writes the WML Deck displaying the POSTED Variables
sWMLDeck = "<?xml version=""1.0""?>" & vbCrLf
sWMLDeck = sWMLDeck & "<!DOCTYPE wml PUBLIC ""-//WAPFORUM//DTD WML 1.1//EN"" "
sWMLDeck = sWMLDeck & """http://www.wapforum.org/DTD/wml_1.1.xml"">" & vbCrLf
sWMLDeck = sWMLDeck & vbCrLf & "<wml>" & vbCrLf & vbTab
sWMLDeck = sWMLDeck & "<card id=""main"" title=""POST TEST"">" & vbCrLf
sWMLDeck = sWMLDeck & vbTab & vbTab & "<p>" & vbCrLf
sWMLDeck = sWMLDeck & vbTab & vbTab & vbTab & "myVar1: " & sVar1 & "<br/>" & vbCrLf
sWMLDeck = sWMLDeck & vbTab & vbTab & vbTab & "myVar2: " & sVar2 & vbCrLf
sWMLDeck = sWMLDeck & vbTab & vbTab & "</p>" & vbCrLf & vbTab
sWMLDeck = sWMLDeck & "</card>" & vbCrLf & ">/wml>"
Response.ContentType = "text/vnd.wap.wml"
Response.Write(sWMLDeck)
'Quick function for picking out the values of the POSTed variables.
'sKey is the variable name, sRaw is the POST string.
Private Function getVar(sKey, sRaw)
Dim sRetVal
If InStr(sRaw, sKey) Then
sRetVal = Mid(sRaw, InStr(sRaw, sKey) + Len(sKey) + 1)
If InStr(sRetVal, "&") Then
sRetVal = Mid(sRetVal, 1, InStr(sRetVal, "&") - 1)
End If
End If
getVar = sRetVal
End Function
%>
38. 为什么META标签不工作?
浏览器不支持默认的meta标签,例如:
<meta http-equiv="refresh" content="1;http://somewhere.com/">
虽然有少量网关支持非常有限的META标记。但是测试显示,如果使用了它们,网关就会出问题。例如某网关不支持普通的HTTP Cache控制,如果要实现Cache控制只好使用特殊的META标记。显然从其他网关来的用户就可能不支持这个META。注意:不要使用META tags。肯定有其他的方式来完成你的想法。
最常使用的META是:
<meta http-equiv="refresh" content="1;http://somewhere.com/">
这个告诉浏览器重新装入指定的WML页面。WML中已经包含了一个<ontimer>。
39. 为什么服务器接收不到用户发送的参数?
用户输入的参数或者其他参数可以像在HTML中一样通过提交方式发送到服务器。在HTML中这个是<FORM>,POST或者GET。
首先知道要知道POST和GET的区别。对于POST浏览器将生成一个数据包将变量名和它们的内容捆绑在一起,并发送到服务器。对于GET,它其实是一个URL请求,变量名和内容都包含在URL中。
对于WAP环境,要求是非常严格的,必须要根据协议来操作。虽然以下的URL
"/cgi-bin/somescript?username=john&telephone=123-123-1234&occupation=banana+bender"
可以在HTML环境中工作,但是在WAP环境中无法工作。以上的部分编码将使得保护的变量内容被误解。特殊的空格(在 banana 和 bender )被转成 “+”。 URL就根本没有空格。
以上的URL在WAP中无法工作的主要原因是用来分割每个变量和变量内容的 & (与号)没有转义。正确的格式应该是:
"/cgi-bin/somescript?username=john&telephone=123-123-1234&occupation=banana+bender"
在这里 & 被名字实体所替换。为了解释更清楚些,请看下面的代码:
<card id="input" title="Gimme some data">
<p><input type="text" name="username" format="M*m"/></p>
<p><input type="text" name="occupation" format="M*m"/></p>
<p>
<anchor>Send this
<go href="/cgi-bin/somescript?username=$(username)
&occupation=$(occupation)"/>
</anchor>
</p>
注意这不是真正的WAP协议,专门的字符应该转义,否则将得到不可预料的结果。
40. 为什么在HTTP中的Referer看不见?
当HTML浏览器从一个URL到另外一个URL的时候,它默认地会发送一个叫做 Referer的 HTTP头给服务器,告诉它在浏览这个页面之前的那个页面。这是一个非常有用的特点,在WAP环境中同样也有。但是既然这个信息来自用户代理(浏览器)、WAP设备,通常为了节约带宽和时间,就被省略了。
为了使用 Referer ,应该使用新的URL标签例如: <a>,<go>等等,并且加入参数:sendreferer。
<go href="/somedir/somedeck.wml" sendreferer="true"/>
这样就会把参考的URL发送到服务器。
41. 如果没有找到URL,有可能重新将用户引导到另外一个WML卡片或者页面吗?
是的。但这是服务器端的特点,与客户端没有关系。
42. 为什么普通的HTTP 302重新导向不好使?
这的确是一个事实。核心的问题是在服务端的脚本语言,而不是在服务端语言和服务器之间。
所谓的302 Found HTTP反应是指服务器告诉用户代理,它所需要的资源在另外的地方可以找到。302反应可能包括一个人们可理解的信息,如果在这种情况下“ Content-type: ”就被设置了。笔者所测试过的服务器,即使没有内容也都加了“Content-type:”。默认的 “Content-type:” 是text/html。当然有些网关不喜欢这个类型。
以下的例子已经经过测试,在Apache和Microsoft Internet Information Server都可以工作。如果使用其他的Web Server,或者其他的脚本语言,需要能转换这些简单的脚本。关键的工作是十分简单的,除非需要,不用告诉服务器整个HTTP头。大多数Web Server将自动完成这个HTTP头,使得用户代理可以理解。
所有的代码例子可以在线测试。如果它们能够工作,用户将被重新引导到http://wap.colorline.no/clientinfo.html ,在那儿将产生一个WML页面来显示所有的HTTP头。
PHP 代码测试可以在 http://wap.colorline.no/wap-faq/apps/302test.php3中找到。
<?
header("Location: http://wap.colorline.no/clientinfo.html");
header("Content-type: text/vnd.wap.wml";
?>
Perl测试代码可以在http://wap.colorline.no/cgi-bin/302test.pl中找到。
print "Location: http://wap.colorline.no/clientinfo.html/n";
print "Content-type: text/vnd.wap.wml/n";
ASP测试代码可以在 http://www.colorline.no/302test.asp中找到。 (注意不同的URL):
<%
Response.Redirect = "http://wap.colorline.no/clientinfo.html";
Response.ContentType = "text/vnd.wap.wml";
Response.Flush
Response.End
%>
43. 可能在WML中实现ASP Session吗?
不可能。可以把信息存储在临时变量中模拟Session。Session是保存在用户PC上的“cookies”中。目前的WAP设备不支持“cookies”。不过下一代的设备和WML可能支持“cookies”。
44. WAP支持Session吗?
在HTML中,一个十分普遍的“处理”用户的方法就是为每个用户分配一个“session”。这个有时候是通过指定一个独一无二的cookies来实现的。然而WAP的资源非常有限,因此session的处理必须以不同的方式来处理。
Alex Kriegel 提供了一个安装在 WAPlinks的Custom Session Object包。这个zip文件中包含了VB类的文件和编译过的Dll文件,还有相关的文档。这些可以在http://www.waplinks.com/customsessionobject.zip下载。
另外一种方法是使用 PHPlib ,它是使用 PHP 编写的。
Tarique (tarique@nagpur.dot.net.in) 提供了如何使用PHPlib来验证和处理每个WAP用户。有相关的文件和注释可以到下面地址下载:
http://wap.colorline.no/wap-faq/archive/phplib_wml.zip
45. 可以在WAP中使用Cookies吗?
在理论上是可以的,但不是所有的WAP设备都支持。另一个方法来管理会话是使用隐藏的fields(包含会话标识,无论是POST或者GET方式)。
46. WAP支持Cookies吗?
普通的HTTP Cookies是作为WAP的扩展来实现的。无论你以前听到什么,Cookies的支持将越来越好。实际上Phone.com的 UP.Link网关已经支持这个功能有一段时间了。
可以使用以下的脚本语言检测Cookie-support,:
http://wap.colorline.no/wap-faq/apps/cookietest.php3
脚本在http://wap.colorline.no/demos.html也可以得到。
当第一次看见卡片的时候,记数器应该为0。所有的Cache都被关闭。卡片通过在URL中随机地加入变量来强制自己加载(笔者不推荐这种强制加载办法)。当点击增加计数连接,页面将重新加载,卡片就再次出现,并且记数器变成1。
在脚本中,Cookie的名字被称做 TestCookie,它有很长的生命期,因此可以隔好几天再来查看记数器,它将是上一次的数值。这要求你能使用与上一次访问所使用的WAP环境一样,否则将把你的数值清0。
如果记数装置一直都是0,那么cookie 就没有能传送到你的Web Server。这个脚本也能表示Cookie是否被传送。
另外,这个脚本同样还显示HTTP头中的HTTP_VIA 和 HTTP_USER_AGENT 。这些能够得到所使用的网关和模式。一些网关使用HTTP_VIS标识自己,而另外一些使用HTTP_USER_AGENT,还有一些则让程序无法知道。
下面是它的PHP代码。一个标准的 PHP setcookie() 函数只有在这种脚本语言中才会出现。函数只是简单地设置cookie,并且PHP变量 $HTTP_COOKIE_VARS 用来读取cookie。
<?
if(isset($HTTP_COOKIE_VARS["TestCookie"]))
{// Check if TestCookie is set
$cookieset = "set";
// Read the Cookie
$cookieid = $HTTP_COOKIE_VARS["TestCookie"];
// and increase its value
$cookieid++;
}
else {
// cookie was not set
$cookieset = "not set";
// start counter at zero
$cookieid = 0;
}
// apply the Cookie to the HTTP header
setcookie("TestCookie",$cookieid);
// set the content type for WML
header("Content-type: text/vnd.wap.wml");
// disable ALL caching
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
echo("<?xml version=/"1.0/"?>/n");
echo("<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/"
/"http://www.wapforum.org/DTD/wml_1.1.xml/">/n/n");
echo("<!-- This application attempts to test the capabilities of a WAP gateway to support cookies -->/n");
echo("<!-- App by Espen.Lyngaas@colorline.no (c) 2000 -->/n");
// Generate random value for reload forcing
$random = mt_rand(100000,999999);
?>
<wml>
<head>
// Even more cache disabling
<meta forua="true" http-equiv="Cache-Control" content="must-revalidate"/>
</head>
<card id="init" title="CookieTest">
<p>
Cookie "TestCookie" was <?echo($cookieset)?>.
Value is currently "<?echo($cookieid)?>"
</p>
<p>
<anchor>
Increase value
<go method="get" href="<?echo($PHP_SELF)?>?random=<?echo($random)?>"/>
</anchor>
</p>
<p>Gateway:
<?
if(isset($HTTP_VIA))
{ // Is there something in the HTTP_VIA variable?
echo($HTTP_VIA);
}
else {
if(isset($HTTP_USER_AGENT))
{ // Is there something in the HTTP_USER_AGENT variable?
echo($HTTP_USER_AGENT);
}
else {
// Absolutely no identifier was found
echo("Unknown");
}
}
?>
</p>
</card>
</wml>
47. 如何使用WAP设备发送E-Mail?
在HTML中有一个默认的E-Mail机制:“ mailto:” 。但在WML中不好使,因此E-Mails必须通过WML表单来解决。例如:
<wml>
<card id="edit" title="Email Editor">
<p>From: <input type="text" name="from" format="*M"/></p>
<p>To: <input type="text" name="to" format="*M"/></p>
<p>Subject: <input type="text" name="subject" format="*M"/></p>
<p>Message body: <input type="text" name="body" format="*M"/></p>
<p>
<anchor>Send this mail
<go method="post" href="http://some.host/mailhandler"?action=send/">
<postfield name="from" value="$(from)"/>
<postfield name="to" value="$(to)"/>
<postfield name="subject" value="$(subject)"/>
<postfield name="body" value="$(body)"/>
</go>
</anchor>
</p>
</card>
</wml>
在代码中的http://some.host/mailhandler是一个CGI程序,它是服务端的脚本程序,将提交的表单转换成E-Mail格式并发送出去。
如果想使用一个类似于发信的过程,就需要编辑变量名。另外发送的数据是有限的,长信息可能需要打断。
为了演示它是如何工作的,下面的 PHP 脚本可以用来处理Mail。它将格式化WML页面,告诉用户是否发出信件。在真实的应用中,应该加入检测,例如:E-Mail的合法格式。
<?
// Tell the client that this is a WML deck
header("Content-type: text/vnd.wap.wml");
echo("<?xml version=/"1.0/"?>/n");
echo("<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/"
/"http://www.wapforum.org/DTD/wml_1.1.xml/">/n");
// The name of your mail server
$mailer = "wap.colorline.no";
// Format the from field
$from = $from." (WAP user at ".$mailer.")";
// Add the from field and some character handling to the extra headers
$extraheaders = $from."/nContent-Type: text/plain;
charset=iso-8859-1/nContent-Transfer-Encoding: 8bit";
// Start sending out the WML deck
echo("<wml>/n");
if(mail($to,$subject,$body,$extraheaders))
{// Use PHP's internal mail functionality
// Mail was successfully sent
echo("<card id=/"sent/" title=/"Mail sent/">/n");
echo("<p>Mail was sent successfully</p>/n");
echo("</card>/n");
}
else {
// The mail could not be sent
echo("<card id=/"notsent/" title=/"Mail failed/">/n");
echo("<p>Unable to send mail</p>/n");
echo("</card>/n");
}
echo("</wml>/n");
?>
因为安全性的原因,以上的代码没有演示程序。
48. 可以在模拟器上操作本地的页面,却没有办法访问Internet上的,有什么问题吗?
大多数模拟器和工具都可以浏览Internet、Intranet和本机的页面。但是在访问一些大公司页面的时候,必须通过代理服务器来取得进入Internet的权限。如果必须通过这个代理服务器来取得HTML页面,那么你的WAP模拟器也会取得权限来访问Internet。
注意到有些模拟器不支持代理服务器,但是大多数是支持的。在模拟器里面设置这些是很简单的。用户所做的只需要将代理主机的名字、IP地址和端口号输入就可以了。如果没有找到,你可以在 systems/network 管理器里面设置这些,也可以检查 Netscape/IE的设置。
在某些情况下,代理服务器使用 userid 和 password 来取得进入Internet的权限。有些模拟器支持用户代理服务器,用户应该能告诉模拟器相关的代理配置。
在极少的情况下,使用代理服务器(如Microsoft Proxy Server,)的用户会遇到更多的问题。这个代理服务器只接受一种验证方式(userid/password)。这种验证被称做 NTLM ,并且是某种 MS 的验证方式。几乎很少有模拟器支持这种方式。因此最好是避免使用它,或者让管理员使用“Basic Authentication”方式以避免更多的麻烦。
49. 什么是PUSHing,它是如何工作的?
PUSH被加入到WAP 1.2,而且只在WAP 1.2中才存在。简单地来说,PUSH提供了另外一种从服务器向用户发送数据的方式。PULLing是从客户端请求信息,然后接收它;PUSH意味着服务器可以向用户发送数据,而不需要用户来请求。
内容或者应用服务器无法向用户代理直接发送数据,必须使用一种叫做Push Proxy 的网关。PPG 是基于Internet的Push Initiator (内容或者应用服务器) 与移动用户之间的。在Internet一边,使用Push Access Protocol,在移动网络一边使用Push Over-the-Air Protocol。
当前只有 WAP 1.2 开发平台支持 PUSH, 例如 Nokia Toolkit 2.0。 Nokia Toolkit 2.0 only 内部支持PUSHing,意味着用户可以从工具包的界面将消息推送到模拟器。如果想试着到一个外部的Push Proxy Gateway, 工具包就崩溃了。从readme文件中知道,PUSHing 还没有经过完整的测试。
50. WAP模拟器说text/html不支持,但是用户的MIME设置是正确的,为什么?
当使用服务端的脚本语言,例如ASP、PHP或者Perl,来生成WML输出,或者从HTTP服务器提供WML页面的时候。记住HTTP一般默认的显示是HTML,其MIME类型是text/html。
如果HTTP服务器或者服务器脚本有错误,错误的信息将使用HTML显示,因此微型浏览器是不能显示错误信息的。
一个开发工具/模拟器可以让用户看到从HTTP服务器过来的代码。例如,在Nokia SDK中,这个功能被称做View Source。通过看代码可以知道HTTP服务器到底发送了些什么内容。也可以使用普通的浏览器来查看任何HTML格式的错误信息。
51. 在哪儿有Visio移动电话的模板库?
目前唯一知道的就是它包含在 Nokia 7110 中。
52. 有没有其他有用的WML内容服务列表?
这里至少有一个。
对于Unix用户, http://pwot.co.uk/wml/中有Thomas Neill (ponder@pwot.co.uk)提供的WML工具,包括WML二进制编译和反编译。
Angus 和 Zygo WAP(angus@z-y-g-o.com)已经开发出了一个Perl工具包。它还在为管道式的WML编译器工作。
53. XML到XSL的转换可以应用到WML和WAP吗?
既然WML实际上是XML,并且XSL将WML转换成其他不同的XML文档,那么问题的答案是显然的:XSL也可以应用到WML。可以参考Luca Passani的文章《WebTechniques》。这个文章在网络上的地址是:
http://www.webtechniques.com/archives/2000/03/passani/
它推荐看一下叫做《在 Apache下Cocoon计划的实现》这篇文章。“Cocoon 是一个依赖于新的W3C技术(例如DOM,XML,和XSL)框架。Cocoon计划在于改变Wen信息创建,生成和提供的方式。文档内容、风格和逻辑经常因为个人或者工作组的不同而不同。 Cocoon目标在于将这三层分离,允许三层次之间进行独立的设计,创建和管理,减少相互之间的影响,增加工作的可复用性以及缩短上市的时间。Web内容的产生大多数是基于HTML的,但是HTML并不能将三者分离开来,混合着各种格式标签,程序逻辑等等。而Cocoon计划将要改变这种情况,允许内容,逻辑和风格相互分离。使用XML来保存,但是使用XSL来将它们混合。”
基本上来说,Cocoon将解读HTTP头,判断使用的是什么浏览器,然后使用不同的风格来选择正确的页面,使用XSL进行混合。
54. 想让用户只要简单地按下一个按钮就能够转跳到其他卡片而不是通过选择URL,这个可能吗?
不,不可能。
55. 如何避免一个行的中断以便可以在一行中输入多个链接?
在Nokia 7110中,不可能做到这一点,每个链接都占据自己的一行。
1. 简单地说什么是WMLScript?
WMLScript是一种在客户端运行的脚本语言。它是基于ECMAScript的。WMLScript和Javascript非常相像,只是在功能上没有Javascript丰富。从更一般的方式来说,它是一个在客户端提供简单的应用程序,而不是一个显示的操作程序。WMLScript是一个经过优化,更利于WAP应用的程序。
2. 可以将WMLScript嵌入到WML页面中吗?
不行。不像将JavaScript嵌入到HTML中,WMLScript必须包含在一个独立的文件中。然后由WML调用。
3. 为什么一些Mitsubishi browsers(Trium)不能运行WMLScript?
Mitsubishi Trium能够运行WMLScript,但是浏览器有一个设置允许关闭WMLScript的运行。像其他的HTML浏览器一样,可以关闭Java或者JavaScript的运行。
当然这里会有一个毛病,即使它不能运行WMLScript,它还能接受WMLScritpt。
4. 在哪儿能学到WMLScript?
WMLScript.com的站点包含很多WMLScript的信息,甚至WMLScript library。
在Phone.com's Developer站点注册之后,可以得到很好的WMLScript版本:http://updev.phone.com/dev/ts/beta/docs/wmlscript/
1. 如何创建WBMP?
RCP分发系统有Adobe Photoshop 5.x 和 PaintShop Pro的插件支持WBMP格式。GINGCO和Teraflops提供转换的工具。
2. 哪种格式的图像可以放送到WAP终端?
WAP标准规定的BMP格式WBMP。WBMP Type 0是一个简单的黑白,非压缩的BMP格式。细节可以参考:
http://www1.wapforum.org/tech/terms.asp?doc=SPEC-WAESpec-19990524.pdf
如果某个WAP设备可以支持任何图像格式,那么WBMP Type 0是最小的要求。
3. 有GIF/JPEG 到WBMP的转换器吗?
有。在http://www.imagemagick.org。在http://www.rcp.co.uk同样有一个 Adobe photoshop 的插件。
4. 有没有实时转换GIF到WBMP的工具?
可以试试:
NetPBM:ftp://wuarchive.wustl.edu/graphics/graphics/packages/NetPBM/
PBMtoWBMP:http://www.looplab.com/WAP/tools/
5. 可以在WAP页面中混合声音和文本吗?
不。很长一段时间内不会。这是因为电话的内存有限。但是你可以试一试 Palm 或者 Windows CE 的手持设备。
6. 有一个WBMP图片在Nokia Toolkit上能正常运行,但是在Nokia 7110上却不能是为什么?
检查一下WML代码。确定IMG标签没有高度和宽度属性,这通常导致错误。另外一个原因是图像可能太大,造成当前的页面超过1400字节。
7. 当使用WBMP作为超链接等时,在7110模拟器上不工作,为什么?
7110不支持图像作为链接。
8. WAP设备可以使用图形而不是文本吗?
WAP协议允许使用一种叫做WBMP的图形标准,它是一个位(黑或者白)的BMP版本。因此,所有的图形,为了适合这个协议,必须转换成WBMP。
在使用WBMP的时候当然有很多限制,图像的大小不能超过150 x 150 像素。这是因为WAP设备的屏幕都非常有限。例如Nokia 7110 屏幕是96像素宽,65像素高。因此 150 x 150 像素看起来就特别大,占据了整个屏幕。另外受WAP电话的内存限制,图像的大小不能超过 1461 字节。
因为不是所有的WAP设备都能显示图像。因此,<img>中的“alt”必须使用,这样才能适用于那些不能显示图像的WAP设备。
“WAP Tiger”是一个非常简单的命令行BMP转换工具,可以去http://wap.infotiger.de/download.html下载。有 MS-DOS/Windows 和 Linux 版本。
可以在http://www.rcp.co.uk/distributed/Downloads找到免费的Photoshop/Paint Shop Pro插件。
Macromedia 有一个为 Fireworks的外接插件可以让用户输出WBMPs。PC版本在:
http://download.macromedia.com/pub/fireworks/xtras/wbmp_im_ex.exe
Mac 版本在:
http://download.macromedia.com/pub/fireworks/xtras/wbmp_im_ex.hqx
WebCab.de有一个非常漂亮的在线WBMP编辑器:
http://webcab.de/woe.htm
它能让你通过手工草稿生成、上传并编辑WBMP。如果只有服务器端的脚本语言程序,但是无法产生动态的WBMP,这是唯一的选择。
在http://www.gingco.de/wap/有一个免费的PIC2WBMP “独立”转换器。但是这个应用需要Java 运行环境。因此如果是个新手的话,最好是下载Paint Shop Pro 插件和最新的 Paint Shop Pro,网址是:
http://www.jasc.com/download.html
Paint Shop Pro 对于没有注册的用户来说是有时间限制的SW。注册费用是 $99 USD 。
Surerange Analysis Ltd 有一个免费的产品叫做ImageConvert Developer。它是一个单线程的ActiveX控件,可以将GIF和JPEG转换成WBMP。它同样有一个VC6的例子来说明如何使用。
Applepie Solutions 提供一个在线的,基于WEB的GIF到WBMP的转换:
http://www.applepiesolutions.com/image2.wbmp/
如果指定用户想转换的文件的URL地址,它将让用户下载转换后的文件。
在某些情况下用户想在HTML文档中显示WBMP。为了达到这个目的,Andre de Leiradella (leiradella@writeme.com) 已经写了一个Java和C程序来从WBMP输出GIF,看起来就好像一个小的LCD显示器。C版本可以作为CGI。应用程序可以到下面的位置找到:
http://members.xoom.com/leiradel/。
9. 如何实现动画?
WBMP图像不同于在HTML中广泛使用的GIF格式。它不支持动画。但是还是可以使用WML的 <ontimer> 标签来创建一个。请注意这种方式不是能达到想象中效果的。
通过研究Animated Images Demo可以有这方面的一点概念。其网址为:
http://wap.colorline.no/demos.html
或者到:
http://wap.colorline.no/wap-faq/apps/anim.html
当在执行这样的动画方式的时候,要记住微型浏览器的内存是有限制的。不可能将所有的图片都装入到内存中。浏览器也不会装入那些过大的图片,因此某些动画可能在装入的时候就中断了。
演示程序:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN/"
"http://www.wapforum.org/DTD/wml_1.1.xml">
<!-- Code written in Microsoft NOTEPAD.EXE. (c) Espen Lyngaas 2000 Color Line ASA -->
<wml>
<card id="image1" ontimer="#image2">
<timer value="10"/>
<p>
<img src="anim1.wbmp" alt="Anim1"/>
</p>
</card>
<card id="image2" ontimer="#image3">
<timer value="10"/>
<p>
<img src="anim2.wbmp" alt="Anim2"/>
</p>
</card>
<card id="image3" ontimer="#image4">
<timer value="10"/>
<p>
<img src="anim3.wbmp" alt="Anim3"/>
</p>
</card>
<card id="image4" ontimer="#end">
<timer value="10"/>
<p>
<img src="anim4.wbmp" alt="Anim4"/>
</p>
</card>
<card id="end" title="The End">
<p>
This is the end of the animation, but you can
<anchor>run it again.
<go href="#image1">
</go>
</anchor>
</p>
</card>
</wml>
如果使用PHP,可以看看更简单的程序:
<?
header("Content-type: text/vnd.wap.wml");
echo("<?xml version=/"1.0/"?>/n");
echo("<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/"
/"http://www.wapforum.org/DTD/wml_1.1.xml/">/n/n");
echo("<!-- Code written in Microsoft NOTEPAD.EXE. (c) Espen Lyngaas 1999 Color Line ASA -->/n");
?>
<wml>
<?
for($card=1;$card<5;$card++) {
echo("<card id=/"image".$card."/" ontimer=/"#image".$card+1.">"/n");
echo("<timer value=/"10/"/>/n");
echo("<p>/n");
echo("<img src=/"anim".$card.".wbmp/" alt=/"Anim".$card."/"/>/n");
echo("</p>/n");
echo("</card>/n");
}
?>
<card id="image5" title="The End">
<p>
This is the end of the animation, but you can
<anchor>run it again.
<go href="#image1">
</go>
</anchor>
</p>
</card>
</wml>
10. 如果WBMP图片看起来糟糕极了,该怎么办?
WBMP只有两种颜色,要是图片漂亮需要一定的技巧。但是可以减少图片的颜色。这里有一个叫做Floyd-Steinberg的方法可以做到。这样的一个程序是Jasc Paint Shop Pro。Paint Shop Pro的价格不是很贵,而且有直接保存为WBMP的插件。还可以使用30天免费版本。
11. 能够生成动态的WBMP图像吗?
当然。可以使用PHP、ASP 或者 Perl 来完成。这可能需要一种图像转换工具,因为服务端的脚本语言不支持WBMP的转换。
下面有一个PHP 的例子来说明使用脚本语言来完成的过程。
因为当前版本的GD不再创建GIF图像,而是称作PNG (Portable Network Graphics)图像。所以使用当前版本的PHP,只需要修改少量的代码就可以将GIF 转换到 PNG。另外,可以用“DuPont’s Image Magick ”将PNG 或者转换成 WBMP,它能在两者之间相互转换,并适合于多种平台。
在代码里,笔者用到了PHP功能 ImageCreateFromGif(),要输一些文本到GIF图像上,可以使用PHP的 ImageGreate()创建一个空白的 GIF/PNG 图像。
以下是代码:
<?
// hardcoded "variables" are safer!
// path to blank GIF file – not really needed (see above)
$blank = "./wapclock_blank.gif";
// You can look at it here
// path to input file generated by PHP
$input = "/tmp/wapclock.gif";
// path to temporary output file. Extension is irrelevant
$output = "/tmp/wapclock.out";
// path to ImageMagick convert
$convert = "/usr/local/bin/convert";
if($format == "gif") {
// if it’s GIF, send that Content-type
header("Content-type: image/gif");
$type = "GIF";
}
else {
if($format == "wbmp") {
// if it’s WBMP, send that Content-type
header("Content-type: image/vnd.wap.wbmp");
$type = "WBMP";
}
else {
// hope that the browser can read this
header("Content-type: text/plain");
// or someone forgot to set the format variable
$type = "";
}
}
// turn off caching
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
// create a GIF file from an empty GIF file (see faq)
$im = imagecreatefromgif($blank);
// put the current time into the time variable
$time = date("H:m:s");
// Place time variable sort of in the middle, with font size 4
imagestring($im,4,6,15,$time,0);
// generate a GIF file with PHP (see faq)
ImageGif($im,$input);
// empty the GD temporary buffer
ImageDestroy($im);
if(strlen($type) > 0) {
// if the type is known
// do the conversion
exec($convert. " ".$input. " ".$type. ":".$output);
}
else {
// or do nothing
echo("Unknown format!/n");
// and stop
exit;
}
// open the converted file
$fd = fopen($output, "r");
// read verything into a variable
$contents = fread($fd,filesize($output));
// close the file
fclose($fd);
// pour out the contents
echo($contents);
?>
以上的代码是输出GIF的WBMP数据流。为了使用真正的图像,必须像下面这么写:
<?
header("Content-type: text/vnd.wap.wml");
echo("<?xml version=/"1.0/"?>/n");
echo("<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/"
/"http://www.wapforum.org/DTD/wml_1.1.xml/">/n/n");
echo("<!—Code written in Microsoft NOTEPAD.EXE. (c) Espen Lyngaas 2000 Color Line ASA à /n");
?>
<wml>
<card id="wapclock" title="WAP Clock">
<do type="prev" label="Reload Image">
<go href="<?echo($PHP_SELF)?> "/>
</do>
<p>
<img src="http://wap.colorline.no/wap-faq/apps/gfxclock.html?format=wbmp"
alt="You should see an image…"/>
</p>
</card>
</wml>
12. 针对多大的屏幕进行开发?
WAP设备的显示状况千差万别,有些支持图形,有些只支持文本。下面给出一些型号的屏幕尺寸:Mitsubishi 还没有公布的WAP电话有3行12个字符的显示器。Nokia 7110 的屏幕是96个像素宽,65个像素高,最大的显示图像是95个像素宽,45的像素高,高和宽的比例大约是1.25。因此一个正方型应该是一个实际宽高比为1:1.25的长方形,对于圆来说也是一样。
Ericsson's R320 有一个类似大小的显示屏幕。精确的大小是101像素宽,52像素高。可以显示4行文本,而且自动换行是默认的方式。
Ed Chew(Ed.Chew@scoot.co.uk) 检验过 “R380 Design Guideline for WAP Services”, 并且发现在Ericsson R380 有 360x120 像素的分辨率 (83x28mm), 0.23点距,浏览区域是限制在310(宽),100(高) pixels ,包括顶部的两个像素的空格,左边和右边的三个像素的空格,因此实际上只有304 x 98 像素。
为了弄清显示器到底有多大的大小,在http://wap.colorline.no/demos.html (选择 “Resolution matrix”)有一个分辨矩阵的演示程序。 页面将显示三个不同大小的图像,一个垂直和一个水平,它们是一个方向上十个像素,另外一个方向上只有一个像素,这样你马上就能知道屏幕到底有多大。另外他们的大小是:80x80,100x100 和 120x120像素,因为有些浏览器不能装载那些过大的图片。
由于有些显示器的点是长方形的,而不是正方形的,所以开发人员需要重新影射图像,让他们看起来像正方形,圆看起来像圆。但笔者不推荐这个方法,除非你知道用户所使用的WAP设备的真正比例。一个在7110上看起来很好的图到了R380上会很糟糕。
13. 在WML中可以预先装入图片吗?
在HTML中,图片可以先使用简单的JavaScript来装入。但是在WML或者WMLScript中没有这样的方法。
Paul St.
George(email@paulstgeorge.com)提供了一种欺骗浏览器,让它装入图片但不显示的办法。对于图片,如果足够小,可以事先读入到WAP的Cache中。如果所有的图像都能够装入的话,就不需要连接到服务器上了。
首先需要一个能够撑满屏幕的透明图片,因此它们是一个像素宽,并且和显示屏幕具有相同的高度。将图片做成透明的,这样它将占据整个屏幕,然后装载剩下的图片,等图片装载完后timer启动,开始动画。
在下面的例子中,可能需要改变一下timer的数值,让它有时间来装入图片。
<wml>
<card id="p" ontimer="#f1">
<!-- Adjust this timer to taste. -->
<timer value="10"/>
<p align="center">
<img src="spacer1.wbmp" alt="x"/>
</p>
<p>
<img src="1.wbmp" alt="1"/>
</p>
<p>
<img src="2.wbmp" alt="2"/>
</p>
<p>
<img src="3.wbmp" alt="3"/>
</p>
<p>
<img src="4.wbmp" alt="4"/>
</p>
<p>
<img src="5.wbmp" alt="5"/>
</p>
</card>
<card id="f1" ontimer="#f2">
<timer value="10"/>
<p align="center">
<img src="spacer15.wbmp" alt="x"/>
</p>
<p align="center">
<img src="1.wbmp" alt="1"/>
</p>
</card>
<card id="f2" ontimer="#f3">
<timer value="10"/>
<p align="center">
<img src="spacer10.wbmp" alt="x"/>
</p>
<p align="center">
<img src="2.wbmp" alt="2"/>
</p>
</card>
<card id="f3" ontimer="#f4">
<timer value="10"/>
<p align="center">
<img src="spacer08.wbmp" alt="x"/>
</p>
<p align="center">
<img src="3.wbmp" alt="3"/>
</p>
</card>
<card id="f4" ontimer="#f5">
<timer value="10"/>
<p align="center">
<img src="4.wbmp" alt="4"/>
</p>
</card>
<card id="f5" ontimer="#f1">
<timer value="10"/>
<p align="center">
<img src="5.wbmp" alt="5"/>
</p>
</card>
</wml>
14. 为什么有些WBMP无法显示?
图像可以使用<img>标签来指示。大多数无法显示的情况是因为错误地使用了<img>语法。这个标记至少要有src和alt两个参数。其他参数是可选的。src指定图像的来源,alt指定当图像不能显示的时候显示的内容,并且在最后有反斜杠结尾。
<img src="path/filename.wbmp" alt="Alternative Text"/>
如果页面是由HTTP服务器提供的,服务器也必须设置WBMP正确的MIME类型。正确的类型是“image/vnd.wap.wbmp”。
问题也可能出在图像本身,因为WBMP的格式非常有限,只有黑白两色,而且大小要适合WAP设备。有些WAP开发工具让允许使用GIF图片,但是WAP设备只支持WBMP图片。
1. 什么是WAP网关?
WAP网关是一个软件。它连接Internet或者Intranet,使得WAP电话可以来访问其中的资源。有些网关可能具有将HTML文件转换为WML页面的功能。
WAP网关在WAP设备与Web服务器之间的连接中有好多功能。这些功能基本上是:
将标记语言(WML)从文本转换成可以被WAP设备读懂的编码(二进制/压缩的)格式;
将WAP设备的请求转换成Web中的HTTP请求;
在Web和WAP之间实现SSL加密和WTLS加密的转换;
在Web和WAP之间的传输层之间实现TCP和WDP的转换。
网关还具有一些其他可选的功能,例如将Text文件,HTML文件转换成可读的WAP格式。如果网关安装在移动营运商一边,移动营运商可能利用网关加入一些特殊的信息到HTTP流中,例如电话号码,位置信息等等。
有些WAP网关是在Internet上公开的,但是另外一些是在移动营运商那边,并且经常限制只接受从营运商那边的WAP设备。
少数网关,或者像网关的设备 (“WAP Servers”)在内容提供商那边,这些人拥有WAP内容服务器。
2. 什么是WAP Server?
除了集成的WAP Gateway ,WAP Server不比普通的Web Server多太多。笔者个人认为“WAP server”这个概念非常混淆。许多人认为必须有一个WAP Server才能提供WAP的内容,但是这不正确。WAP内容可以由任何普通的Web Server提供。
那么WAP Server的要点是什么呢?当讨论到WAP的安全性的时候,WAP Server可以减少WAP环境中的安全漏洞。
既然WAP Server包含一个网关,因此可以跳过安装在移动营运商那边的第三方网关,并且主机上的应用程序对加密数据流有完全的控制能力。
注意如果要让用户能够访问网关,就需要正确的配置他们的WAP设备,大多数情况下是手工配置。
3. 在哪儿可以得到WAP网关?
Nokia的网关可以在http://www.nokia.com/corporate/wap得到。
4. WAP网关是一个像Server那样的物理设备吗?它是在Internet提供商还是移动提供商那边?
WAP Gateway是一个 WinNT或者 Linux机器上运行的WAP Server软件。它可以在Internet上的任何位置,既可以在Internet提供商那边,也可以在移动提供商那边,还可以在用户的PC机上。
5. 安装Nokia WAP Toolkit后如何设置网关,拨号等等,以便可以使用用户的主页?
启动Nokia WAP Toolkit,找到 Menu>Toolkit>Preferences。 选择“Use WAP gateway”选项,给出WAP网关所在的地址(127.0.0.1, 如果在本机运行网关程序)。用户可以从Menu>Go>Load中指定URL。
6. 哪个公司提供WAP Server的源代码?
open source gateway 在 http://www.kannel.org/中提供。
7. 可以在广域网络中使用网关吗?
只要能通过拨号访问到网关的IP地址,在哪儿都是一样。
8. 在哪里能找到有关网关的资料?
在很多情况下用户可能想使用多个网关来测试应用程序。因为他们以不同的方式工作。所以可能需要连接到其他的网关,而不仅仅使用由移动营运商提供的网关。
WAPdrive.net 有一个个非常好的公共网关列表:
http://www.wapdrive.net/DOCS/wap_gateways.htm
这里面有一些没有公布的网关。如果IP地址以“10.”开头,那么网关就是私有的,是营运商自己的。其他IP地址的网关,也不一定就是公共网关。
9. 为什么HTTP User_Agent字符串在Phone.com的网关中有所不同?
如果查看从Phone.com的UP.Link网关发送给服务器的HTTP头,将发现User_Agent有所不同。UP.Link网关将名字和版本名称写在这里面。
如果用户来自Nokia或者爱立信的网关,那么User_Agent就像下面的:
EricssonR320/R1A
如果用户来自UP.Link网关,就如同下面的:
EricssonR320/R1A UP.Link/4.1.0.1
它们清楚地显示了网关的类型和版本。从这里可以清楚的知道用户所使用的网关类型和版本。
1. 什么是微型浏览器?
类似于PC上的Internet Explorer 或者 Netscape interpret HTML。WAP微型浏览器的地位等价于一个在手持设备上运行并解释WML的软件。
2. 在移动电话上,WML最大可以是多少?
这个根据不同电话而不同。只要保持编译后的页面不要超过1400字节就可以了。
3. WAP客户端上运行的是什么操作系统?
只要客户端有WML微型浏览器,任何操作系统都可以。目标设备可以使用Windows CE、EPOC、PalmOS或者其他合适的操作系统。
4. WAP用户代理可以Cache页面吗?
Nokia 7110可以Cache页面。Cache的大小在40k左右。
5. 哪儿有更新的代理列表资源?
如何测试浏览器的方法在以上的文章中有讲述。因此现在是需要一个很大的代理列表。这个列表将帮助检测浏览器的类型。
这个文件是使用逗号分隔(Comma Separated Values)的格式。第一行是浏览器的名字,第二行是浏览器的描述。
User Agent ID 在 http://wap.colorline.no/wap-faq/useragents.php3 (注意这个文件是一个简单的ASCII文件,虽然它是以.PHP3结尾。)
这个文件可以随便拷贝。
6. 能不能通过浏览器语言的选择来本地化文本?
作为任何一个好的HTML浏览器,应该可以阅读由WAP设备配置的语言而不依赖于Web服务器向它发送了什么样的HTTP头。许多设备都这样。
HTTP头中有一个Accept-Language ,可以包含多种语言,使用逗号分开。每个标识有两个基于ISO-639的字符代码。例如en 代表English,no 代表 Norwegian等等。想了解更多关于 Accept-Language 请参考 HTTP 1.1 Reference,section 14.4。所有的语言代码可以查阅ISO-639。
下面的PHP代码显示了如何读取Accept-Language 头,并选择语言。这段代码很容易就能转成其他代码,其基本原理就是读取Accept-Language 中的前两个字符,然后依据这两个字符选择语言。
<wml>
<card id="loc" title="Localized Text">
<p>
<?
switch(substr($HTTP_ACCEPT_LANGUAGE,0,2)) {
case "en":
echo("Your WAP device is configured for English language");
break;
case "no":
echo("Din WAP-dings er konfigurert for Norsk spr錵");
break;
case "sv":
echo("Din WAP-sak 鋜 konfigurerad f鰎 Svensk spr錵");
break;
default:
echo("I have no idea what language your WAP device is using..");
}
?>
</p>
</card>
</wml>
7. 每个WAP设备的浏览器的功能和限制是怎么样的?
所有的设备都应该遵循WAP协议,当前是WAP 1.1和WAP 1.2,但是真实的世界不是那么简单。随着WAP的进化,WAP设备开发者将尝试推动WAP协议的封版。这就让开发者的生活更加有意思,但是同样也保证了技术快速的发展。
许多设备都无法完全遵循协议,虽然在许多情况下这种差别不是很大。同样有些设备还增加了一些WAP开发者需要的特别功能。
有关协议的最好资源是在 AnyWhereYouGo。你会发现它有关于WAP设备的列表非常有用。如果用户发现某些特殊的设备,也请将数据加入到 AnyWhereYouGo 的数据库当中。
8. 不同的的电话应该使用哪个UP.browser版本?
Phone.com Developer站点有这样一个列表 。但是必须注册后才能得到这个列表。
9. 在哪儿可以下载Microsoft的Mobile Explorer?
现在知道的只有Benefon Q和Sony CMD-Z5使用 Microsoft Mobile Explorer。但是在Sony的站点只有一个简单的Flash。Benefon 的支持要好的多,可以去他们的开发区看看。
Microsoft Mobile Explorer 可以在注册之后下载。
10. Microsoft Mobile Explorer有什么特别的地方?
Microsoft Mobile Explorer或者MME是一种双模式的浏览器,他可以接受HTML和WML代码。这就产生了一个新的问题:当内容既可以使用HTML也可以使用WML的时候,如何选择呢?其实这个已经不是新问题,像Opera浏览器基本上是一个HTML浏览器但是支持WML。但是MME没有将数据类型使用正确的顺序。例如HTML比WML优先。如果浏览器检测代码是没有问题的,就应该没有问题。
经过对MME模拟器长时间的测试,笔者发现每个人都在使用错误的浏览器检测代码。许多看起来可信的事实:“Mozilla”意味着是HTML浏览器,例如:Netscape或者Internet Explore。其实有很多HTML浏览器不使用“Mozilla”来表示。相反它们询问浏览器可接受的数据类型。另外MME模拟器不支持文本的WML,只支持编译后的WML(WMLC),它需要一个(象其他的WAP设备)网关来将WML转换成WMLC。
MME同样支持JPEG和GIF格式和WBMP。另外,MME发送HTTP头中有一个 HTTP-DISPLAY-AREA 来告诉内容提供服务器的屏幕大小。
MME通过User Agent来表示自己为Mozilla/1.22兼容的设备。完整的MME模拟器字符串是:Mozilla/1.22 (compatible;MMEF20;CellPhone)。
当使用MME模拟器,记住它有两种工作模式。它直接告诉内容服务器,要么接收HTML,要么接收编码的WMLC。如果想直接使用文本WML,用户必须告诉MME网关的位置。在这个模式下所有的WAP请求通过WAP网关来处理,然后MME才能接收文本WML。
11. 能不能在浏览器中改变字体?
在很多情况下是不行的。许多浏览器支持标签来改变字体的为黑体、斜体或者大小。但是字体的类型是不会改变的。到现在还没有看到这样的浏览器出现,也没有这样的WML标签出现。
但是Morpheme却做到了一种在线的办法来改变字体,叫做 “Dwbmp” ,这实际上是使用文本书写的方式来制作和使用WBMP图片。这个工具是免费的,现在它支持六种不同的字体。
另外只有少数的设备支持图像anchors(例如:Nokia 7110),因此不能使得WBMP像文本一样可以链接。
对于那些使用 PHP 或者其他服务器端脚本语言的可以使用GD来支持,将TrueType字体甚至是Postscript转换成WBMP。
1. 怎样配置手机才能浏览到Internet?
一般来说您可以先参考手机的使用说明书来进行配置。在手机配置当中有几种典型的WAP手机配置的详细说明。
2. 市场上有哪些WAP手机?
目前有Nokia 7110,Ericsson R320,Motorolar L2000www等等。随着时间的推移会有大量的新款WAP手机推出。一般来说大屏幕,高分辨率并且具有中文显示和输入的WAP手机在浏览WML网页的时候效果比较好。
3. 是不是所有的手机都能执行WAP1.1的标准,还是各有各的特性?
所有的WAP手机应当支持WAP 1.1,但是有些手机有自己不在WAP协议之内的特点。
4. 国内有这样的手机卖了吗?
国内市场上已经有很多种WAP手机。但是国内还没有生产WAP手机。
5. 这样的手机大概需要多少钱?
这样的一部手机一般在2000元左右。为了使更多的人加入到WAP中来,以后手机还要降价。
6. 若WAP手机要上网,需要申请那些服务?
如果要用WAP手机上网,首先必需开通一般的通话服务、短消息服务、数据服务。当以上服务都申请好后,再进行上网设置密码。
7. 如何使用WAP服务?
首先,必须要有WAP手机,如Nokia 7110、Ericsson R320等型号;其次,必须向电信业者申请WAP服务。(目前国内开户费200元,月租50元)。
8. 如何在Nokia 7110里面输入URL?
“/”符号可以通过按“*”,其他符号可以滚动到与其配的符号找到。
9. 在哪儿可以得到现有的WAP支持设备?
AnywhereYouGo.com 有一个完整的WAP设备列表。
http://www.anywhereyougo.com/wap/devices/Index.po
10. 在购买WAP手机之前应当考虑哪些问题?
在考虑购买WAP手机之前应该考虑以下问题:在现在的市场上只有几种类型,例如:流行的Nokia 7110和Ericsson R320;既然WAP是新技术,其产品肯定还不是很成熟(可能会有Bug);电话不可能支持所有的WAP 1.1功能;WTA功能目前还不支持。
11. 浏览WAP站点的时候还能接收或者拨打电话吗?
当然。数据和声音使用不同的线,并且你在浏览的时候无须担心来电。对于拨号,请检查7110的“User Number”功能。
12. 移动电话上网时是按照时间收费还是按照流量收费?
这要看移动电话基于CSD还是SMS信道。使用SMS信道,只需要为传输的数据付费,如果你使用的是CSD信道,则需要按照时间付费。
13. 为什么需要指定拨号号码和WAP网关?
电话号码是拨号到ISP上所使用的电话号码,IP地址是指定网关。如果没有指定网关,WAP设备将无法连接到Internet网络。
14. 可以通过改变7110的设置来发送SMS短消息吗?
可以。可以通过设置一个叫做OTA (Over The Air)来发送SMS 短消息。
15. Nokia 7110的上下文Cache是多大?
大约是40 k。
16. Nokia 7110的操作系统可以升级到v04.77吗?
是的。7110的系统可以升级,但只能在Nokia的服务点做到。这可能删除你现有的电话本。
17. 无法在7110上显示表格数据什么问题?
Nokia 7110不支持多列的表格,因此你要把任何表格转换成单列的表格。
18. 有没有一个WAP电话和设备的列表?
注意这里的列表是目前的状态。里面有些信息不一定正确。
AnyWhereYouGo 有一个很好的WAP设备列表(见表10-9),包括phones和 PDAs。(许多信息都直接来自制造商)
表10-9 WAP设备列表
Alcatel One Touch View db WAP | Phone |
|
http://www.alcatel.com/consumer/mobilephone/view_dbwap.htm | ||
Alcatel One Touch 30x Series | Phone | 预计2000年9月 |
http://www.alcatel.com/consumer/mobilephone/ | ||
Alcatel One Touch 50x Series | Phone | 预计在2000年10月 |
http://www.alcatel.com/consumer/mobilephone/ | ||
Alcatel One Touch 70x Series | Phone | 预计在2000年11月 |
http://www.alcatel.com/consumer/mobilephone/ | ||
Alcatel Onetouch View | Phone |
|
http://www.alcatel.com/telecom/mbd/products/products/detailed/gsm/ot_view/index.htm | ||
Siemens S35i | Phone |
|
http://www.siemens.com/mysiemens/english/mobile/index.html | ||
Siemens M35i | Phone |
|
http://www.siemens.com/mysiemens/english/mobile/index.html | ||
Siemens C35i | Phone |
|
http://www.siemens.com/mysiemens/english/mobile/index.html | ||
Siemens S25 | Phone | 只支持HDML |
http://www.siemens.se/telefoner/mobiltelefoner/s25/ | ||
Sony CMD-Z5 | Phone | 支持WML和HTML |
http://www.sony-europe.com/com/z5/index.html | ||
Nokia 7110 | Phone |
|
http://www.nokia.com/phones/7110/index.html | ||
Nokia 6210 | Phone |
|
http://www.nokia.com/phones/6210/index.html | ||
Nokia 6250 | Phone | 还没有投放市场 |
http://www.nokia.com/phones/6250/index.html | ||
Nokia 6185 | Phone | 只在美国市场上有 |
http://www.nokiausa.com/beauty/1,1002,28,FF.html | ||
Motorola Leap P7389 | Phone |
|
http://www.motorola.com | ||
Motorola Timeport | Phone |
|
http://www.motorola.com | ||
Motorola Talkabout | Phone |
|
http://www.motorola.com | ||
Motorola i1000plus | Phone | 只适用于iDEN |
http://www.motorola.com | ||
Motorola i500plus | Phone | 只适用于iDEN |
http://www.motorola.com | ||
Ericsson MC218 | Palmtop |
|
http://www.ericsson.se/WAP/products/mc_218.shtml | ||
Ericsson R380 | Phone |
|
http://www.ericsson.se/WAP/products/r380.shtml | ||
Ericsson R320 | Phone |
|
http://www.ericsson.se/pressroom/r320a.html | ||
3Com Palm Pilot | Palmtop | 需要浏览器软件 |
http://www.palmpilot.com/ | ||
Neopoint 1000 | Phone |
|
http://www.neopoint.com/products/index.asp | ||
Neopoint 1600 | Phone |
|
http://www.neopoint.com/products1600/index.asp | ||
Sagem MC850 | Phone | 还没有投放市场 |
http://www.phone.com/news/Archive1999/031899_SAGEM.html | ||
Samsung Duette SH-P10 | Phone | 只适用于CDMA |
http://www.phone.com/solutions/alliances/samsung.html | ||
Samsung SGH-800 | Phone | 还没有上市 |
http://www.phone.com/solutions/alliances/samsung.html | ||
Mitsubishi T250 | Phone | 只适用于CDMA |
http://www.mobileaccessphone.com/products/index.htm | ||
Compaq Aero | PDA | WindowsCE WAP1.1 微型浏览器 |
http://www.compaq.com/products/handhelds/ | ||
Qualcomm QCP-860 | Phone | 只适用于CDMA |
http://www.qualcomm.com/cda/technology/display/0,1595,,00.html | ||
Qualcomm QCP-1960 | Phone | 只适用于CDMA |
http://www.qualcomm.com/cda/technology/display/0,1595,,00.html | ||
Qualcomm QCP-2700 | Phone | 只适用于CDMA |
http://www.qualcomm.com/cda/technology/display/0,1595,,00.html | ||
Qualcomm QCP-2760 | Phone | 只适用于CDMA |
http://www.qualcomm.com/cda/technology/display/0,1595,,00.html |
1. WAP提供怎样的安全性?
WAP 1.1支持无线传输安全协议(Wireless Transport Layer Security)。WTSL和Internet的SSL类似,具有许多重要的加密功能,但在客户端只需要较低的运行能力。
WAP网关能从网上接收SSL加密的消息并把这些消息转换成WTSL加密的信息传给移动设备,这种转换消耗的时间按毫秒计算。WAP网关的主要作用就是在两种协议之间建立一个虚拟的安全转换连接。
移动设备和服务器之间存在有两个安全问题:一个是从移动设备到网关;另一个是从网关到服务器。WTSL是保证前者的安全通讯,SSL是保证后者的安全通讯。如果移动设备使用了不具有加密功能的SIM卡,即使在URL中申请使用SSL接口,在从移动设备到网关的过程中URL的申请仍然是显式的,也就是说是不安全的,窃听者可以通过截获空间散发的无线电波来窃取用户的口令和密码。
2. 通过WAP的传输安全吗?
当然。在移动电话和WAP网关之间使用WTLS(Wireless Transport Layer Security),网关和Web Server之间使用SSL(Secured Sockets Layer)就可以。
3. WAP如何同SSL与WTLS工作?
SSL(Secure Sockets Layer)在“web”中广泛用来在浏览器和服务器之间加密数据流。这同样也适用于WAP环境,但是SSL只用在Web Server和WAP网关之间。在WAP网关和WAP设备之间,有一个类似系统叫做WTLS( Wireless Transaction Layer Security)。WTLS是专门适合于无线环境的。
安全是一个非常敏感的问题,虽然没有任何一个系统是绝对安全的,但笔者认为SSL和WTSL对于很多应用是足够安全的。这两个协议在WAP网关中相互转换。
SSL并不直接兼容WTLS,因此WAP网关要解密从Web Server过来的SSL保护数据流,然后使用WTLS加密发送给WAP设备。在WAP网关中,数据是没有保护的。
模型如下:
| |
[WAP device]------------[WAP gateway]-----------[Content server]
<---WTLS--->{unprotected}<---SLL--->
| |
(Firewall) | | (Firewall)
想象一下如果银行或者其他机构使用公开的WAP设备,处理一些敏感的数据。当数据离开用户的系统和网络的时候,它们是受到保护的。但是在进入WAP网关之后(网关是由第三方操纵的,例如:移动营运商)数据被解密。虽不能说所有的移动营运商都是危险的,但是将敏感数据暴露给不知道的第三方是很不让人放心的。任何一个营运商的问题将是所有营运商的问题。
主要的WAP公司都在开发一种称做“WAP Server”或者是具有WAP网关的Web服务器来解决端到端的问题。因为数据离开服务器(“WAP Server”)的时候就已经是WTLS加密。
模型如下:
| |
[WAP device]------------------------------------["WAP server" (acting as WAP gateway)]
<---------------WTLS--------------->
| |
(Firewall) | | (Firewall)
这样WAP网关就不再是整个过程中的一个环节。那么用户必须重新配置它们的WAP设备来指向“WAP Server”来建立相应WAP会话。当用户想访问其他地方的时候,又必须配置来指向其他的网关。虽然有的WAP设备比较好配置,但是有些却非常困难,这多少有点烦人。
除了以上的问题,实际上许多移动营运商将端到端的服务器放在用户拨号到Internet的地方。他们的WAP网关具有同样的私有的IP地址,通常是在一个防火墙后面。这个防火墙通常只允许使用HTTP协议的80端口。WAP网关使用这个端口来接受从内容服务器来的数据,那也是他的真正需求。当WAP设备试图访问其他的网关的时候,那么防火墙就将停止他们的操作,要么因为是WAP设备IP是不允许在Internet上访问其他的设备,要么是无法打开所需求的端口。这样移动营运商就有效地阻止了用户使用其他的网关。
有一些关于WAP安全方面的内容,请看:
Wapforum's WTLS 协议
Baltimore Telepathy安全讲解
Tantau关于安全的文章:《An Introduction to WML Programming and Third-Party WAP Toolkits》
Phone.com关于无线安全的文章:《Understanding Security on the Wireless Internet》
1. 在哪儿可以下载Phone.com的UP.SDK?
Phone.com的UP.SDK可以在注册之后下载。
2. 如何在Win2000上安装Nokia SDK?
Johannes Herbst (johannes_herbst@bwc.at)提供了一个快捷的方法来解决Win2000的安装问题。
从Win2000的安装光盘安装Win2000的支持工具(/support/tools/setup.exe);
找到一个叫做APCOMPAT.EXE的文件;
启动APCOMPAT并设置OS-version为 NT4 SP3 并运行;
启动Nokia SDK 安装文件;
在解包以后,程序将挂起很长一段时间;
从Win2000的Task Manager中强制结束 setup进程;
Nokia SDK setup 将正常继续。
3. 哪儿能下载Nokia SDK?
Nokia SDK v.2.18是一个非常好的7110模拟器,但是Nokia对它采取了相当的保密措施。其他的设备厂家,Phone.com和Benefon 只要简单的注册就可以得到。Nokia只允许开发者使用Nokia Toolkits,而这些版本很难和WAP环境搭配。
Nokia WAP SDK很难找到,每次找到了,它就消失了。
当前笔者知道它在:http://www.bwl.uni-mannheim.de/~broeker/software.htm。
4. Nokia SDK的基本验证是怎么回事?
基本验证好像是后加入到软件中的,并没有考虑将WAP模拟器和工具包形成产品。基本验证已经肯定要加入到真正的 Nokia 7110 以及防火墙软件4.73或者更高。
5. 除了使用Nokia WAP Toolkit 模拟器还有其他工具吗?
Nokia Toolkits模拟器的模拟效果与真的Nokia 7110相差较大。应该使用 Nokia SDK 2。最新的版本是 v.2.18。这个SDK包含了最好的7110模拟器和其他一些有用的工具和一些真实的例子
6. 为什么Nokia 7110不能POST超过160个字符?
有一些版本的Nokia 7110浏览器不能POST超过160个字符的变量。在实际中,似乎有一个内容长度的限制,大约在170~180之间。从另外的角度来说,变量的名字和它们的内容算在一起。如果只POST一个叫做“A”的变量,那么这个变量只能包含大约160个字符的内容。如果有好几个变量,如有一个名字叫做 “thisishenameofaverylongvariable”的变量,那么包含的内容将更少。
但是有一个解决方案,那就是要求电话重新配置。在Connection Settings 菜单,找到一个叫做Connetion type,把它设置为Continous ,那么将发送更大的变量内容。
如果想知道GET或者POST能发送多大的内容,请看有关GET和POST的FAQ。
7. 运行Nokia Toolkit需要安装什么版本的Java包?
只需要Java 1.2环境。如果想运行100%纯的环境,例如在Linux下,还需要一个Java XML 解释器。
1. WAP网站需要那些硬件设施?
如果仅仅是想作为WAP服务提供商,那么WAP的硬件设施和WWW服务的硬件设施完全一样,只需要对以前的WWW做适当的配置就可以应用于WAP服务。当然,也可以去购买专门的WAP Server。专用的WAP服务器可以集成许多其他功能模块,例如:WAP安全性、PUSH功能等。
2. WAP的安全性如何?
WAP堆栈中的一层,称为WTLS,提供加密和效验的服务-客户端安全。这个防止了网络上的舞弊,为电子商务和Interanet开通了道路。
3. 应该如何配置自己的Web服务器使它能够支持WAP?
在服务器端加入以下配置:
.WML text/vnd.wap.wml
.WMLC pplication/vnd.wap.wmlc
.WMLS text/vnd.wap.wmlscript
.WMLSC application/vnd.wap.wmlscriptc
.WBMP image/vnd.wap.wbmp
4. 要为WAP设备提供WML内容应当做些什么?
最简单的提供WML内容的方法是使用一个好的HTTP服务器,笔者推荐Apache。如果想生成动态的内容,笔者推荐一个叫做PHP的服务端脚本语言。这样既能够书写服务端的HTTP程序适合HTML浏览器,也能够书写WAP程序适合WML浏览器。
只有WAP站点能够连接到移动网络的提供商,用户才可能在手机上通过输入URL来访问它。既然www已经变成一个标准的名字,wap好象也在变成一个标准。例如:“wap.domain.com”。
一个非常重要的事情就是要记住让HTTP服务器告诉WML浏览器,它接收到的是一个WML页面,而不是一个HTML页面,这个可以通过配置MIME来完成。
5. 如何配置现有的Apache 1.3.9 Web服务器使它能提供WML服务?
需要配置正确的MIME类型。
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
6. 如何在PWS 4下加入MIME类型?
可以通过“Windows Explorer->Folders Option->File Types->New Type;” 直接增加可选择的mime.type文件。
对于PWS,还可修改注册表,先在:HKEY_CLASSES_ROOT层加入主键 .wml,再加入串值Content Type为text/vnd.wap.wml,然后在HKEY_LOCAL_MACHINE/Software/CLASSES/MIME/Database/Content Type/中加入主键 text/vnd.wap.wml,再加入串值Extension为.wml。
7. 有哪些HTTP的相关MIME类型?
当使用基于PC机的浏览器操作一个“web page”的时候。“web server”告诉用户的PC浏览器将接收到一个怎么样的文件类。这个经常被称做文件映射:MIME。最常见的MIME类型是普通的HTML文件,叫做“text/html”。但是对于WAP微型浏览器,它不能浏览HTML页面,MIME的类型也不同。
服务于WML的MIME类型见表10-6
表10-6 MIME类型
文件类型 | MIME类型 | 扩展名 |
Plain WML documents | text/vnd.wap.wml | .wml |
Wireless Bitmap Images | image/vnd.wap.wbmp | .wbmp |
Compiled WML documents | application/vnd.wap.wmlc | .wmlc |
WMLScripts | text/vnd.wap.wmlscript | .wmls |
Compiled WML Scripts | application/vnd.wap.wmlscriptc | .wmlsc |
为了将MIME类型加入到Apache HTTP 服务,可以按照下面步骤操作:
(1)编辑srm.conf文件(通常在/etc/httpd/conf)。
(2)定位在AddType区域,加入以下内容:
# MIME Types for WAP
AddType text/vnd.wap.wml .wml
AddType image/vnd.wap.wbmp .wbmp
AddType application/vnd.wap.wmlc .wmlc
AddType text/vnd.wap.wmlscript .wmls
AddType application/vnd.wap.wmlscriptc .wmlsc。
(3) 保存文件并重新启动Apache HTTPd。
如果你没有控制整个Apache服务器的权限,例如用户在一个ISP下面,可以加入一个叫做 .htaccess文件到每个放置WML页面的目录。当服务器从这个目录读文件的时候。它将根据 .htaccess 文件的规则输出。
一个典型的 .htaccess 看起来如下:
DirectoryIndex index.wml
addtype text/vnd.wap.wml wml
addtype application/vnd.wap.wmlc wmlc
addtype text/vnd.wap.wmlscript wmls
addtype application/vnd.wap.wmlscriptc wmlsc
addtype image/vnd.wap.wbmp wbmp
注意告诉服务器,index文件是index.wml。 同样要注意到服务器能够阅读这些文件。在某些情况下服务器由于安全问题而忽略这些文件。因此这些要同ISP协商。(增加MIME类型到Microsoft IIS server,也可以在WAP中的其他部分)。关于其他服务器,请参看它们的文档。
8. 如何使用Nokia 7110取得自己PC上的站点?需要本地的移动商提供WAP服务吗?
需要其他设备例如Modem吗?在哪儿能够访问自己PC上的WML页面?
使用自己的手机看WAP站点,要按照以下步骤进行:
安装一个Web Server(例如IIS 4.0)并且将WML应用放在一个虚拟目录中,将PC连接到Internet。注意机器的IP地址(当你使用拨号的时候,每次的IP地址可能不同)。只需要网络营运商提供数据连接。
使用WAP电话,例如Nokia 7110或者Ericsson R320。拨号到ISP。记住自己的PC已经拨号到ISP。有的ISP只允许一次一个连接,有的允许多个。这个要根据实际情况来确定。
输入机器的IP地址和虚拟目录的名字,例如:
http://x.x.x.x/virtual_path/somepage.WML
使用一个公共的网关的IP地址,例如:Ericsson。
现在就可以拨号,并激活以上设置。
9. 如何使用WinNT 4.0上的RAS Server与Nokia 7110相连接?
需要一个WAP网关,并且在自己的服务器上配置MIME类型。将网关设置成Web Server,再使用电话拨号就连接上了。(这要求必须有一个配置好的RAS帐号。)
10. 有一个需要Login 的WAP站点,有没有办法避免每次让用户重复输入用户名/密码?
可以使用电话的SIM卡来确认用户吗?
现在还不可能通过WAP在SIM卡中保存数据,也不能使用电话号码来确认用户。从安全的角度来讲,也必须让用户输入用户名和密码,提交后标记结果页给用户这样一个URL标签:http://www.website.com/login.asp?user=bill&pass=secret
11. 已经有一个Web站点,如何建立一个WAP站点?
首先要明白这个文件是给那些的确已经拥有Web站点的公司,而现在想转到WAP上来。不是指那些开发者或者普通的用户。强力推荐《Making existing web content available to the mobile Internet》。文章在:wap.com。
12. 如何绕过营运商,直接连接到Internet?
如果认为一个营运商不允许访问其他的WAP资源,或者用户只是由于开发目的想绕过营运商,有很多WAP设备可以让做到这一点。
不同的WAP设备有不同的工作方式,但是你应该能勾勒出整个框架。
首先需要一个本地的Internet Service Provider的电话号码。它使你能够通过普通的拨号连接到Internet。其实许多ISPs提供很多免费的拨号连接。ISP不一定是本地的,要有给移动营运商付费的准备。ISP需要支持PPP协议,可以使用userid和password同ISP建立连接,然后需要一个公共网关(见表10-7)的IP地址。
表10-7 一些公共网关
提供商 | IP地址 | 网关类型 |
Ericsson http://www.ericsson.com/ | 195.58.110.201 | Ericsson |
wapHQ http://www.waphq.co.uk/ | 212.1.130.132 | wapHQ Gateway |
用户要使用电话号码、useri、password和IP地址配置自己WAP设备。以Nokia 7110 为例,在Services, Settings, Connection Settings中进行配置。Nokia 7110 使用SMS信道作为缺省的,需要将它改为 Data ,同样要设置 Data Call Type 和 Connection Types。 对于Data Call Type 需要选择ISDN并测试。对于Connection Type 你可能选择Temporary 并再次需要试验。最后设置Home Page 指向某个你知道的 WAP 设备。你就可以拨号访问自己的WAP设备了。
13. 能不能建立一个WAP站点,但不使用真正的WAP设备?
WML内容可以被任何微型浏览器或者用户代理所理解。因为内容都是为WAP设备所写的,所以最好的阅读WML内容的方式可能是使用一个WAP设备模拟器。但是这些应用程序都很大,而且需要其他的运行环境。
表10-8列出了一些浏览器的模拟器和相关的信息。
表10-8 浏览器的列表
浏览器 | 环境 |
WAPJAG.DE | Internet Explorer |
AU Systems WAP Browser | PalmOS 3.3 |
WinWAP | Windows9x/NT |
Wapalizer | Internet Explorer/Netscape |
Fetchpage | Any HTML browser |
WAPman | Windows9x/NT |
WAPman | PalmOS 3.1 |
Nokia WAP Toolkit 2.0 Beta | Windows9x/NT+Java |
Phone.com UP.SDK | Windows 9x/NT |
Ericsson R380 Emulator | Windows NT 4.0 |
Nokia SDK 2.18 | Windows9x/NT |
Wappy’s Wapview | Internet Explorer/Netscape |
Opera 4.0 | Standalone kick-ass browser |
EzWAP | Windows NT, 2000, CE and Pocket PC |
14. 想建立自己的WAP营运服务该怎么做?
建立自己的WAP拨号服务系统是很简单的,在市场上有很多这种解决方案,从高端的Cisco Access Servers (AS5200)到低端的基于Microsoft NT Remote Access Service和Novell's Netware Connect的软件解决方案。
这也许要花费很多力气来解释如何安装和配置这些系统。但是这些的确都与WAP无关。一个WAP设备只是从电脑上通过Point-to-Point Protocol (PPP)取得一个IP地址。
如果已经有了一台装有Microsoft NT 4.0 和9600 bits/s 的Modem。那么就可以直接建立一个简单的系统。请看Fergal Moran(962264N@knotes.kodak.com)的《Configuring your NT server to accept remote connections》
把这些设置移植到其他系统应该没有问题。只要能拨号到Windows98 Dialup-Networking,就可以拨号到WAP设备。
注意WAP设备对IP的配置。现在需要建立自己的内部WAP网关和HTTP服务器。或者只是使用公开的WAP网关或者HTTP服务器。
15. 如何注册一个WAP域名?
其实WAP域名和Web域名没有什么区别。如果你有一个Web站点,你同样有一个将该站点挂在Internet上的Internet Provider。最常见的Web站点是www或者www.mydomain.com,典型的WAP站点名是 wap.mydomain.com。
当域名已经通过Internet Provider或者在其他公司注册之后。(例如:Network Solutions ,你注册了一个mydomain.com)。一个Domain Name Server(DNS)需要指定一系列在这个域名下的一系列的主机名字和地址。DNS只是简单的将人们可读懂的文本地址转换成IP地址。如果有一个Web站点,将至少有一个主机叫做www,它指向IP地址。当某个人想访问站点的时候,DNS将被询问:“具有域名是www.mydomain.com的主机IP地址是多少?”,然后DNS回答IP地址,例如:“193.143.2.90”。然后请求者使用这个IP地址来操作站点。
为了将WAP主机加入到域中,只需要在DNS主机中增加一个叫做wap的主机。任何请求wap.mydomain.com 将接收到WAP主机的IP地址。
WAP主机可以和Web主机拥有同样的IP地址。那就意味着该主机既提供Web内容也提供WAP内容。因为Web浏览器接收HTML,WAP浏览器接收WML,Web服务器可以通过简单的脚本来判断浏览器的类型,并提供适当的内容。因为www.mydomain.com 和wap.mydomain.com 主机的名字都指向同一个IP地址,所以WAP用户可以操作www.mydomain.com,Web用户也可以操作wap.mydomain.com。毕竟文本主机名字是机器IP地址的代表。
如果一个服务器为Web内容,另外一个为WAP内容,就需要使用Web名(www.mydomain.com)指向Web Server,使用WAP名(wap.mydomain.com)指向WAP内容服务器。