<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
 <channel>
  <title>=3C.C=</title>
  <link>http://3c.c.blogbus.com</link>
  <description><![CDATA[挣扎在社会底层，沉醉在系统底层]]></description>
  <generator> by blogbus.com </generator>
  <lastBuildDate>Mon, 30 Nov 2009 09:52:43 +0800</lastBuildDate>
  <image>
									<url>http://public.blogbus.com/profile/6/3/9/1104936/avatar_1104936_96.jpg</url>
									<title>=3C.C=</title>
									<link>http://3c.c.blogbus.com</link>
								</image>  <item>
   <title>Google Maps API编程资源大全</title>
   <description><![CDATA[下面的关于API的中文文档 

　　Google Maps API 第2版中文文档 http://www.step1.cn/GoogleApi/map2/documentation.htm
<br /><br />

　　Google Maps API 第2版升级指南 http://www.step1.cn/Google...<!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="/logs/1912166.html">1月发现9种新病毒 专攻Symbian手机</a> 2006-02-11</div><div><a href="/logs/1849525.html">手机病毒快速增长　跨越平台攻击为主要方式</a> 2006-01-22</div><div><a href="/logs/1807374.html">SMS开发-使用AT指令</a> 2006-01-10</div><div><a href="/logs/1802385.html">天线技术：WiMAX技术的特点解析</a> 2006-01-08</div><div><a href="/logs/1780238.html">GPS系统的组成</a> 2006-01-02</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2F3c.c.blogbus.com%2Flogs%2F8150741.html&title=Google+Maps+API%E7%BC%96%E7%A8%8B%E8%B5%84%E6%BA%90%E5%A4%A7%E5%85%A8">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://3c.c.blogbus.com/logs/8150741.html</link>
   <author>刺客-长白</author>
   <pubDate>Fri, 07 Sep 2007 21:47:02 +0800</pubDate>
  </item>
  <item>
   <title>[转载]无钩子的键盘记录例子代码</title>
   <description><![CDATA[
	//**********************************************************************<br />
	// Version: V1.0<br />
	// Coder: WinEggDrop<br />
	// Date Release: NULL<br />
	// Purpose: Hookless Keylogger<br />
	// Test PlatForm: Win 2K Pro And Server SP4<br />
	// Compiled On: LCC 3.0,May Compile On VC++ 6.0(Not Test Yet)<br />
	// Limitation: More Usage Of System Resource; May Not Work ...<!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://3c.c.blogbus.com/logs/1802119.html">用Javascript制作站内搜索器</a> 2006-01-08</div><div><a href="/logs/1848217.html">手机软件界面设计概要</a> 2006-01-21</div><div><a href="/logs/1847705.html">发展编年史：迅速发展 手机成长三十而立</a> 2006-01-21</div><div><a href="/logs/1807332.html">移动软交换中短消息业务的设计与实现</a> 2006-01-10</div><div><a href="/logs/1799645.html">Smartphone文件夹说明</a> 2006-01-07</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2F3c.c.blogbus.com%2Flogs%2F8150216.html&title=%5B%E8%BD%AC%E8%BD%BD%5D%E6%97%A0%E9%92%A9%E5%AD%90%E7%9A%84%E9%94%AE%E7%9B%98%E8%AE%B0%E5%BD%95%E4%BE%8B%E5%AD%90%E4%BB%A3%E7%A0%81">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://3c.c.blogbus.com/logs/8150216.html</link>
   <author>刺客-长白</author>
   <pubDate>Fri, 07 Sep 2007 20:40:51 +0800</pubDate>
  </item>
  <item>
   <title>【妙招】--30秒清除你电脑中的垃圾（使你电脑急速如飞）</title>
   <description><![CDATA[
要轻松流畅上网你是否注意到你的电脑系统磁盘的可用空间正在一天天在减少呢？<br />
是不是像老去的猴王一样动作一天比一天迟缓呢？ 
<br /><br />

　没错！在Windows在安装和使用过程中都会产生相当多的垃圾文件，包括临时文件<br />
（如：*.tmp、*._mp）日志文件（*.log）、临时帮助文件（*.gid）、磁盘检查文件<br />
（*.chk）、临时备份文件（如：*.old、*.bak）以及其他临时文件。特别是如果一段<br />
时间不清理IE的临时文件夹&ldquo;Temporary Internet Files&rdquo;，其中的缓存文件有时会占<br />
用上百MB的磁盘空间。这些LJ文件不仅仅浪费了宝贵的磁盘空间，严重时还会使系统运<br />
行慢如蜗牛。这点相信你肯定忍受不了吧！所以应及时清理系统的LJ文件的淤塞，<!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="/logs/1966499.html">短信息发送程序</a> 2006-02-23</div><div><a href="/logs/1920067.html">手机词典--规格参数篇</a> 2006-02-13</div><div><a href="/logs/1807080.html">手机使用技巧</a> 2006-01-10</div><div><a href="/logs/1800291.html">移动短信技术:利用手机模块实现短消息（二）</a> 2006-01-07</div><div><a href="/logs/1799823.html">Symbian OS C++程序员编码诀窍-系统资源的使用（ROM 和 RAM）</a> 2006-01-07</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2F3c.c.blogbus.com%2Flogs%2F7883991.html&title=%E3%80%90%E5%A6%99%E6%8B%9B%E3%80%91--30%E7%A7%92%E6%B8%85%E9%99%A4%E4%BD%A0%E7%94%B5%E8%84%91%E4%B8%AD%E7%9A%84%E5%9E%83%E5%9C%BE%EF%BC%88%E4%BD%BF%E4%BD%A0%E7%94%B5%E8%84%91%E6%80%A5%E9%80%9F%E5%A6%82%E9%A3%9E%EF%BC%89">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://3c.c.blogbus.com/logs/7883991.html</link>
   <author>刺客-长白</author>
   <pubDate>Thu, 23 Aug 2007 19:51:00 +0800</pubDate>
  </item>
  <item>
   <title>键盘快捷键大全</title>
   <description><![CDATA[
F1　　　　　　　　　　　显示当前程序或者windows的帮助内容。 <br />
F2　　　　　　　　　　　当你选中一个文件的话，这意味着&ldquo;重命名&rdquo; <br />
F3　　　　　　　　　　　当你在桌面上的时候是打开&ldquo;查找：所有文件&rdquo; 对话框 <br />
F10或ALT　　　　　　　　激活当前程序的菜单栏 <br />
windows键或CTRL+ESC　　 打开开始菜单 <br />
CTRL+ALT+删除　　　　 在win9x中打开关闭程序对话框 <br />
删除　　　　　　　　　删除被选择的选择项目，如果是文件，将被放入回收站 <br />
SHIFT+删除　　　　　　删除被选择的选择项目，如果是文件，将被直接删除而不是放入回收站 <br />
CTRL+N　　　　　　　　　新建一个新的文件 <br />...<!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="/logs/1940289.html">Bluetooth SIG蓝牙协议设备配对过程漏洞</a> 2006-02-17</div><div><a href="/logs/1849520.html">解决Symbian智能手机SIS QQ病毒的方法</a> 2006-01-22</div><div><a href="/logs/1848145.html">ARM简介及编程(一)</a> 2006-01-21</div><div><a href="/logs/1807126.html">最酷手表型手机</a> 2006-01-10</div><div><a href="/logs/1802710.html">网络接入方式综述之四：帧中继</a> 2006-01-08</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2F3c.c.blogbus.com%2Flogs%2F7883948.html&title=%E9%94%AE%E7%9B%98%E5%BF%AB%E6%8D%B7%E9%94%AE%E5%A4%A7%E5%85%A8">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://3c.c.blogbus.com/logs/7883948.html</link>
   <author>刺客-长白</author>
   <pubDate>Thu, 23 Aug 2007 19:48:16 +0800</pubDate>
  </item>
  <item>
   <title>《开始→运行→命令 集锦》</title>
   <description><![CDATA[winver---------检查Windows版本 <br />
wmimgmt.msc----打开windows管理体系结构(WMI) <br />
wupdmgr--------windows更新程序 <br />
wscript--------windows脚本宿主设置 <br />
write----------写字板 <br />
winmsd---------系统信息 <br />
wiaacmgr-------扫描仪和照相机向导 <br />
winchat--------XP自带局域网聊天 <br />
mem.exe--------显示内存使用情况 <br />
Msconfig.exe---系统配置实用程序 <br />
mplayer2-------简易widnows media player <br />
mspaint--------画图板...<!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="/logs/1966554.html">AT指令</a> 2006-02-23</div><div><a href="/logs/1849596.html">玩转手机无线上网 WAP/GPRS玩法全攻略</a> 2006-01-22</div><div><a href="/logs/1849520.html">解决Symbian智能手机SIS QQ病毒的方法</a> 2006-01-22</div><div><a href="/logs/1847982.html">Wi-Fi</a> 2006-01-21</div><div><a href="/logs/1823312.html">我国无线互联安全技术获进展</a> 2006-01-15</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2F3c.c.blogbus.com%2Flogs%2F7883886.html&title=%E3%80%8A%E5%BC%80%E5%A7%8B%E2%86%92%E8%BF%90%E8%A1%8C%E2%86%92%E5%91%BD%E4%BB%A4+%E9%9B%86%E9%94%A6%E3%80%8B">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://3c.c.blogbus.com/logs/7883886.html</link>
   <author>刺客-长白</author>
   <pubDate>Thu, 23 Aug 2007 19:45:36 +0800</pubDate>
  </item>
  <item>
   <title>自删除程序源代码</title>
   <description><![CDATA[<p><span style="FONT-FAMILY: Courier New">来源: 网络</span></p><p><span style="FONT-FAMILY: Courier New">// http://blog.vckbase.com/jozu/archive/2006/02/10/1097.html#17627</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">//</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">// Delself.cpp: 删除正在运行的程序</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">//</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">// Coder Jozu</span><br style="FONT-FAMILY: Courier New" /><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">#include &lt;windows.h&gt;</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">#include &lt;tchar.h&gt;</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">#include &lt;shlobj.h&gt;</span><br style="FONT-FAMILY: Courier New" /><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">#pragma comment(lib, &quot;Shell32.lib&quot;)</span><br style="FONT-FAMILY: Courier New" /><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">#define ERROR_RET  1</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">#define ERROR_SUC  0</span><br style="FONT-FAMILY: Courier New" /><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">#define COMSPEC         TEXT(&quot;COMSPEC&quot;)</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">#define ARGS_PREX       TEXT(&quot; /c del &quot;)</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">#define ARGS_ERR_REDIR  TEXT(&quot; &gt;NUL&quot;)</span><br style="FONT-FAMILY: Courier New" /><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">int main(int argc, char** argv)</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">{</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">    TCHAR szModuleName[MAX_PATH] = { 0 };</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">    TCHAR szCommand[MAX_PATH] = { 0 };</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">    TCHAR szParams[MAX_PATH] = { 0 };</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">   </span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">    STARTUPINFO si = { sizeof(STARTUPINFO) };</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">    PROCESS_INFORMATION pi;</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">   </span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">    if(!GetModuleFileName(NULL, szModuleName, MAX_PATH))</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">        return ERROR_RET;</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">    </span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">    if(!GetShortPathName(szModuleName, szModuleName, MAX_PATH))</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">        return ERROR_RET;</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">   </span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">    if(!GetEnvironmentVariable(COMSPEC, szCommand, MAX_PATH))</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">        return ERROR_RET;</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">   </span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">    _tcscat(szCommand, ARGS_PREX);</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">    _tcscat(szCommand, szModuleName);</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">    _tcscat(szCommand, ARGS_ERR_REDIR);</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">    </span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">    if(SetPriorityClass(GetCurrentProcess(),</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">        REALTIME_PRIORITY_CLASS))</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">    {</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">        if(SetThreadPriority(GetCurrentThread(),</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">            THREAD_PRIORITY_TIME_CRITICAL))</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">        {</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">            //</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">            if(CreateProcess(NULL, szCommand, NULL,</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">                NULL, FALSE, 0, NULL, NULL, &amp;si, &amp;pi))</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">            {</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">                SetPriorityClass(pi.hProcess, IDLE_PRIORITY_CLASS);</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">               </span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">                SetProcessPriorityBoost(pi.hProcess, TRUE);</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">               </span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">                SHChangeNotify(SHCNE_DELETE,</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">                    SHCNF_PATH, szModuleName, NULL);</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">                return TRUE;</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">            }</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">        }</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">        else</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">        {</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">            SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">        }</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">    }</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">    return ERROR_RET;</span><br style="FONT-FAMILY: Courier New" /><span style="FONT-FAMILY: Courier New">}</span><br style="FONT-FAMILY: Courier New" /></p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="/logs/1966611.html">串口通信</a> 2006-02-23</div><div><a href="/logs/1912092.html">手机病毒出组合拳 安全防护一箭双雕</a> 2006-02-11</div><div><a href="/logs/1823302.html">TI与ARM共创芯片级安全方案，保护手机安全</a> 2006-01-15</div><div><a href="/logs/1807332.html">移动软交换中短消息业务的设计与实现</a> 2006-01-10</div><div><a href="/logs/1771893.html">友情连接</a> 2005-12-31</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2F3c.c.blogbus.com%2Flogs%2F2050214.html&title=%E8%87%AA%E5%88%A0%E9%99%A4%E7%A8%8B%E5%BA%8F%E6%BA%90%E4%BB%A3%E7%A0%81">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://3c.c.blogbus.com/logs/2050214.html</link>
   <author>刺客-长白</author>
   <pubDate>Mon, 13 Mar 2006 15:11:55 +0800</pubDate>
  </item>
  <item>
   <title>WAP中推送技术的分析与设计</title>
   <description><![CDATA[<table cellspacing="0" cellpadding="0" width="95%" align="center" border="0"><tbody><tr><td class="newstitle" id="fontzoom" valign="top"><br /><p /><p>WAP中推送技术的分析与设计</p><p>范绍山<br />南京邮电学院计算机科学与技术系</p><p>摘要：无线应用协议作为一个开放的工业标准，代表了移动通信和Internet两大技术融合的发展方向。许多新的技术正逐渐融入该体系当中。本文着重分析了WAP1.2规范中提出的推送技术(PUSH)，并初步探讨了其应用的实现构想。<br />关键词：无线应用协议  推送  WAP</p><p>1.简介<br />自从1998年推出无线应用协议(WAP)后，该协议得到了包括Nokia、Motorola、Ericssion等多家大公司在内的业界的广泛支持。各公司除尽快的推出自己的产品，以期占有市场外，还在不遗余力的进行着协议的扩充和新应用的开发工作。推送(PUSH)，这项在Internet中曾一度引起过轰动的技术，在同移动通信相结合后，再次被认为有着良好的应用前景。<br />所谓推送技术是一种基于客户服务器机制，由服务器主动的将信息发往客户端的技术，其传送的信息通常是用户所事先预定的。同传统的拉技术(PULL)相比，两者最为主要的区别在于前者的是由服务器主动发送信息，而后者则是由客户机主动请求信息。<br />2.推送技术与移动通信的结合<br />推送技术的本质在于让信息去主动的寻找用户，因此其优势在于信息的主动性和及时性，通过使用该技术，可以尽快的将信息推送到用户面前；其弱势在于信息的准确性较差，由于简单的筛选机制取代了人工的选择，必然会使推送信息和用户的需求间存在一定的差异。<br />推送技术在Internet中没能取得巨大的成功，原因是多方面的。在固定网中，计算机等固定设备为用户提供了足够的资源和能力去查找信息，所以人们通常将它作为一个浏览信息的窗口，而不是被动的信息接收者，用户对于信息准确性的要求也远胜于对其及时性的要求，因此很难期望推送技术在Internet中的成功。<br />在移动网中，由于存在着网络带宽，移动设备能力及高昂的资费标准等诸多的限制，使得用户无法象在固定网中一样方便的查找信息，这就需要将重要的信息主动及时的推送到用户的移动设备中。移动通信的优点是可以及时方便的发送和接收信息，由于公共通信接入点的普及，使得发送信息的优势不再明显，而及时的接收信息仍然是移动设备所独具的优势。移动的话音业务是将语音信息推送到用户，而WAP中的推送技术则是要将包括文字、声音、图像等在内的数字信息推送给用户。所以，扬长避短正是推送技术同移动通信结合的合理性所在。<br />将推送技术应用于移动通信领域可以带来许多电信增值业务。这包括移动中收发电子邮件，随时获得股价的涨跌信息，天气预报，及时的新闻报道，位置相关服务等。所有这些服务的共同特点在于用户对信息的及时性的要求比较高，用户希望能够通过手机，PDA等移动设备随时随地的的到该种服务。</p><p>3.WAP中的推送技术<br />无线应用协议在1.2版本的规范中定义了推送技术，提出了一套完整的从服务器到客户端的协议规范，其体系结构图如图一所示。</p><p> </p><p> </p><p> </p><p> </p><p>图一、WAP推送技术体系结构图<br />推送框架主要包括推送发起者(PI)、推送代理网关(PPG)和推送客户(PC)三个功能部份。PI位于Internet中，通过推送访问协议(PAP)同PPG通信，PPG是Internet网和移动网之间的访问接入点，通过推送空间传输协议(P-OTA)完成从PPG到推送客户的数据传输任务。基本的工作过程如下：当有消息要推送到客户时，PI首先根据消息的内容和性质构造推送消息，通过PAP协议向PPG发出推送请求，PPG收到请求后进行一些必要的处理工作(包括压缩、协议转换、安全认证等)，然后通过P-OTA协议将推送内容传送给客户端。客户端收到推送消息后，根据消息内容和服务类型同用户进行交互。WAP的推送协议中针对不同的用户需求定义了服务指示和服务加载两种服务，可根据推送消息的性质选择使用。<br />从实现的角度看，一般PI是运行于Internet端的一台独立的服务器，负责收集推送信息和发起推送请求。由于PPG和客户端间的通信是由运行于WSP之上的P-OTA协议完成，所以PPG通常是和WAP网关集成在一起。在客户端，为了能够随时收到来自PPG的推送消息，必须在后台始终运行一个推送消息监听程序。另外，由于面向连接的推送请求需要在客户端和服务器端有激活的WSP会话，而WSP连接的建立无法由服务器端发起，所以在客户端中引入了会话初始化程序，以监听来自服务器的会话建立请求，建立并激活WSP会话。<br />下面分别介绍推送技术的几个关键组成部份：<br />⑴ 推送代理网关(PPG)<br />推送技术的主要处理工作基本都集中在PPG中，作为Internet到移动网的访问接入点，即要与PI通信，又要负责通过无线信道传输推送信息，所以必须负责所有相关的协议转换和编码工作。概括讲，PPG所提供的主要服务包括：<br />q PI的标识和鉴权，访问控制。<br />q 对推送内容进行语法分析，并依据DTD检错纠错。<br />q 客户寻址与信息的传输。<br />q PAP与P-OTA间的协议转换。<br />q 为提高无线信道中的传输效率，对信息进行处理(如压缩、编译等)。<br />另外，PPG还可以通过别名机制实现组播和广播，即将某些特定的地址别名映射到组播或广播操作，具体的实现方案可以由系统实现者决定。不同的客户端，其能力是不同的，PPG还要负责响应PI的客户能力查询请求，以便于PI针对不同的客户端构造合适的内容格式。<br />⑵ 推送访问协议(PAP)<br />PAP是PI与PPG间的通信协议，它使用XML作为消息的描述语言，通过简单的请求响应机制完成数据的传输。PAP可以实现在多种通信协议之上，包括HTTP，SMTP等。目前的WAP版本仅给出了利用HTTP隧道机制实现PAP的规范。PAP支持的操作包括：<br />q 推送消息提交：PI使用该操作向PPG提交推送请求，推送消息包括XML格式的控制信息，消息体和一个可选的客户能力描述三部份，共同组成一个多部相关的消息(multipart/related)。<br />q 确认通知：当PI请求确认的推送时，该操作用于传输确认消息。<br />q 推送取消：PI请求PPG取消先前的推送请求。<br />q 状态查询：PI利用该操作查询先前的推送请求的执行状况。<br />q 客户能力查询：PI可利用该操作查询客户端的能力，以调整传送给用户的推送内容及格式。<br />⑶ 推送空间传输协议(P-OTA)<br />P-OTA是运行于WSP之上的一层较为简单的协议层，负责从PPG到客户代理的数据传输。P-OTA可使用面向连接的会话和无连接会话两种WSP层服务，对于使用连接会话的推送，需要在PPG和客户端间预先存在一个激活的会话上下文；对于无连接的推送，则通过预留的端口完成通信。<br />⑷ 服务指示(SI)和服务加载(SL)<br />推送消息送到移动设备后，通常只需显示给用户即可，但用户可能会有些不同的需求。WAP的推送协议中定义了服务指示和服务加载两项服务，以给用户和网络运营者更多的选择。服务加载是将一项服务的URI推送给用户，然后客户端自动的使用拉技术根据该URI启动服务。服务指示是将新信息的指示和相关的URI推送给用户，由用户选择是立即处理信息或以后处理。两种服务的区别在于用户是否介入推送信息的处理过程。SL对推送信息的处理对用户来说是透明的，而SI则在指示用户的同时，请用户对随后的处理做出选择。<br />4．WAP推送技术的实现<br />本节以一个电子邮件系统为例，简单的探讨了WAP推送技术的实现。在Internet中，电子邮件系统已相当的普遍，但是收发电子邮件通常还是限制在固定的PC机完成，信息的及时性大打折扣。虽然GSM的短消息功能也可提供邮件功能，但是信息量小(160个字符)，类型单一(仅限于文本)，远不能满足用户的需要，所以可以利用WAP的推送技术来实现移动电子邮件功能。基本的设计构想如图二所示。</p><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p><p>图二、移动email系统设计构想<br />希望实现的功能包括：<br />q 服务的登记与取消<br />q 邮件到来通知(响铃或振动，并提供邮件头部信息)<br />q 利用手机阅读邮件<br />q 利用手机发送邮件<br />q 利用手机配置服务</p><p>整个邮件系统由以下几部份组成：<br />q 邮件服务器：该部份即位于Internet中的普通的邮件服务器，负责用户邮件的收发工作。<br />q POP3邮件代理：该部份使用POP3协议与邮件服务器进行通信，并负责推送消息的发起，是整个系统运行的核心组成部份。它维护着一个用户数据库，记录所有登记该服务的用户的信息，包括电子邮件地址、POP3服务器地址、账号、配置、手机号码等，采用轮询的机制通过Internet定期检查各邮件服务器，如发现某用户有新邮件，则取得邮件的部份信息(如收发人、时间、主题等)作为指示内容，并以PI的地址作为URI，共同构成服务指示消息，然后依据该用户的手机号对移动设备寻址，使用PAP协议向PPG提出推送请求。<br />q 推送代理网关：PPG收到推送消息后对信息进行鉴权，包括消息是否来自合法的推送服务器，用户是否登记，消息格式是否符合DTD语法等。对于合法信息利用WBXML格式进行压缩，然后通过P-OTA协议传送给对应用户的手机。<br />q 移动设备：包括邮件应用程序和服务加载器，服务加载器负责监控推送消息的到达，当收到合法的推送消息时，以振动或响铃的方式通知用户新邮件的到达，并将指示消息中邮件头部信息显示给用户。这时候，用户可选择立即启动服务或是推迟服务。<br />系统的工作流程如下：<br />⑴ POP3代理以一定的时间间隔，使用POP3协议检查各用户是否有新邮件到达，若有则取回邮件的头部信息。<br />⑵ POP3代理作为推送的发起者，依据收到的邮件头部信息和数据库信息向相应的用户发起推送请求。<br />⑶ PPG对推送的消息进行鉴权和格式检查后，压缩成适合无线链路传输的二进制消息发送给指定的用户。<br />⑷ 客户端的服务加载器检测到推送消息后，提醒用户新邮件的到达，然后根据用户的选择启动或推迟服务。<br />⑸ 若用户选择立即阅读邮件，则将启动客户端的邮件程序，以用户账号作为参数，依据指示消息中携带的URI向PI发出WSP GET请求。<br />⑹ PPG对WSP请求进行协议转换，向POP3代理发出HTTP GET请求。<br />⑺ POP3代理收到请求后，代理客户从对应的POP3服务器上取得邮件，并构造成WML页面，然后作为请求的响应返回客户端。<br />从具体的实现上看，现有的许多WAP网关产品，如Nokia WAP Server，都集成了PPG的功能，提供了对推送技术的支持，另外，越来越多的移动设备开始支持WAP协议，推送功能也在逐渐的得到支持，所以实现的重点就集中在了POP3代理上。这部份的功能可实现在一台同PPG和Internet同时有连接的计算机上。需要运行两个服务器程序，一个支持text/wml类型的WEB服务器，用以响应PPG的HTTP请求，返回邮件页面。另一个特定的监控程序，用以不断的检测与接收新邮件，构造推送消息和WML页面。需要另外说明的是，以上的设计主要是针对利用推送功能实现邮件的接收，对于邮件的发送，则可使用基本的WSP功能实现。</p></td></tr></tbody></table><table cellspacing="0" cellpadding="0" width="95%" align="center" border="0"><tbody><tr><td class="newstitle" id="fontzoom" valign="top"><br /><p /><p>5．发展前景<br />推送技术结合了自身的优势和移动通信服务的特性，应将有着良好的应用前景。但是推送技术仍然存在着一些亟待解决的问题，如信息的鉴权与认证、信息的准确性问题、如何避免垃圾信息等。如何解决好这些问题将是推送技术成功的关键。另外，随着GPRS技术和3G无线通信技术的发展，无线信道的带宽将逐步增大，在无线信道上推送多媒体信息也将成为可能。</p><p>参考资料：<br />1.“WAP PUSH Architectural Overview”, WAP Forum, 08-Nov-1999<br />2.“WAP Push OTA Protocol Specification”, WAP Forum, 08-Nov-1999<br />3.“WAP Push Access Protocol Specification”, WAP Forum, 08-Nov-1999<br />4.“WAP Service Indication Specification”, WAP Forum, 08-Nov-1999<br />5.“The MIME Multipart/related content type”, E.Levinson, August 1998<br />6.“Post Office Protocol - Version 3”， J. Myers，M. Rose，May 1996<br /></p></td></tr></tbody></table><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://3c.c.blogbus.com/logs/2021295.html">WAP中推送技术的分析与设计(上)</a> 2006-03-08</div><div><a href="http://3c.c.blogbus.com/logs/1958342.html">基于短信网关WAP推送的实现</a> 2006-02-21</div><div><a href="http://3c.c.blogbus.com/logs/1912044.html">六种WAP手机病毒</a> 2006-02-11</div><div><a href="http://3c.c.blogbus.com/logs/1849596.html">玩转手机无线上网 WAP/GPRS玩法全攻略</a> 2006-01-22</div><div><a href="http://3c.c.blogbus.com/logs/1849531.html">CMWAP和CMNET上网的主要区别与适用范围</a> 2006-01-22</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2F3c.c.blogbus.com%2Flogs%2F2021298.html&title=WAP%E4%B8%AD%E6%8E%A8%E9%80%81%E6%8A%80%E6%9C%AF%E7%9A%84%E5%88%86%E6%9E%90%E4%B8%8E%E8%AE%BE%E8%AE%A1">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://3c.c.blogbus.com/logs/2021298.html</link>
   <author>刺客-长白</author>
   <pubDate>Wed, 08 Mar 2006 15:15:41 +0800</pubDate>
  </item>
  <item>
   <title>WAP中推送技术的分析与设计(上)</title>
   <description><![CDATA[<table cellspacing="0" cellpadding="0" width="95%" align="center" border="0"><tbody><tr><td class="newstitle" id="fontzoom" valign="top"><br /><p /><p>WAP中推送技术的分析与设计</p><p>范绍山<br />南京邮电学院计算机科学与技术系</p><p>摘要：无线应用协议作为一个开放的工业标准，代表了移动通信和Internet两大技术融合的发展方向。许多新的技术正逐渐融入该体系当中。本文着重分析了WAP1.2规范中提出的推送技术(PUSH)，并初步探讨了其应用的实现构想。<br />关键词：无线应用协议  推送  WAP</p><p>1.简介<br />自从1998年推出无线应用协议(WAP)后，该协议得到了包括Nokia、Motorola、Ericssion等多家大公司在内的业界的广泛支持。各公司除尽快的推出自己的产品，以期占有市场外，还在不遗余力的进行着协议的扩充和新应用的开发工作。推送(PUSH)，这项在Internet中曾一度引起过轰动的技术，在同移动通信相结合后，再次被认为有着良好的应用前景。<br />所谓推送技术是一种基于客户服务器机制，由服务器主动的将信息发往客户端的技术，其传送的信息通常是用户所事先预定的。同传统的拉技术(PULL)相比，两者最为主要的区别在于前者的是由服务器主动发送信息，而后者则是由客户机主动请求信息。<br />2.推送技术与移动通信的结合<br />推送技术的本质在于让信息去主动的寻找用户，因此其优势在于信息的主动性和及时性，通过使用该技术，可以尽快的将信息推送到用户面前；其弱势在于信息的准确性较差，由于简单的筛选机制取代了人工的选择，必然会使推送信息和用户的需求间存在一定的差异。<br />推送技术在Internet中没能取得巨大的成功，原因是多方面的。在固定网中，计算机等固定设备为用户提供了足够的资源和能力去查找信息，所以人们通常将它作为一个浏览信息的窗口，而不是被动的信息接收者，用户对于信息准确性的要求也远胜于对其及时性的要求，因此很难期望推送技术在Internet中的成功。<br />在移动网中，由于存在着网络带宽，移动设备能力及高昂的资费标准等诸多的限制，使得用户无法象在固定网中一样方便的查找信息，这就需要将重要的信息主动及时的推送到用户的移动设备中。移动通信的优点是可以及时方便的发送和接收信息，由于公共通信接入点的普及，使得发送信息的优势不再明显，而及时的接收信息仍然是移动设备所独具的优势。移动的话音业务是将语音信息推送到用户，而WAP中的推送技术则是要将包括文字、声音、图像等在内的数字信息推送给用户。所以，扬长避短正是推送技术同移动通信结合的合理性所在。<br />将推送技术应用于移动通信领域可以带来许多电信增值业务。这包括移动中收发电子邮件，随时获得股价的涨跌信息，天气预报，及时的新闻报道，位置相关服务等。所有这些服务的共同特点在于用户对信息的及时性的要求比较高，用户希望能够通过手机，PDA等移动设备随时随地的的到该种服务。</p><p>3.WAP中的推送技术<br />无线应用协议在1.2版本的规范中定义了推送技术，提出了一套完整的从服务器到客户端的协议规范，其体系结构图如图一所示。</p><p> </p><p> </p><p> </p><p> </p><p>图一、WAP推送技术体系结构图<br />推送框架主要包括推送发起者(PI)、推送代理网关(PPG)和推送客户(PC)三个功能部份。PI位于Internet中，通过推送访问协议(PAP)同PPG通信，PPG是Internet网和移动网之间的访问接入点，通过推送空间传输协议(P-OTA)完成从PPG到推送客户的数据传输任务。基本的工作过程如下：当有消息要推送到客户时，PI首先根据消息的内容和性质构造推送消息，通过PAP协议向PPG发出推送请求，PPG收到请求后进行一些必要的处理工作(包括压缩、协议转换、安全认证等)，然后通过P-OTA协议将推送内容传送给客户端。客户端收到推送消息后，根据消息内容和服务类型同用户进行交互。WAP的推送协议中针对不同的用户需求定义了服务指示和服务加载两种服务，可根据推送消息的性质选择使用。<br />从实现的角度看，一般PI是运行于Internet端的一台独立的服务器，负责收集推送信息和发起推送请求。由于PPG和客户端间的通信是由运行于WSP之上的P-OTA协议完成，所以PPG通常是和WAP网关集成在一起。在客户端，为了能够随时收到来自PPG的推送消息，必须在后台始终运行一个推送消息监听程序。另外，由于面向连接的推送请求需要在客户端和服务器端有激活的WSP会话，而WSP连接的建立无法由服务器端发起，所以在客户端中引入了会话初始化程序，以监听来自服务器的会话建立请求，建立并激活WSP会话。<br />下面分别介绍推送技术的几个关键组成部份：<br />⑴ 推送代理网关(PPG)<br />推送技术的主要处理工作基本都集中在PPG中，作为Internet到移动网的访问接入点，即要与PI通信，又要负责通过无线信道传输推送信息，所以必须负责所有相关的协议转换和编码工作。概括讲，PPG所提供的主要服务包括：<br />q PI的标识和鉴权，访问控制。<br />q 对推送内容进行语法分析，并依据DTD检错纠错。<br />q 客户寻址与信息的传输。<br />q PAP与P-OTA间的协议转换。<br />q 为提高无线信道中的传输效率，对信息进行处理(如压缩、编译等)。<br />另外，PPG还可以通过别名机制实现组播和广播，即将某些特定的地址别名映射到组播或广播操作，具体的实现方案可以由系统实现者决定。不同的客户端，其能力是不同的，PPG还要负责响应PI的客户能力查询请求，以便于PI针对不同的客户端构造合适的内容格式。<br />⑵ 推送访问协议(PAP)<br />PAP是PI与PPG间的通信协议，它使用XML作为消息的描述语言，通过简单的请求响应机制完成数据的传输。PAP可以实现在多种通信协议之上，包括HTTP，SMTP等。目前的WAP版本仅给出了利用HTTP隧道机制实现PAP的规范。PAP支持的操作包括：<br />q 推送消息提交：PI使用该操作向PPG提交推送请求，推送消息包括XML格式的控制信息，消息体和一个可选的客户能力描述三部份，共同组成一个多部相关的消息(multipart/related)。<br />q 确认通知：当PI请求确认的推送时，该操作用于传输确认消息。<br />q 推送取消：PI请求PPG取消先前的推送请求。<br />q 状态查询：PI利用该操作查询先前的推送请求的执行状况。<br />q 客户能力查询：PI可利用该操作查询客户端的能力，以调整传送给用户的推送内容及格式。<br />⑶ 推送空间传输协议(P-OTA)<br />P-OTA是运行于WSP之上的一层较为简单的协议层，负责从PPG到客户代理的数据传输。P-OTA可使用面向连接的会话和无连接会话两种WSP层服务，对于使用连接会话的推送，需要在PPG和客户端间预先存在一个激活的会话上下文；对于无连接的推送，则通过预留的端口完成通信。<br />⑷ 服务指示(SI)和服务加载(SL)<br />推送消息送到移动设备后，通常只需显示给用户即可，但用户可能会有些不同的需求。WAP的推送协议中定义了服务指示和服务加载两项服务，以给用户和网络运营者更多的选择。服务加载是将一项服务的URI推送给用户，然后客户端自动的使用拉技术根据该URI启动服务。服务指示是将新信息的指示和相关的URI推送给用户，由用户选择是立即处理信息或以后处理。两种服务的区别在于用户是否介入推送信息的处理过程。SL对推送信息的处理对用户来说是透明的，而SI则在指示用户的同时，请用户对随后的处理做出选择。<br />4．WAP推送技术的实现<br />本节以一个电子邮件系统为例，简单的探讨了WAP推送技术的实现。在Internet中，电子邮件系统已相当的普遍，但是收发电子邮件通常还是限制在固定的PC机完成，信息的及时性大打折扣。虽然GSM的短消息功能也可提供邮件功能，但是信息量小(160个字符)，类型单一(仅限于文本)，远不能满足用户的需要，所以可以利用WAP的推送技术来实现移动电子邮件功能。基本的设计构想如图二所示。</p><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p><p>图二、移动email系统设计构想<br />希望实现的功能包括：<br />q 服务的登记与取消<br />q 邮件到来通知(响铃或振动，并提供邮件头部信息)<br />q 利用手机阅读邮件<br />q 利用手机发送邮件<br />q 利用手机配置服务</p><p>整个邮件系统由以下几部份组成：<br />q 邮件服务器：该部份即位于Internet中的普通的邮件服务器，负责用户邮件的收发工作。<br />q POP3邮件代理：该部份使用POP3协议与邮件服务器进行通信，并负责推送消息的发起，是整个系统运行的核心组成部份。它维护着一个用户数据库，记录所有登记该服务的用户的信息，包括电子邮件地址、POP3服务器地址、账号、配置、手机号码等，采用轮询的机制通过Internet定期检查各邮件服务器，如发现某用户有新邮件，则取得邮件的部份信息(如收发人、时间、主题等)作为指示内容，并以PI的地址作为URI，共同构成服务指示消息，然后依据该用户的手机号对移动设备寻址，使用PAP协议向PPG提出推送请求。<br />q 推送代理网关：PPG收到推送消息后对信息进行鉴权，包括消息是否来自合法的推送服务器，用户是否登记，消息格式是否符合DTD语法等。对于合法信息利用WBXML格式进行压缩，然后通过P-OTA协议传送给对应用户的手机。<br />q 移动设备：包括邮件应用程序和服务加载器，服务加载器负责监控推送消息的到达，当收到合法的推送消息时，以振动或响铃的方式通知用户新邮件的到达，并将指示消息中邮件头部信息显示给用户。这时候，用户可选择立即启动服务或是推迟服务。<br />系统的工作流程如下：<br />⑴ POP3代理以一定的时间间隔，使用POP3协议检查各用户是否有新邮件到达，若有则取回邮件的头部信息。<br />⑵ POP3代理作为推送的发起者，依据收到的邮件头部信息和数据库信息向相应的用户发起推送请求。<br />⑶ PPG对推送的消息进行鉴权和格式检查后，压缩成适合无线链路传输的二进制消息发送给指定的用户。<br />⑷ 客户端的服务加载器检测到推送消息后，提醒用户新邮件的到达，然后根据用户的选择启动或推迟服务。<br />⑸ 若用户选择立即阅读邮件，则将启动客户端的邮件程序，以用户账号作为参数，依据指示消息中携带的URI向PI发出WSP GET请求。<br />⑹ PPG对WSP请求进行协议转换，向POP3代理发出HTTP GET请求。<br />⑺ POP3代理收到请求后，代理客户从对应的POP3服务器上取得邮件，并构造成WML页面，然后作为请求的响应返回客户端。<br />从具体的实现上看，现有的许多WAP网关产品，如Nokia WAP Server，都集成了PPG的功能，提供了对推送技术的支持，另外，越来越多的移动设备开始支持WAP协议，推送功能也在逐渐的得到支持，所以实现的重点就集中在了POP3代理上。这部份的功能可实现在一台同PPG和Internet同时有连接的计算机上。需要运行两个服务器程序，一个支持text/wml类型的WEB服务器，用以响应PPG的HTTP请求，返回邮件页面。另一个特定的监控程序，用以不断的检测与接收新邮件，构造推送消息和WML页面。需要另外说明的是，以上的设计主要是针对利用推送功能实现邮件的接收，对于邮件的发送，则可使用基本的WSP功能实现。</p></td></tr></tbody></table><table cellspacing="0" cellpadding="0" width="95%" align="center" border="0"><tbody><tr><td class="newstitle" id="fontzoom" valign="top"><br /><p /><p>5．发展前景<br />推送技术结合了自身的优势和移动通信服务的特性，应将有着良好的应用前景。但是推送技术仍然存在着一些亟待解决的问题，如信息的鉴权与认证、信息的准确性问题、如何避免垃圾信息等。如何解决好这些问题将是推送技术成功的关键。另外，随着GPRS技术和3G无线通信技术的发展，无线信道的带宽将逐步增大，在无线信道上推送多媒体信息也将成为可能。</p><p>参考资料：<br />1.“WAP PUSH Architectural Overview”, WAP Forum, 08-Nov-1999<br />2.“WAP Push OTA Protocol Specification”, WAP Forum, 08-Nov-1999<br />3.“WAP Push Access Protocol Specification”, WAP Forum, 08-Nov-1999<br />4.“WAP Service Indication Specification”, WAP Forum, 08-Nov-1999<br />5.“The MIME Multipart/related content type”, E.Levinson, August 1998<br />6.“Post Office Protocol - Version 3”， J. Myers，M. Rose，May 1996<br /></p></td></tr></tbody></table><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://3c.c.blogbus.com/logs/2021298.html">WAP中推送技术的分析与设计</a> 2006-03-08</div><div><a href="http://3c.c.blogbus.com/logs/1958342.html">基于短信网关WAP推送的实现</a> 2006-02-21</div><div><a href="http://3c.c.blogbus.com/logs/1912044.html">六种WAP手机病毒</a> 2006-02-11</div><div><a href="http://3c.c.blogbus.com/logs/1849596.html">玩转手机无线上网 WAP/GPRS玩法全攻略</a> 2006-01-22</div><div><a href="http://3c.c.blogbus.com/logs/1849531.html">CMWAP和CMNET上网的主要区别与适用范围</a> 2006-01-22</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2F3c.c.blogbus.com%2Flogs%2F2021295.html&title=WAP%E4%B8%AD%E6%8E%A8%E9%80%81%E6%8A%80%E6%9C%AF%E7%9A%84%E5%88%86%E6%9E%90%E4%B8%8E%E8%AE%BE%E8%AE%A1%28%E4%B8%8A%29">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://3c.c.blogbus.com/logs/2021295.html</link>
   <author>刺客-长白</author>
   <pubDate>Wed, 08 Mar 2006 15:15:23 +0800</pubDate>
  </item>
  <item>
   <title>用ASP在WAP手机网页中添加旗帜广告</title>
   <description><![CDATA[<p>来源: 网络</p><p>　在我前面那篇文章《如何结合使用WML和ASP技术编写动态手机页面》，我介绍了如何使用ASP产生动态的WML网页。在本文中，我想进一步的介绍如何利用ASP开发动态的WML网页，及其应用。其实细想一下，可以使用服务器端编程（例如ASP）开发很多很多应用程序用在WAP手机上，只要把它们直接生成WAP手机能识别的WML网页就可以了。比如说在本文中要介绍的，如何为WAP等无线设备开发一个循环式的旗帜广告系统。<br /><br />　　图一显示了一个旗帜广告的示意图，这是在一个 WAP 站点上显示旗帜广告的一个可能的方法。<br /><br /><img height="531" src="http://www.wapease.com/Files/RoUpimages/1179243734.gif" width="229" border="0" /><br /><br />　　使用这种方法，你就可以在你的网站上加入循环式的旗帜广告，就能给那些使用无线上网冲浪的用户一个机会，让他们了解到更快的广告信息，只需他们轻轻一按电话左边的按钮就可以了，不但能够方便用户而且能够增加网站的收入。<br /><br />　　假设我们想要创建一个循环旗帜广告，并把它放在任何页面的顶部，使用ASP和WML来创建这个页面。为了使这个系统更加具有可伸缩性，并更加贴近现实，我想把将要显示的广告信息存入数据库中，然后从数据库中抽取出所有相关的信息，从而使产生的内容保持动态变化的。然后将随机从数据库选择一个广告和它所指向的链接，这样才能做到使广告不断的循环出现。每次载入一个页面的时候，就将会出现一个新的广告。<br /><br />　　好下面我先说一下，建立广告数据库。为了简化，我使用了Microsoft Access 数据库，表名为ADbase，其中有主键bannerid（用来说明旗帜广告名），bannertext（显示于手机上的广告词，也就是旗帜广告的实际的正文消息） 和 bannerURL（连接广告的链接）当然了，你也可以在网页中加入一些图形，不过为了简化，我将省掉这些图形。建好的库如下显示。<br /><br /><img height="201" src="http://www.wapease.com/Files/RoUpimages/1179245580.gif" width="347" border="0" /><br /><br /><table height="34" cellspacing="0" cellpadding="0" width="526" border="0"><tbody><tr bgcolor="#cccccc"><td><b>＜%@Language=VBScript<br /><br />' 定义用于产生随机数的最大值<br />MaxNoAds = 10<br /><br />' 设置文档类型<br />Response.ContentType = &quot;text/vnd.wap.wml&quot;<br /><br />' 从数据库中随机选择一个广告<br />Randomize(Cbyte(Left(Right(Time(),5),2)))<br />AdID=(Int((MaxNoAds-1+1) * Rnd + 1))<br /><br />' 从数据库中把这条广告取出<br /><br />set objConn = Server.CreateObject(&quot;adodb.connection&quot;)<br />objConn.Open &quot;dsn=adserver;uid=adserver&quot;<br />sql = &quot;SELECT * from ADbase where bannerid = '&quot; &amp; AdID &amp; &quot;'&quot;<br />set rsAd = objConn.Execute(sql)<br /><br />' 显示WML内容<br />%＞<br />＜?xml version=&quot;1.0&quot;?＞<br />＜!DOCTYPE wml PUBLIC &quot;-//WAPFORUM//DTD WML 1.1//EN&quot;<br />&quot;http://www.wapforum.org/DTD/wml_1.1.xml&quot;＞<br />＜wml＞<br />＜card id=&quot;bannerad&quot; title=&quot;广告&quot;＞<br />＜p＞<br />＜a href=&quot;＜%=rsAd(&quot;bannerURL&quot;)%＞&quot;＞ ＜%=rsAd(&quot;bannertext&quot;)%＞<br />＜/p＞<br />＜/wml＞<br /></b></td></tr></tbody></table><br />　　好，这样就构成了一个旗帜广告的雏形，下面就是完善它了，只要在任何你想要添加广告的页面，加入一条<br /><br />　　＜!-- #include file=&quot;bannerad.asp&quot; --＞就可以了。<!-- END newscontent --></p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://3c.c.blogbus.com/logs/1807381.html">SMS开发-ASP发送</a> 2006-01-10</div><div><a href="http://3c.c.blogbus.com/logs/1966664.html">短信编程实践</a> 2006-02-23</div><div><a href="http://3c.c.blogbus.com/logs/1966611.html">串口通信</a> 2006-02-23</div><div><a href="http://3c.c.blogbus.com/logs/1966522.html">CMPP的SUBMIT 包的CODE SAMPLE</a> 2006-02-23</div><div><a href="http://3c.c.blogbus.com/logs/1966499.html">短信息发送程序</a> 2006-02-23</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2F3c.c.blogbus.com%2Flogs%2F2021266.html&title=%E7%94%A8ASP%E5%9C%A8WAP%E6%89%8B%E6%9C%BA%E7%BD%91%E9%A1%B5%E4%B8%AD%E6%B7%BB%E5%8A%A0%E6%97%97%E5%B8%9C%E5%B9%BF%E5%91%8A">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://3c.c.blogbus.com/logs/2021266.html</link>
   <author>刺客-长白</author>
   <pubDate>Wed, 08 Mar 2006 15:07:30 +0800</pubDate>
  </item>
  <item>
   <title>WMLBrowser库及其函数</title>
   <description><![CDATA[<p>来源:网络</p><p>9.5  WMLBrowser库及其函数<br />WMLBrowser库提供了使用WMLScript操作WML卡片及WML浏览器的各种功能函数，这些函数为WMLScript和WML的结合使用提供了很好的支持。不过，如果所用系统不支持WML浏览器，或WMLScript的解释器不是由WML浏览器所激活的，那么WMLBrowser库的所有函数均不能进行有效的操作和处理，只能返回无效值invalid。</p><p>WMLBrowser库函数主要包括getCurrentCard、getVar、go、newContext、prev、refresh和setVar函数，下面我们就详细介绍这些函数的功能与用法。</p><p>9.5.1  getVar函数<br />getVar函数用于获取和返回给定变量名的变量值，该变量名由参数name给定，变量名必须遵循WML有关变量命名的语法和规定。如果参数指定的变量不存在，那么函数就会返回空字符串。getVar函数的语法格式如下：</p><p>WMLBrowser.getVar(name)</p><p>其中的参数name必须是字符串形式表示的变量名，变量值也将以字符串的形式返回。如果变量名的语法不正确，那么函数就会返回无效值invalid。</p><p>例如，在下面的几行程序中，变量name被赋值&quot;Good!&quot;，所以当使用getVar函数测试它的变量值的时候，会得到&quot;Good!&quot;的结果。</p><p> </p><p>var name = &quot;Good!&quot;;</p><p>var a = WMLBrowser.getVar(&quot;name&quot;);                      // 返回变量name的值，故a = &quot;Good!&quot;</p><p>9.5.2  setVar函数<br />setVar函数的功能是，在当前浏览器运行的程序中，就给定两个参数name和value进行检验和操作，如果name参数代表的变量名确实存在，那么就将value参数代表的变量值赋给name参数代表的变量，然后返回true；否则，就不赋值，同时返回false。setVar函数的语法格式如下：</p><p>WMLBrowser.setVar(name, value)</p><p>其中参数name和value所代表的变量名及变量值都必须符合WML的语法规定，变量值必须是XML合法的CDATA型数据。如果给定的变量名不符合语法规定或者数值类型不正确，那么函数就会返回无效值invalid。</p><p>例如，当前浏览器运行的WML程序中，我们已经定义了name变量，即程序中确实存在该变量，所以当使用setVar函数进行检验和操作时，就会得到变量名为真(true)的判断，同时会把给定的参数值&quot;Mary&quot;赋给该变量：</p><p>var a = WMLBrowser.setVar(&quot;name&quot;, &quot;Mary&quot;);                          // 返回结果为a = true</p><p>setVar函数赋值的条件是检验的变量名确实存在，而不管该变量是否已经赋值，也不管该变量参与何种运算；而且一旦赋值，该变量在程序以后的运行中均采用新赋的值进行操作或运算。</p><p>9.5.3  go函数<br />go函数用于装入由给定参数url所指定URL地址的内容。它的功能与WML语言的go任务的功能完全相同。该URL的装入是在WML浏览器接收到WMLScript解释器调用操作的结束信息后开始的，即先由WMLScript解释器调用执行当前的go函数，执行完后向WML浏览器发出信息，浏览器随后即装入go函数指定URL地址的内容。如果装入成功，则返回一个空字符串。如果给定的参数url是个空字符串，那么浏览器将无法装入指定内容，同时也返回一个空字符串。go函数的语法格式如下：</p><p>WMLBrowser.go(url)</p><p>其中的参数url需取字符串形式的URL地址。如果给定的URL地址不合法，则go函数就会返回无效值invalid。例如，下面的例子即可使用go函数装入指定URL地址<a href="http://www.host.com/loc/app.dck#start">http://www.host.com/loc/app.dck#start</a>的内容：</p><p> </p><p>var card = &quot;<a href="http://www.host.com/loc/app.dck#start">http://www.host.com/loc/app.dck#start</a>&quot;;</p><p>WMLBrowser.go(card);</p><p>9.5.4  prev函数<br />prev函数的功能是在当前程序执行的过程中，使WML浏览器返回到显示的上一个卡片的内容，它与WML语言的prev任务具有相同的功能。这里的卡片装入也是在WML浏览器接收到WMLScript解释器调用操作的结束信息后开始的，即先由WMLScript解释器调用执行当前的prev函数，执行完后向WML浏览器发出信息，浏览器随后装入prev函数所指定的上一卡片的内容。prev函数的语法格式为：</p><p>WMLBrowser.prev( )</p><p>它没有参数，但它有明确的操作对象，即WML浏览器显示的上一个卡片。与go函数一样，如果装入成功，prev函数也返回一个空字符串。如果WML浏览器前面还没有显示过卡片，即上一卡片的URL地址为空，那么浏览器将不执行prev函数的操作，也不试着装入上一卡片的内容，同时返回一个空字符串。</p><p>其实，prev函数和go函数的调用是相互覆盖的，它们可以在程序将控制权返回给浏览器之前反复地调用、装入指定URL地址的内容，go函数往前调用，而prev函数往后调用。</p><p>9.5.5  newContext函数<br />这是一个比较简单的函数，它的功能是清理当前WML浏览器中的内容并返回空字符串，与WML语言的Newcontext属性具有相同的功能。newContext函数的语法格式为：</p><p>WMLBrowser.newContext( )</p><p>如果当前WML的浏览器存在某些问题而无法清理，函数会返回无效值invalid。</p><p>例如，下面使用newContext函数的语句即可清理当前的WML浏览器内容：</p><p>WMLBrowser.newContext();</p><p>9.5.6  getCurrentCard函数<br />getCurrentCard函数的功能是获取并返回当前浏览器正在运行的卡片的最小的相对路径，其语法格式如下：</p><p>WMLBrowser.getCurrentCard( )</p><p>它没有参数，返回值为字符串形式的相对路径。不过，如果与当前路径对应的目录下没有当前卡片，函数会返回无效值invalid。</p><p>例如，假设当前WML浏览器中显示的是<a href="http://www.mywap.com/script/deck#input">http://www.mywap.com/script/deck#input</a>中的卡片，则使用newContext函数可以获得当前卡片的最小相对路径&quot;deck#input&quot;：</p><p>var a = WMLBrowser.getCurrentCard( );                           // 返回结果为a = &quot;deck#input&quot;</p><p>9.5.7  refresh函数<br />refresh函数的功能是强制WML浏览器更新内容并返回空字符串。在这一点上它与WML语言的refresh任务的功能是完全相同的。其语法格式为：</p><p>WMLBrowser.refresh( )</p><p>它也没有参数，当函数生效时将返回一个空字符串，否则，如果浏览器内容无法更新或其中没有显示卡片，则会返回无效值invalid。</p><p>refresh函数的使用方法十分简单，下面的自定义函数中就利用了refresh函数进行浏览器内容的更新：</p><p> </p><p>function convert2Peso( ) {</p><p>         var dollars = WMLBrowser.getVar(&quot;amount&quot;);</p><p>         var dol2peso = 10.2;</p><p>         var newAmt = dollars*dol2peso;</p><p>         WMLBrowser.setVar(&quot;amount&quot;, newAmt);</p><p>         WMLBrowser.refresh( );</p><p>}</p><p> </p><p>9.6  Dialogs库及其函数<br />Dialogs库提供了3个用于用户交互界面操作与处理的功能函数，即prompt、confirm和alert，下面我们就讲解这3个函数的功能和用法。</p><p>9.6.1  prompt函数<br />prompt函数的功能是显示给定的信息并提示用户输入，当用户输入有效的内容后再将用户输入作为结果返回给调用方。该函数的语法格式为：</p><p>Dialogs.prompt(message, defaultInput)</p><p>它有两个参数，其中message参数是个字符串，它是用户给定的用于显示的信息；defaultInput参数用于接受用户输入，同时它包含了一个初始的数值，如果用户不输入，函数将把该初始值返回，否则，就返回用户的输入值。</p><p>如果参数内容不符合WMLScript的要求，则prompt函数返回无效值invalid。</p><p>看下面使用prompt函数的简单例子：</p><p> </p><p>var a = &quot;13098762345&quot;;</p><p>var b = Dialogs.prompt(&quot;Phone number: &quot;,a);;      &amp;n</p><p><table cellspacing="0" cellpadding="0" width="95%" align="center" border="0"><tbody><tr><td class="newstitle" id="fontzoom" valign="top"><br /><p>bsp;                         // 如果用户输入了13012348765，则返回结果为b=13012348765 </p><p> </p><p><br />它在浏览器上显示的结果是：Phone number: 13098762345，如果用户想输入新电话号码，则可在现有号码&quot;13098762345&quot;处直接输入，新输入的号码将替换原有的号码，prompt函数在最后还会将新输入的号码返回。</p><p>9.6.2  confirm函数<br />confirm函数用于提供确认功能，它首先显示给定的message参数所包含的信息，并提供两个可选择的回答“ok”和“cancel”，然后等待用户选择其中的一个。如果用户选择“ok”则返回true；否则，如若选择“cancel”则返回false。该函数的语法格式如下：</p><p>Dialogs.confirm(message, ok, cancel)</p><p>它有3个参数，其中参数message是欲显示的字符串形式的提示信息；参数ok也是用于显示的一个字符串信息，它可以是“OK”，也可以是其他表示OK意义的文本信息，如“I Agree”、“I Like”等等；同样，参数cancel也是用于显示的字符串信息，可以是“Cancel”文本，也可以是其他表示Cancel意义的文本信息。</p><p>正常情况下，confirm函数的返回结果是布尔型的true或false。如果用户选择错误或拟显示的信息非法，则函数返回无效值invalid。</p><p>下面就是使用confirm函数的简单例子：</p><p> </p><p>function onAbort( ) {</p><p>         return Dialogs.confirm(&quot;Are you sure?&quot;, &quot;Yes&quot;, &quot;No&quot;);</p><p>};</p><p> </p><p>它显示的结果是：Are you sure?  Yes  No</p><p>其中的“Yes”、“No”是可以选择的，且confirm函数将根据用户选择的结果返回true或false。</p><p>9.6.3  alert函数<br />alert函数的功能是显示给定的message信息给用户，并等待用户的确认，最后返回空字符串作为结束。其语法格式为：</p><p>Dialogs.alert(message)</p><p>如果用户操作错误或浏览器显示有问题，则alert函数会返回无效值invalid。</p><p>下面就是使用alert函数的简单例子：</p><p> </p><p>function testValue(textElement) {</p><p>         if (String.length(textElement) &gt; 8) {</p><p>                   Dialogs.alert(&quot;Enter name &lt; 8 chars!&quot;);</p><p>         };</p><p>};</p><p>它的作用是，对用户输入名字的长度进行判断，该名字存放在变量textElement中。如果多于8个字符，则使用alert函数显示输入名字必须少于8个字符的信息：&quot;Enter name &lt; 8 chars!&quot;。</p><p>9.7  WMLScript非标准库及其库函数<br />以上各节我们介绍的都是WMLScript的标准库函数，事实上，WMLScript还有一些非标准库函数。这些函数通常是由不同的WAP设备厂家制定并提供的，而且因厂家不同而不同，所以称为“非标准”的库函数。例如，Nokia提供了Debug库函数，Phone.com提供了Console库函数，等等。虽然这些库的名称不同，但涉及的功能函数却是基本一致的，它们主要是为用户操作提供一些辅助功能。下面我们就以Debug库为例介绍3个比较典型的非标准库函数。</p><p>9.7.1  openFile函数<br />openFile函数的功能是为文件读、写或追加等操作而打开一个文件。它的语法格式为：</p><p>Debug.openFile (fileName, mode)</p><p>它有两个参数，其中fileName参数通常以字符串的形式来指定要打开的文件名，可以包含文件所在的路径名称；mode参数用于指定打开文件后的操作方式，共3种选择：&quot;r&quot;指定打开的文件用于读操作，&quot;w&quot;指定文件用于写操作，&quot;a&quot;指定文件用于追加操作。</p><p>正常情况下，openFile函数的返回结果为空字符串。如果指定的文件不存在，或文件的操作方式不对，或文件无法操作，那么openFile函数都会返回无效值invalid。</p><p>如果给定的fileName和mode参数值的形式不是字符串形式，那么openFile函数也会返回无效值invalid。</p><p>下面就是使用openFile函数打开指定文件并进行不同操作的例子：</p><p> </p><p>Debug.openFile(&quot;c\\tmp\\script.debug&quot;, &quot;r&quot;);</p><p>Debug.openFile(&quot;c:\\tmp\\debug&quot;, &quot;a&quot;):</p><p> </p><p> </p><p>9.7.2  closeFile函数<br />openFile函数用于打开文件，当对文件操作完毕后必须关闭文件，否则就会引起文件处理错误甚至破坏文件，那么如何关闭文件呢？方法就是使用closeFile函数。该函数没有参数，它用于关闭当前打开的文件，语法格式为：</p><p>Debug.closeFile ( )</p><p>它的返回值为空字符串。下述语句就是使用closeFile函数关闭当前文件的例子：</p><p> </p><p>Debug.openFile(&quot;c\\tmp\\script.debug&quot;, &quot;r&quot;);</p><p>…………(其他语句)</p><p>Debug.closeFile ( );</p><p>……</p><p>Debug.openFile(&quot;c:\\tmp\\debug&quot;, &quot;a&quot;):</p><p>…………(其他语句)</p><p>Debug.closeFile ( );</p><p> </p><p>9.7.3  println函数<br />println函数用于输出给定的字符串string中的信息。如果当前系统中存在由openFile函数打开的文件，则println函数将该信息直接写入这一打开的文件；否则，println函数就将该信息送往标准的输出设备，如显示器、打印机等，然后再由这些设备输出给用户。该函数的语法格式如下：</p><p>Debug.println(string)</p><p>如果给定的string信息能够正常输出，则println函数返回一个空字符串；否则，如若输出信息类型不符合要求，或当前系统中不存在合法的打开文件或输出设备，则println函数返回无效值invalid。</p><p>下述语句就可以利用println函数向当前打开的文件或输出设备中输出指定的信息：</p><p> </p><p>Debug.println(&quot;Function f1 ENTRY ...&quot;);                  // 输出&quot;Function f1 ENTRY ...&quot;</p><p>Debug.println(&quot;Function f1 EXIT ...&quot;);            // 输出&quot;Function f1 EXIT ...&quot;<br /></p></td></tr></tbody></table></p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://3c.c.blogbus.com/logs/1819416.html">WAP 手机及开发技术调研</a> 2006-01-13</div><div><a href="http://3c.c.blogbus.com/logs/1783032.html">移动通信:WAP技术研究综述</a> 2006-01-03</div><div><a href="http://3c.c.blogbus.com/logs/1783024.html">移动通信:10种无线技术全接触</a> 2006-01-03</div><div><a href="/logs/1799823.html">Symbian OS C++程序员编码诀窍-系统资源的使用（ROM 和 RAM）</a> 2006-01-07</div><div><a href="/logs/1737353.html">java前沿技术</a> 2005-12-22</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2F3c.c.blogbus.com%2Flogs%2F2021246.html&title=WMLBrowser%E5%BA%93%E5%8F%8A%E5%85%B6%E5%87%BD%E6%95%B0">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://3c.c.blogbus.com/logs/2021246.html</link>
   <author>刺客-长白</author>
   <pubDate>Wed, 08 Mar 2006 14:53:37 +0800</pubDate>
  </item>
 </channel>
</rss>
