09-10秋学期网络工程大作业
来源:百度文库 编辑:神马文学网 时间:2024/03/29 07:29:38
前言:今年的探究式作业很多组都做得很好,成效显著,由于文件太大,这篇网页摘录了部分,全部可点击进入
09-10秋学期网络工程大作业
基于Google android 平台上的
软件设计研究
作者(学号) 买日达江(1071000095)
作者(学号) 阿姨仙古(1071000065)
作者(学号) 哈拉哈市 (1071000302)
中文摘要
Android是一个针对移动设备的程序集,。其中包括一个操作系统, 一个中间件和一些关键性应用.本文首先介绍Androit 平台和它的发展历史,概览了Android SDK提供的工具和APIs, 当您在使用Java语言来开发Android平台的应用时您会用到它们。然后介绍基于windows操作系统的开发环境然后介绍,最后通过实例介绍基于该平台的软件设计的原理和开发过程。
关键词:
Android Android SDK Java windows操作系统 APIs。
第一章 认识Android
1.1 什么是Android
在可见的将来,基于Android 平台的手机程式设计,将像今日的PC 程式设计一样普及。
「Android」是一个基于Linux 核心(kernel)的开放手机平台作业系统。与Windows Mobile、Symbian 等手机作业系统处在同一级别。
对于设备制造商来说,「Android」是一个免费的平台。「Android」作业系统让设备制造商免除「每出一台手机,就得被手机作业系统厂商(如MicroSoft)收取费用」的情况。
对硬体开发厂商来说,「Android」也是个开放的平台。只要厂商有能力,可以在这个平台上自由加入特有的装置或功能,不受手机作业系统厂商的限制。
对于手持装置的开发者来说,「Android」是个先进的平台。平台上的应用程式可相容于各种型号的Android 手机,免去为各种不同手机机型开发的困扰。「Android」平台支援各种先进的网路、绘图、3D 处理能力,可以用来提供更好的使用者体验。
对于使用者来说,「Android」是一个用于手机的作业系统。使用者只要先申请一个免费的Google 帐户,当使用者想换一台手机时,就可以在不同厂牌,同样使用「Android」作业系统平台的手机之间选择,并且很容易地将如联络簿等个人资料转换到新手机上。
Android 在Linux 核心的基础上,提供了各种合用的函式库,和一个完整的应用程式框架。并采用较符合商用限制的Apache 版权。在Linux 核心的基础上提供Google 自制的应用程式运行环境(称作Dalvik,与Sun 的J2ME 不同),并提供基于Eclipse 整合开发环境(IDE)的免费、跨平台(Windows、Mac OS X、Linux) 开发工具(SDK),便于应用程式开发者学习、使用。
免费、熟悉的跨平台开发工具,让具备一些物件导向观念,或视窗程式开发经验的开发者,能在一定时间内上手。1000 万美元的大奖赛则提供了足够的诱因,让第一支Android 手机正式面市前,就拥有了各式各样的应用程式可供使用。
从不同角度来说,Android 代表着
一个崭新的开放原始码作业系统平台、
一个友善的免费应用程式开发环境、
一个与世界各地的程式开发者,站在相同起跑点上的公平竞争机会。
1.2 android的发展历史
紧接着,在Android 平台公布的一周之后(11 月12 日),Google 随即发布了可以免费自由下载,能在Windows、Mac OS X 、Linux 多平台上使用的Android 软体开发工具(SoftwareDevelopment Kit, SDK)与相关文件。间隔数天,又再次发布作业系统核心(kernel),与部分驱动程式的原始码。一歩歩展示Google 欲将手机这个现代人的随身工具推往开放平台,让人们可以自由修改创作出符合自己需求的手机应用的决心。
身为Google 公司创办人之一的Sergey Brin,也在Android 软体开发工具(SDK)发布的同时,现身于视讯广告影片中,为大众介绍Android 平台。Sergey Brin 也同时宣布举办总奖金高达1000 万美元(3 亿多台币)的开发者大奖赛,鼓励程式开发者去深入探究Android 平台的能力。写出具创意、实用性十足、能提供使用者更好的手机使用经验的应用程式。
目前有15 亿使用者可以透过电脑,在网路上看到Google 广告。
若手机使用者也能上网,其潜在使用者则可以达到30 亿。
第二章 Android开发环境搭建
2.1开发环境的搭建
编写Android 的应用程式,需要一套个人电脑系统。至于作业系统的部份,几个主流作业系
统都有支援。
支援的作业系统如下:
Windows XP 或Vista
Mac OS X
Linux(官方于Ubuntu 6.10 Dapper Drake 上测试)
我们需要安装一些Android 开发环境所需的程式工具,这些工具都是可以免费上网取得的:
JDK5.0或者JDK6.0,Eclipse IDE,Andoid SDK,ADT。
本文使用的是 windows xp SP3,JDK6.0, Eclipse 3.4,Android SDK 2.0 和 ADT
1.安装JDK
双击JDK安装文件后打开安装向导,接受许可证如图 2.1所示。
图2.1 接受许可 图2.2 选择组件和安装路径
选择要安装的的组建和安装的路径如入2.2所示。然后单击“下一步”按钮,就可以自动完成安装,这里不做详细描述,最后检查一下是否安装成功。
单击“开始”,选择“运行”,在出现的对话框中输入CMD命令,打开CMD窗口,在CMD窗口中输入JAVA –VERSION,如果屏幕出现如图2.3一样的代码信息,说明JDK安装成功了;
图 2.3 检查jdk
2 .安装Eclipse
安装好JDK 以后就可以安装Eclipse 了 ,打开Eclipse下载页面,具体网址http://www.eclipse.org/downloads/.
下载完成后,找到下载的压缩包解压此压缩文件就可以用不用安装,不过一定要先安装JDK。
进入解压后的目录,就可以看到一个名为“eclipse。exe”的可执行文件,双击此文件直接运行,eclipse 能自动找到用户先期安装的JDK路径。
如果用户第一次安装,启动eclipse,将会看到选择工作空间的提示,如图2.4所示。
按钮,至此,JDK和Eclipse已经安装完毕。
图 2.4 选择工作空间
3.安装ADT
Android 为Eclipse 提供了一个插件,即Android Development tools(ADT),目的是为用户提供一个强大的综合环境用于开发android应用程序,ADT扩展了Eclipse的功能,可以让用户快速地建立Android项目,创建应用程序界面,在基于Android框架API的基础上添加组件,以及用SDK工具集调试应用程序,甚至导出签名的APKS以及便发行应用程序。
安装Android Development Tools plug-in 打开 Eclispe IDE,依次单击 Menue项中的Help--->Install New Software。。如图2.5所示。
在弹出的对话框中,选择“Available Software”标签。单击“Add。。“按钮如图2。6所示。
图2.6Add 界面
弹出如图2.7界面是选择“Archive“按钮,然后找到ADT插件,会出现图2.7中的location里面的文字,然后单击OK。
图2.7 ADD SITE界面
重启eclipse。
图2.8可用的插件
图 2.9重启Eclipse界面
4.安装 Android SDK
首先打开Android开发者社区,对应的网址为http://developer.android.com 。 转到SDK下载页面下载Android SDK 最新版本为2.0。
启动Eclispe 在windows 菜单里面出现了一个如图2.10一样的androd sdk and avd maneger菜单项。
图 2.10 androd sdk and avd maneger
单击androd sdk and avd maneger然后 弹出Andoid SDK AVD Maneger界面,在Available Package中选择全部然后单击“Install Selected”按钮安装Android SDK;
图 2.11Android SDK and AVD maneger界面
5.设定 Android SDK Home
安装完插件和SDK后还要做如下配置才可以使用Eclispe创建Android项目,需要设计Andoid SDK主目录。依次单击“windows-àperformance”项如入图2.12所示。
图 2.12 单击“performance”界面
在弹出的界面左侧可以看到“Android”项,选中Androi以后,在右侧设定AndroidSDK所在的目录为 SDK Location,单击OK按钮完成安装,如图2.13所示。
图2.13 设置SDK路径界面
2.2 创建模拟器
在Android SDK1.5以后的版本中,必须创建至少一个AVD,AVD的全称为Android 虚拟设备(Android Virtual Device),每个AVD模拟了一套虚拟设备来运行Android 平台,这个平台至少要有自己的内核,系统图像和数据分区,还可以有自己的SDK卡和用户数据以及外观显示等。
创建模拟器方法如下:
打开Eclispe 在windows->Android SDK and AVD Manager 界面,里面选择Virtual Device 选卡 然后按“New”按钮如下图2.14所示
图2.14 创建模拟器界面
然后按Create AVD 按钮来完成模拟器的创建。
创建模拟器后会出现如下12.16所示的界面里面展示已经创建的模拟器的名称。选择模拟器后单击 start 按钮运行模拟器。
图 12.15 模拟器选项界面
图 12.16创建模拟器运行界面。
图12.17 模拟器选择界面
图12.18 模拟器界面
当启动模拟器的时候会出现12.18所示的界面。这个是正在启动的界面这个会需要一两分钟的比较长的时间。当模拟器完全启动的时候会出现图12.19所示的界面。
图12.19完全启动的模拟器界面
目前为止我们完全安装完了Android SDK开发环境到时候要测试我们的环境的时候了。
2.3测试Android开发环境
开发环境搭配完成,下面需要新建一个项目来验证开发环境是否可以正常工作,依次选择FileàNew—>Other项,如图12.20所示。
图 12.20 新建项目选择界面。
在弹出的对话框中选择AndroidàAndroid Project然后单击Next 进入创建项目界面如图12.21所示。
图12.21选择项目界面
在弹出的界面了输入项目名称,应用程序名称,包名称注意 包的名称是用一个或多个点分开名称,然后是Activity名称就是界面名称,然后是SDK版本,2表示1.1版本 ,3表示1.5版本 ,4表示1.6版本5表示2.0版本然后单击finish完成创建项目。如图12.22所示
图12.22 输入创建项目名称界面
打开RunàRun Configuurations 进入选择模拟器界面如图12.23所示选择我们创建的项目要运行的模拟器以后单击Run 按钮运行项目。运行结果如图12.24所示如果出现图12.24所示的结果表明环境搭配成功否则请检查环境。
图12.23 选择模拟器界面
图12.24 运行结果
至此,在Windows平台上的开发环境搭建完成,安装了JDK,Eclispe ,ADT,Android SDK
并进行了SDK Home的配置,创建了一个Android 虚拟设备AVD。
第三章 Android SDK介绍
3.1Android SDK基础
Android SDK (Software Development kit)提供了在windows/inux/mac 平台上开发Android 应用的开发组件,也就是说,不论读者用什么样的平台都可以开发出Android 应用软件,其包含了在Android 平台上开发移动应用的各种工具集。它不仅包含了Android模拟器和用于Eclipse的Android开发工具插件,而且包括了各种用来调试,打包何在模拟器上安装应用工具。
Android SDK 主要以java 语言为基础。用户可以使用java 语言来开发Android平台上的软件应用。通过SDK提供的一些工具将其打包成android平台应用的apk文件,然后在使用SDK中的模拟器来模拟和测试该软件在Android平台上运行情况和效果。
3.2Android SDK目录结构
首先来看下SDK的目录结构,这有助于从全局把握SDK,为后面的深入学习打下好基础。
新的Android 2.0版本SDK目录结构和以前版本有着较大的区别。首先需要说明的是,Android 1.5版本的SDK增加了对多版本平台的支持,在platforms下可以看到,其中包含android 1.1和android1.2也就是说Android 1.5版本的SDK可以前容以前的1.1版本。
另外dd-ons 目录下的google-apis-3是Google提供的API包,其中主要是Google Map的API,documentation。Html和docs目录下的是文档;RELEASE_NOTES。Html是SDK的发布说明;usb-driver目录下包含了amd64和x86下的驱动文件;tools目录下包含一些通用的工具文件。
Platforms目录下针对每个版本的SDK版本提供了其相对应的API包以及一些实例文件,这里主要列举了android 1.5文件夹下的内容,其中android。Jar是包含全部API的压缩包,samples 目录下SDK附加的一些例子;skins目录下包含其支持的几种外观样式,如HVGA(default),HVGA-L,HVGA-P,QVGA-P,QVGA-P;templates目录下是一些常用的文件模板;tools目录下是一些非常实用的工具和辅助工具。
3.3 ndroi.jar及内部结构
Android.jar是一个标准的压缩包,其中包含的是编译后的class文件,包含了全部的API,我们使用Windows系统的压缩工具winrar打开此压缩文件,可以看到内部架构如图3.1和3.2所示。
图
图3.2内部的class文件
从上面的两张图可以了解API的包结构的划分,如app,content,database,graphics,hardware等,也就是大致了解了其模块的划分结构,有了这种印象,有助于我们阅读和查阅SDK文档。
3.4 SDK文档
通过解压android.jar文件,大致了解了其内部的API的包结构和组织方式,如果想深入的了解各个文件包内包含的API以及每个API的用法,那我们必须阅读和查找SDK文档,实用IE浏览器打开SDK目录下的documentation.html文件可以看到如图3.3所示的界面。
3.4SDK文档首页
第四章 Android应用程序结构介绍
4.1Android体系结构介绍
Android作为移动设备的开发平台,其软件层次结构包括了一个操作系统(0S),中间件和应用程序。Android的软件框如图4.1所示其软件层次结构自上而下可以分为一下几个层。
图4.1Android系统架构
应用程序(Application);
应用程序框架(Applicaion Framework);
各种库(Libraries)和Android运行环境(RunTime);
Linux 内核;
1. 应用程序
Android 会同一系列核心应用程序包一起发布,该应用程序包包括email 客户端,SMS 短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA 语言编写的。
2. 应用程序框架
开发人员也可以完全访问核心应用程序所使用的API 框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。
隐藏在每个应用后面的是一系列的服务和系统, 其中包括;
• 丰富而又可扩展的视图(Views),可以用来构建应用程序, 它包括列表(lists),网格(grids), 文本框(text boxes),按钮( buttons), 甚至可嵌入的web 浏览器。
• 内容提供器(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据
• 资源管理器(Resource Manager)提供非代码资源的访问,如本地字符串,图形,和布局文件( layoutfiles )。
• 通知管理器(Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息。
• 活动管理器( Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。
3. 各种库和Android运行环境
Android 包含一些C/C++库,这些库能被Android 系统中不同的组件使用。它们通过Android 应用程序框架为开发者提供服务。以下是一些核心库:
• 系统C 库- 一个从BSD 继承来的标准C 系统函数库( libc ), 它是专门为基于embedded linux的设备定制的。
• 媒体库- 基于PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
• SurfaceManager - 对显示子系统的管理,并且为多个应用程序提供了2D和3D 图层的无缝融合。
• LibWebCore - 一个最新的web 浏览器引擎用,支持Android 浏览器和一个可嵌入的web 视图。
• SGL - 底层的2D图形引擎
• 3D libraries - 基于OpenGL ES 1.0 APIs 实现;该库可以使用硬件3D 加速(如果可用)或者使用高度优化的3D 软加速。
• FreeType -位图(bitmap)和矢量(vector)字体显示。
• SQLite - 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。
Android 运行库
Android 包括了一个核心库,该核心库提供了JAVA 编程语言核心库的大多数功能。每一个Android 应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik 虚拟机实例。Dalvik 被设计成一个设备可以同时高效地运行多个虚拟系统。Dalvik 虚拟机执行(.dex)的Dalvik 可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA 编译器编译,然后通过SDK中的"dx" 工具转化成.dex 格式由虚拟机执行。Dalvik 虚拟机依赖于linux 内核的一些功能,比如线程机制和底层内存管理机制。
4.linux内核
Android 的核心系统服务依赖于Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。Linux 内核也同时作为硬件和软件栈之间的抽象层。
4.2Android应用程序组成
一般来说Android主要有下列4部分组成,它们分别是:
1. Activity
Activity可以算是开发者遇到的最频繁的,也是Android当中最基本的模块之一。在Android的程序当中,Activity一般代表手机的屏幕的一屏。如果把手机比做一个浏览器,那么Activity就相当于一个网页,在Activity当中我们可以添加一些View,并且可以对这些View做一些事件的处理。一般一个Android应用是由多个Activity组成的,这多个Activity之间可以进行相互跳转,例如,按一个Button按钮后,可能跳转到其他的Activity。Activity之间的跳转可能有返回值。
当打开一个新的屏幕时,之前一个屏幕被设置为暂停状态,并且压入历史堆栈中。用户可以通过回退操作返回到以前打开过的屏幕。我们可以选择性的移除一些没有必要保留的屏幕,因为Android会把每个应用的开始到当前的每个屏幕保存在堆栈中。
2. Intent和Intent Filters
Intent在Android应用中是相当重要的。一个Intent就是一次对将要执行的操作的抽象描述。Intent作用有三种。通过Intent我们可以做多个Activity之间进行跳转。下边是实现Activity跳转代码,我们大概看一下在这里假设有两个Activity,一个是ActivityA,另一个是ActivityB,代码如下所示:
Intent in=new Intent(A.this,B.class);
startActivity(in);
通过执行这两句代码,就可以实现从ActivityA跳转到ActivityB.
通过broadcast intent机制可以将一个Intent 发送给任何对这个Intent感兴趣的BroadcastReceiver。
通过startService(Intent)或bindService(Intent,ServiceConnection,int)来和后台的Service进行交互。
与Intent有关系的一个类叫做Intent Filters。如果说Intent 是一个有效请求,一个Intent Filters则用于描述一个Activity能够操作那些Intent。一个Activity如果要显示一个人的联系方式时,需要声明一个Intent Filters,这个Intent Filters要知道怎么样去处理VIEW动作和表示一个人的URI。Intent Filters一般在AndroidManifest。Xml中定义。
3. Broadcast Intent Receiver
可以实用BroadcastReceiver 来让应用对一个外部事件做出响应。这是非常有意思,例如电话呼入这个外部事件到来的时候,可以利用BroadcastReceriver进行处理。例如当下载一个程序成功的时候仍然可以利用BroadcastReceiver进行处理。BroadcastReceiver不能生成UI,也就是说对于用户来说不是透明的,用户是看不到的。BroadcastReceiver通过NotificationManager来通知用户这些事情。BroadcastReceriver既可以在AndroidManifest。Xml中注册,也可以在运行时代码中实用Context。RegisterReceiver()进行注册。只要是注册了,当时间来的时候,即使程序没有启动,系统会在需要的时候启动程序。各种应用还可以在使用Context。SendBroadcast()将它们自己的intent Broadcast广播给其他应用程序。
4. Service
Service是一种程序,它可以运行很长的时间,但是它却没有用户界面。比如说打开一个音乐播放器的程序,这和时候若想上网了,那么 我们打开Android浏览器,这个时候虽然我们已经进入了浏览器这个程序,但是,歌曲的播放器并没有停止,而是在后台连续的播放。当然这个播放音乐的Service也可以停止。通过startService(Intent service)来启动一个sevice,通过Context.bindService()可以绑定一个Service,stopService(Intent serivice)来停止一个service。
5. Content Provider
Android系统中数据是私有的,当然这些数据包括文件数据和数据库数据,以及一些其他类型的数据。一个Content Provider实现了一组标准的方法接口,从而能够其他的应用保存或读取词Content Provider的各种数据类型。
一个程序可以通过实现一个Content Provider的抽象接口将自己的数据暴露出去。外界可以通过一套标准而统一的接口和程序里的数据打交道,可以读取数据,也可以删除数据。下边列举一些叫常见的接口。
query(uri,string[],string,string[],string);通过关键子查询数据。
Insert(Uri,ContentValues);将一组数据插入到指定的地方。
Update(Uri,ContentValues,String,String[]);更新数据。
Delete(Uri,String,String[]);删除数据。
4.3Android应用工程文件组成
现在我们看一个典型的工程文件是什么样子的,如图4.2所示。
我们大致的了解一下项目里边的每一部分构成。
源文件(包含Activity)。源文件都在上边的src目录中,在上边只有一个HelloWorld.java。
R.java文件。这和文件是Eclispe自动生成的,应用开发者不需要去修改它,里边内容的修改也是Eclipse自动来处理。R文件对与应用开发这来说基本上没有用,但是对Android系统来说非常有用。在这个文件中,Android对下边即将介绍的资源进行了全局索引。在下边的res文件夹中,内容发生变化是R。java都会重新编译,同步更新。
AndroidLibrary 。这个是应用运行的Android库。图4.2所示的项目用的是Android
assets目录。这个目录里主要放置多媒体等一些文件。
res目录。这个目录放置应用程序用到的资源文件。里面分五个目录进行存放当过这个 目录中的资源文件发生变化时R文件页发生变化。
Drawable目录。这个目录主要放置图片资源。
Layout目录。这个目录主要放置布局文件这些布局文件都是XML文件。
Values目录。这个目录主要放置字符串,颜色,数组。
AndroidManifest。Xml。这个文件相当重要,应用所用到的Activity,
图4.2HelloWorld工程文件结构
Service,以及receiver等。
第五章 Android基本组件介绍
5.1视图组件(View)
在Android当中View里边是最基本的一个UI类,基本上所有的高级UI组件都是继承View类而实现的,例如Textview以及Button(按钮),List(列表),EditText(文本框),RadioButton(多选按钮),Checkbox(选择框)等都是View类.
一个View在屏幕上占据了一块矩形区域,他负责渲染这块矩形区域,也可以处理这块矩形区域发生的事件,并且可以设置这块区域是否可见,是否可以获取焦点等。
5.2视图容器组件(Veiwgroup)
一个Viewgroup对象是一个Android。View。viewgroup的实例。就像它的名字显示的意思一样,它的作用就是View的容器,它负责对添加进Viewgroup的这些View进行布局。当然一个Viwgroup也可以加入到另一个Veiwgroup里边,因为Viewgroup也是继承于View。Viewgroup类,他是一个抽象类,也是其他容器类的基类。
5.3布局组件(layout)
Viewgroup的实现类比较多,在这里介绍最常用的两个实现类。一个是LinearLyout,他可以进行水平布局或者竖直布局。如果LinearLyout的布局方向设置为vertical那么表明是竖直布局。也就是说先加入进去的View会显示在顶端,后加入的View会显示在底端,如果设置为horizontal那表明是水平布局,也就是从左到右依次进行列布局。
RelativeLayout负责相对布局,用过Css编程的用户应该知道,在Css中经常会用到相对布局,例如,设置A显示在B的左侧,那么B的显示坐相对于A的位置。
5.4布局参数(LayoutParams)
一个view加入到一个Viewgroup里边,例如加入到RelativeLayout里边,那么他在这个RelativeLayout里边怎么样显示的呢?里边?左边?右边?还是上边?在将每一个View加入到这个RelativeLayout里边的时候,我们会传递一组值(如果没有传递值,系统会用默认值)这组值封装在LayoutParams这个类当中。在显示这个View的时候它的容器会根据传进来的LayoutParams进行计算,来确认这个View显示的大小和位置。
第六章 Android实例:登陆月球
在这章我们用经典游戏登陆月球来介绍怎么样开发一个Android应用程序。
登陆月球的游戏操作很简单,按向上键来开始游戏,使用手机中的箭头键来挑调整航天飞机的降落方向,然后按中间的空白键来减速喷射引擎。最后
在画有一条路线的月球表面就算成功。如上面得图所示。画面最左角的路线是燃料,中间的绿色长条是速度,当中间的绿色长条变浅绿色就代表速度太快乐,必须按空白键一减速,这样才不会失速摧毁。
了解登月游戏后,现在看看它的源代码是如何让编写的?
首先打开LunarLander.java主程序源代码可以看到源代码由声明LunarLander为Activity的子类开始,然后定义游戏菜单模式有难度设置,如EASY,HARD,或MEDIUM,还有暂停,连续,开始与停止的选项,其中最重要的是LunarThread声明mLunarThread为member family变量用来控制图像文件,LunarView则是实用mLunarView来控制游戏的显示功能。
ublic class LunarLander extends Activity {
private static final int MENU_EASY = 1;
private static final int MENU_HARD = 2;
private static final int MENU_MEDIUM = 3;
private static final int MENU_PAUSE = 4;
private static final int MENU_RESUME = 5;
private static final int MENU_START = 6;
private static final int MENU_STOP = 7;
private LunarThread mLunarThread;
private LunarView mLunarView;
。。。。。。。。
}
然后在源代码使用onCreateOptionMenu()与onOptionItemSelected()函数来控制游戏的菜单,以及onCreate()创建Activity,并采用onPause()与onSaveInstanceState()来控制词游戏的Activi生命周期。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, MENU_START, 0, R.string.menu_start);
menu.add(0, MENU_STOP, 0, R.string.menu_stop);
menu.add(0, MENU_PAUSE, 0, R.string.menu_pause);
menu.add(0, MENU_RESUME, 0, R.string.menu_resume);
menu.add(0, MENU_EASY, 0, R.string.menu_easy);
menu.add(0, MENU_MEDIUM, 0, R.string.menu_medium);
menu.add(0, MENU_HARD, 0, R.string.menu_hard);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_START:
mLunarThread.doStart();
return true;
case MENU_STOP:
mLunarThread.setState(LunarThread.STATE_LOSE,
getText(R.string.message_stopped));
return true;
case MENU_PAUSE:
mLunarThread.pause();
return true;
case MENU_RESUME:
mLunarThread.unpause();
return true;
case MENU_EASY:
mLunarThread.setDifficulty(LunarThread.DIFFICULTY_EASY);
return true;
case MENU_MEDIUM:
mLunarThread.setDifficulty(LunarThread.DIFFICULTY_MEDIUM);
return true;
case MENU_HARD:
mLunarThread.setDifficulty(LunarThread.DIFFICULTY_HARD);
return true;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// turn off the window's title bar
requestWindowFeature(Window.FEATURE_NO_TITLE);
// tell system to use the layout defined in our XML file
setContentView(R.layout.lunar_layout);
// get handles to the LunarView from XML, and its LunarThread
mLunarView = (LunarView) findViewById(R.id.lunar);
mLunarThread = mLunarView.getThread();
// give the LunarView a handle to the TextView used for messages
mLunarView.setTextView((TextView) findViewById(R.id.text));
if (savedInstanceState == null) {
// we were just launched: set up a new game
mLunarThread.setState(LunarThread.STATE_READY);
Log.w(this.getClass().getName(), "SIS is null");
} else {
// we are being restored: resume a previous game
mLunarThread.restoreState(savedInstanceState);
Log.w(this.getClass().getName(), "SIS is nonnull");
}
}
protected void onPause() {
super.onPause();
mLunarView.getThread().pause(); // pause game when Activity pauses
}
protected void onSaveInstanceState(Bundle outState) {
// just have the View's thread save its state into our Bundle
super.onSaveInstanceState(outState);
mLunarThread.saveState(outState);
Log.w(this.getClass().getName(), "SIS called");
}
}
然而LunarLander游戏的重点在第二个源代码LunarView.java中,航天飞机的所有动作都在此代码中操作,主要有导入android。Graphics。drawable。Drawable类的draw()函数负责航天飞机动画绘制,而invalidate()函数则会重新调用draw()函数,以不断绘制航天飞机图标到达航天飞机降落的效果,并且将画面的左下角当做坐标(0,0),记录航天飞机的x,y,dx,dy坐标位置,整个绘制的源代码定义在LunarThread()函数中。
public LunarThread(SurfaceHolder surfaceHolder, Context context,
Handler handler) {
// get handles to some important objects
mSurfaceHolder = surfaceHolder;
mHandler = handler;
mContext = context;
Resources res = context.getResources();
// cache handles to our key sprites & other drawables
mLanderImage = context.getResources().getDrawable(
R.drawable.lander_plain);
mFiringImage = context.getResources().getDrawable(
R.drawable.lander_firing);
mCrashedImage = context.getResources().getDrawable(
R.drawable.lander_crashed);
// load background image as a Bitmap instead of a Drawable b/c
// we don't need to transform it and it's faster to draw this way
mBackgroundImage = BitmapFactory.decodeResource(res,
R.drawable.earthrise);
// Use the regular lander image as the model size for all sprites
mLanderWidth = mLanderImage.getIntrinsicWidth();
mLanderHeight = mLanderImage.getIntrinsicHeight();
// Initialize paints for speedometer
mLinePaint = new Paint();
mLinePaint.setAntiAlias(true);
mLinePaint.setARGB(255, 0, 255, 0);
mLinePaintBad = new Paint();
mLinePaintBad.setAntiAlias(true);
mLinePaintBad.setARGB(255, 120, 180, 0);
mScratchRect = new RectF(0, 0, 0, 0);
mWinsInARow = 0;
mDifficulty = DIFFICULTY_MEDIUM;
// initial show-up of lander (not yet playing)
mX = mLanderWidth;
mY = mLanderHeight * 2;
mFuel = PHYS_FUEL_INIT;
mDX = 0;
mDY = 0;
mHeading = 0;
mEngineFiring = true;
}
LunarView.java源代码中使用content。getResource()函数取得绘制各式各样的航天飞机样式的图案,然后使用getDrawable()函数绘制航天飞机降落,升空的图案,并采用BitmapFactory。DecoderResource()函数装入会有地球/月球的游戏背景图案,使用Paint()函数绘制绿色燃料与速度长条。
该游戏的难易度设置源代码也在LunarView。Java这个文件中。游戏一开始的难易度默认为Medium模式,如果改为EASY模式,测燃料量增加为3/2,着地露出色长条变为4/3,下降速度测调为Medium的3/2倍速也不会毁灭。反之若调为HARD模式测燃料量变少,着地线变短,着地速度页也要变慢。开发者自行条整源代码以设置游戏的难易度。
public void doStart() {
synchronized (mSurfaceHolder) {
// First set the game for Medium difficulty
mFuel = PHYS_FUEL_INIT;
mEngineFiring = false;
mGoalWidth = (int) (mLanderWidth * TARGET_WIDTH);
mGoalSpeed = TARGET_SPEED;
mGoalAngle = TARGET_ANGLE;
int speedInit = PHYS_SPEED_INIT;
// Adjust difficulty params for EASY/HARD
if (mDifficulty == DIFFICULTY_EASY) {
mFuel = mFuel * 3 / 2;
mGoalWidth = mGoalWidth * 4 / 3;
mGoalSpeed = mGoalSpeed * 3 / 2;
mGoalAngle = mGoalAngle * 4 / 3;
speedInit = speedInit * 3 / 4;
} else if (mDifficulty == DIFFICULTY_HARD) {
mFuel = mFuel * 7 / 8;
mGoalWidth = mGoalWidth * 3 / 4;
mGoalSpeed = mGoalSpeed * 7 / 8;
speedInit = speedInit * 4 / 3;
}
最后游戏还要编写控制键盘源代码,让玩家可以通过箭头键盘操作这款游戏。这样的源代码有dokeyDown()与doKeyUp()函数控制键盘动作。到此位置我们基本上完成Android游戏设计了,包括游戏菜单设置,游戏画面绘制,难易度设置与键盘控制。
boolean doKeyDown(int keyCode, KeyEvent msg) {
synchronized (mSurfaceHolder) {
boolean okStart = false;
if (keyCode == KeyEvent.KEYCODE_DPAD_UP) okStart = true;
if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) okStart = true;
if (keyCode == KeyEvent.KEYCODE_S) okStart = true;
boolean center = (keyCode == KeyEvent.KEYCODE_DPAD_UP);
if (okStart
&& (mMode == STATE_READY || mMode == STATE_LOSE || mMode == STATE_WIN)) {
// ready-to-start -> start
doStart();
return true;
} else if (mMode == STATE_PAUSE && okStart) {
// paused -> running
unpause();
return true;
} else if (mMode == STATE_RUNNING) {
// center/space -> fire
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER
|| keyCode == KeyEvent.KEYCODE_SPACE) {
setFiring(true);
return true;
// left/q -> left
} else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT
|| keyCode == KeyEvent.KEYCODE_Q) {
mRotating = -1;
return true;
// right/w -> right
} else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT
|| keyCode == KeyEvent.KEYCODE_W) {
mRotating = 1;
return true;
// up -> pause
} else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
pause();
return true;
}
}
return false;
}
}
boolean doKeyUp(int keyCode, KeyEvent msg) {
boolean handled = false;
synchronized (mSurfaceHolder) {
if (mMode == STATE_RUNNING) {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER
|| keyCode == KeyEvent.KEYCODE_SPACE) {
setFiring(false);
handled = true;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT
|| keyCode == KeyEvent.KEYCODE_Q
|| keyCode == KeyEvent.KEYCODE_DPAD_RIGHT
|| keyCode == KeyEvent.KEYCODE_W) {
mRotating = 0;
handled = true;
}
}
}
return handled;
}
为了让登陆月球游戏拥有精彩的画面,除了设计java源代码之外,还要设计诸多的图像,才能游戏具备有可玩性。前面的源代码要绘制航飞机的升空,降落,摧毁与斜飞的小图标必须这些图标放置在资源文件res/drawable目录下
如图所示,另外在res/drawable-land与res/drawable-port目录下侧分别放值
着地求与月球的水平与垂直画面,当做游戏的背景画面,
这样不管手机使用者是水平的还是垂直拿着手机,都有相对应的背景画面,让登月游戏画面沾满整个手机屏幕。
那要如何布局应用这些图片呢?我们必须依靠放置在res/layout目录下的lunar-layout。Xml与res/values目录下的strings。Xml文字资源文件设置来完成,其中lunarlander的布局文件lunar_layout.xml源代码有
android:layout_width="fill_parent"
android:layout_height="fill_parent"
fill_parent 定义让游戏画面沾满整个屏幕,另外定义一个RelativeLayout布局格式,并在该布局里面有
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
android:id="@+id/text"
android:text="@string/lunar_layout_text_text"
android:visibility="visible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center_horizontal"
android:textColor="#88ffffff"
android:textSize="24sp"/>
游戏菜单的字符串全部由res\values目录的strings。Xml文字资源中定义的。包括Start,Stop,pause,resume与难易度设置,还有游戏中显示的消息,例如Pasud,GameOver,Sucsses等游戏消息文字字符串都定义在string.xml资源文件中。
从LunarLander这个游戏程序示范中可以逐渐了解Android程序设计的过程与重点,所有java源代码会放置在程序组件的src目录下,另外要自己生成源代码所需要的一切资源文件,包括将图像放置在res\drawable文件中,将程序的画面布局定义在res\layout文件中,最后将程序的菜单或消息字符串变量定义在res\values的strings.xml文件中,最后AndroidManifest.xml文件里定义安装组件名称,应用程序图标与名称等。
参考文摘
Google Android 程序设计指南 杨文志 编者 电子工程出版社。
Google android 入门与实战
Android 官方网站http://www.android.com/
开放手持装置联盟(Open Handset Alliance)http://www.openhandsetalliance.com/
Google Android 开发者部落格http://android-developers.blogspot.com/
Android 开发者大赛网站http://code.google.com/android/adc.html
Android 文件http://developer.android.com/
http://www.onlamp.com/pub/a/onlamp/
CNet 专访:Google 手机平台背后的原创者
http://www.zdnet.com.tw/news/comm/0,2000085675,20125898,00.htm
Android 原始码网站http://source.android.com/
09-10秋学期网络工程大作业
Google Maps 提供的服务体验演示及简单开发流程
张兆安 1071000135 序号:80
张家越 1071000134 序号:79
周昉石 1071000136 序号:81
郝 铭 1071000145 序号:86
贺静文 1071000146 序号:87
王 洋 1071000160 序号:93
信息工程学院
目录
引言:....................................................................... 3
1 Google Maps API 介绍....................................................... 3
2 服务体验................................................................... 4
2.1 地址解析............................................................. 4
2.2 街道视图全景......................................................... 4
2.3 路线和路段........................................................... 6
2.4 第三方软件开发....................................................... 7
3 开发环境................................................................... 8
3.1 Google Maps API的开发语言............................................ 8
3.2 Google Maps API 的开发工具........................................... 8
3.2.1 直接使用NotePad编写.......................................... 8
3.2.2 使用软件Aptana编写............................................ 9
3.2.3 Google Maps API 的拓展-------Ajax的简单介绍................... 10
4 Google Maps API的简单开发................................................. 10
4.1 API KEY............................................................. 10
4.2 常用方法............................................................ 10
4.3 应用实例............................................................ 11
4.3.1 改变Google地图色调........................................... 11
4.3.2 Google地图夜间版.............................................. 13
4.3.3 获取地图参数.................................................. 14
4.3.4 设计旅行路线,显示城市信息.................................... 17
4.3.5根据经纬度获取地图信息......................................... 21
5 Google Maps与Google Earth................................................ 25
5.1 Google Maps与Google Earth的直观介绍:.............................. 25
5.1.1谷歌地图(Google Maps).......................................... 25
5.1.2谷歌地球(Google Earth)....................................... 26
5.2 比较:.............................................................. 26
5.2.1从安装使用角度上说,Google Earth 不如Google Maps.............. 26
5.2.2从功能上比较,Google Earth 要比Google Maps强一些.............. 27
5.2.3从开放性来说,Google Earth 不如Google Maps.................... 29
5.3 Google Maps与Google Earth实例比较:................................ 29
5.4 Google Maps与Google Earth的结合:................................. 30
6 总结...................................................................... 31
参考文献:.................................................................. 31
小组成员及分工.............................................................. 32
Google Maps 提供的服务体验演示以及简单开发流程
摘 要 : 随着互联网技术的不断成熟,在互联网上服务的新技术陆续出现,Google Maps(谷歌地图)是Google公司提供的地图服务。它能提供两种图:一是矢量地图;二是不同分辨率的卫星照片。本文主要介绍了Google Maps为用户提供的服务,Google Maps API的简单应用和开发流程,Google Maps 和 Google Earth的异同及两者的相互结合。
关键词:Google Maps;API;地图;
引言:
信息技术日新月异,人们对地理信息服务的要求已经从传统的纸质地图载体发展到建立在计算机技术、网络技术、空间技术、通讯技术以及地理信息技术等基础上的现代地理信息服务模式。近年来,以提供网络搜索服务为主的Google推出了新的地图服务Google Earth和Google Maps,Google地图服务及其应用程序接口(Google Maps API)的推出,将面向应用的地图服务提升到更高层面。
目前,已经有越来越多的网站利用Google Maps API,将扩展的地图服务整合到自身的使用之中,在提升易用性的同时,还带来不少新意。本文将对Google Maps的功能、特点和Google Maps API的使用方法等进行简单介绍和举例说明。
1 Google Maps API 介绍
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。API除了有应用“应用程序接口”的意思外,还特指 API的说明文档,也称为帮助文档。
Google 地图 API是一种通过 JavaScript 将 Google 地图嵌入到您的网页的API。它提供了很多处理地图的功能(类似网页http://ditu.google.cn 上的那些功能)和向地图添加内容的服务,让您能够在您的网站上创建功能全面的地图应用。
Google Maps Api的作用是,将Google Maps服务器上的地图图片和数据下载到客户端并正确显示,显示程序定义的地标点、折线和多边形,实现地址搜索、驾车导航等扩展功能。你可以在网页中直接调用它定义的类和方法,而不必了解它的运行机制,当然这些文件是可见的,需要的话你可以重载它的函数,来实现你想要的功能。Google Maps Api的地图的显示、标点、划线等操作包含59个类,空间、叠加层等包含18个类。
2 服务体验
2.1 地址解析
地址解析是将地址(如“首都师范大学信息工程学院”)转换为相应的地理坐标的过程,可以用于放置标记符或定位地图。如图2-1所示:
图 2-1
在搜索栏中输入“首都师范大学信息工程学院”,单击按钮“Go!”,则会在地图中心位置显示被解析的地址,自动加入标记符,并且弹出标签显示地址名称。
参考实例:
http://code.google.com/intl/zh-CN/apis/maps/documentation/examples/geocoding-simple.html
2.2 街道视图全景
显示指定街道的360度全景图,游览器需要支持Flash插件,目前,中国地区还不支持此项服务,如图2-2所示:
图 2-2
在地图上选择旧金山市的一条街道,会弹出一个标签,显示所选街道的ID、地理坐标、名称等信息,并再产生一个该位置的实际景象视图,如图2-3所示:
图 2-3
通过推拽屏幕,或者选择屏幕左上方的四个箭头,可以改变视角,看到360度全景图,下方的“+”和“-”可以缩放视图。右上角的方框可以切换到全屏模式。
参考实例:
http://code.google.com/intl/zh-CN/apis/maps/documentation/examples/streetview-data.html
2.3 路线和路段
显示任意两个地方的路线,并详细介绍路线中的路段,目前中国地区不支持此功能,如图2-4所示:
图 2-4
可以任意输入起点和终点的名称,选择显示语言的种类。在地图上用蓝色突出两地间的行驶路线,并标记出起点和终点。在地图左侧显示经过的路段信息,单击起点或重点则可以显示该地区的实际地图,如图2-5所示:
图 2-5
可以在普通地图和卫星地图之间切换,缩放视图。
参考实例:
http://code.google.com/intl/zh-CN/apis/maps/documentation/examples/directions-advanced.html
2.4 第三方软件开发
以谷歌地图开发一些应用程序,比如显示地图版大富翁,如图2-6所示:
图2-6
进入游戏时,背景为谷歌地图,首先选择街道名称。如图2-7所示:
图2-7
游戏方式和之前的大富翁版本没有什么区别,不同的是将虚拟的街道地图,换成了真实的地图。
3 开发环境
3.1 Google Maps API的开发语言
Google Maps Api开发使用的是JavaScript语言并嵌入到HTML语言中。
JavaScript 是一种小型的基于对象的描述语言,用来开发客户服务器类型的Internet应用程序。JavaScript 允许页面制作者在HTML文件中嵌入命令。当页面调入浏览器时,JavaScript 命令将被执行。与 HTML 和 JAVA 语言相比,JavaScript最大的特点就是提供了更多的灵活性和对浏览器本身的控制,帮助Web页面作者制作出更加精美的作品。
JavaScript语言和HTML语言在这就不做详细介绍了,有意者可以自行学习。
3.2 Google Maps API 的开发工具
3.2.1 直接使用NotePad编写
Google Maps Api可以直接使用记事本(NotePad)编写语言,并使用HTML语言的格式,并嵌入JavaScript语言,最后将文件保存为 .htm格式即可。文件用浏览网打开,即可实现相应的功能。
此外还可以使用稍微支持JavaScript语法提示的开发工具,如DreamWeaver,Visual Studio等,这里就不再着重介绍。
3.2.2 使用软件Aptana编写
用NotePad等工具编写HTML语言,所有代码必须自己手写,并且调试非常困难,尤其代码非常长并且非常复杂的时候,运用这些工具更是非常艰难。
Aptane是一款可以识别HTML语言和JavaScript的工具,它提供强大的代码提示,浏览器兼容性提示,错误提示,代码自动完成等功能,并支持各大主流的Ajax开发框架。
现简单介绍一下Aptana软件;
Aptana软件的安装过程如图3-1所示;
图 3-1
Aptama的工作页面如图3-2所示:
图 3-2
3.2.3 Google Maps API 的拓展-------Ajax的简单介绍
Google Maps API基本上是免费使用的,但是需首先向Goolge申请使用权(下一节会详细介绍申请过程和内容),即申请密钥,在网页上也明载了几项使用上的限制,但只这些都不影响我们使用。
当地图的加载量和使用量很小时,使用Google Maps API提供的库函数即可简单解决问题,实现相应的功能,但是当我们所提供的信息太多时,一次全部加载会使得地图显得杂乱无章;并且当设计的是动态更新的页面时,会造成页面的闪烁;当局不页面有所更新时,即使很小,也要更新整个页面,极大地浪费了资源。将Google Maps API和Ajax整合在一起就很好的解决了这个问题。下面简单介绍一下Ajax。
Ajax的关键技术有:
·使用HTML和CSS来建立Web表单并表示网页信息;
·使用JavaScript来操作DOM(Document Object Model)来进行动态显示及交互;
·使用XMLHttpRequest对象与Web服务器进行异步数据交换;
·使用XML进行数据交换及相关操作;
·使用JavaScript将所有东西绑定在一起。
4 Google Maps API的简单开发
4.1 API KEY
在使用Google Maps API之前,需要向http://www.google.com/apis/maps/ signup.htm申请一组API KEY。当申请到API KEY之后,就可以将Google Maps嵌入到网页了。
本文申请到的密钥为:key=ABQIAAAA1j86tnUDFv8OAtC8dZVtKRT2yXp_ZAY8_ufC3CFXhHIE1NvwkxSzmwrQ90SNUILzGRpsBiaa860gfQ。
则如下代码:
type="text/javascript">
“src=”表示连接到的API地址,”key=”表示上文中提到的密钥,相当于用google Maps API的一个账号。这两行代码即连接到Google Maps网页。
可以说,Google Maps API的应用无处不在。虽然在很多应用中,Google地图的扩展应用只起到辅助作用,但是这用有益的补充还是能够使服务增色不少,更加方便了我们对地理位置的处理。
4.2 常用方法
下面介绍一下代码的一般用法及其通用方法:
1)在用Google API之前,要线申请一个密钥才能使用连接到Google Maps,并使用Google Maps API提供的库文件,调用相应的函数,下面要处理图片使用的函数都是在申请到的API库文件里呢。
本文申请到的密钥为:key=ABQIAAAA1j86tnUDFv8OAtC8dZVtKRT2yXp_ZAY8_ufC3CFXhHIE1NvwkxSzmwrQ90SNUILzGRpsBiaa860gfQ。
则如下代码:
“src=”表示连接到的API地址,”key=”表示上文中提到的密钥,相当于用google Maps API的一个账号。这两行代码即在网页中导入了Google Maps API的库文件。
2)
析:加入一个具有id属性的元素作为Google地图的容器,本文用到的为DIV元素,还定义了容器的大小(即高和宽)。
3)主函数中,map = new GMap2(document.getElementById("map"));
析:方法getElementById是返回文档中具有指定id属性的Element节点,即把刚才src连接网页中下载的Google Maps下载到id为map 的DIV元素中。
4)map.setCenter(new GLatLng(39.92, 116.46), 4);
析:设置Map的中心,调用GlatLng函数,设置中心为(39.92,116.46),放大系数为4。
5)map.addControl( new GMapTypeControl() );
析:在地图的右上方加上三个按钮,分别表示普通图(即交通图),卫星图,两者合称图。
6)map.addControl( new GLargeMapControl() );
析:加一个大控制面板,即控制地图的缩放级别。
4.3 应用实例
4.3.1 改变Google地图色调
以下是截取的正常颜色设置下的google地图,如图4-1所示:
图 4-1
通过以下代码我们可以根据自己的意愿,通过对特别函数的运用来改变整个地图的色调。
Function load(){
If(GBrowserIsCompatible())
{ //设定普通地图的透明度
G_NORMAL_MAP.getTileLayers()[0].getOpacity=function(){
return 0.4;};
//这里将返回值定在0.4,会使得地图色调接近半透明,你也可以修改为其他0~1之间的数字。
map = new GMap2(document.getElementById(“map”),{mapTypes:[G_NORM
AL_MAP]}); //必须在创建GMap2后重新设置地图容器的背景颜色
map.getContainer().style.backgroundColor=”#BBoooo”
//此条代码通过修改backgroundColor属性,改变了背景颜色。颜色的代码为“BBOOOO”(红色)。
map.addcontrol(new GlargeMapControl());
map.addcontrol(new GMapTypeControl());
map.setCenter(new GlatLng(39.92,116.46),3);
}
}
经过我们自己加工之后,我们的地图会呈现出完全不同的颜色基调,如图4-2所示:
图 4-2
4.3.2 Google地图夜间版
代码分析如下:
Function load(){
If(GBrowserIsCompatible())
{ //下面创建Gcopyright对象,该对象用于控制版权区域,由于google地图中涉及大量有关版权内容,这一对象较为重要
Var copyright = new GCopyright(100, //版权的有效区域为整个地图
new GLatLngBounds(new GLatLng(-90,-180),
new GLatLng(90,180),0,“@2000 NASA”);//版权信息的,版权显示的字符串
//下面创建GcopyrightCollection 对象
Var copyrightCollection = new GCopyrightCollection
(“Peter Pesti”);
//添加Gcopyright对象到GCopyrightCollection
copyrightCollection.addCopyright(copyright);
//下面创建夜景地图
Var nightTile = new GTileLayer(copyrightCollection, 0,6);
//本条语句将缩放级别设定在(0~6)
nightTile.getTileUrl= fuction(a,z)
//定义了getTileUrl方法
{
return“http:\/\/www-static.cc.gatech.edu\/~pesti\/night\
/t-n\/“+z+””\/”+a.x+”_”+a.y+”.jpeg”;
//这里设定了google地图中所有图片的储存方式
}
//创建GTileLayer 数组
Var tilelayers = [nighTile];
//需要特意说明的是,这个数组用于存放生成地图的图片。我们知道google地图的实现是仰赖于细小图片的排列摆放来完成的,这些图片的摆放都要依靠这个数组来完成。
//创建GMapType
Var nightMap = new GMapType(tilelayers,
New GMercatorProjection(12),
“Night”,
{errorMessage:”数据不可用”}
);
//创建地图,并添加新的地图类型
Map = new GMap2(document.getElementById(“map”));
Map.addMapType(nightMap);
Map.addControl(nightMap);
Map.addControl(new GLargeMapControl());
Map.setCenter(new GLatLng(42,-87.5),3);
效果如图4-3所示:
图4-3
4.3.3 获取地图参数
如图4-4所示:
图4-4
网页及代码见HTML文件attribute.htm,并可打开查看效果。.
代码分析:
1) 调用拖拽监听函数:
function addDragListener()
{
//监听地图上的事件
GEvent.addDomListener(map, 'dragstart', function()
{
updateInfo(eventinfo, "当前事件:dragstart");
});
GEvent.addDomListener(map, 'drag', function()
{
updateInfo(eventinfo, "当前事件:drag");
updateInfo(mapcenter, "当前地图中心纬度:" + map.getCenter().lat() + " 经度" + map.getCenter().lng());
});
GEvent.addDomListener(map, 'dragend', function()
{
updateInfo(eventinfo, "当前事件:dragend");
});
}
析:第一个方法是鼠标刚要动时,监听方法;第二个方法是鼠标拖动过程中,事件为Drag,地图中心的经纬度随之变化;第三个方法是没有拖动时,显示Dragent。如上图所示。
2)调用缩放级别函数,
function addZoomListener()
{
//监听地图上的缩放事件
GEvent.addDomListener(map, 'zoomstart', function()
{
updateInfo(eventinfo, "当前事件:zoomstart");
});
GEvent.addDomListener(map, 'zoomend', function()
{
updateInfo(eventinfo, "当前事件:zoomend");
updateInfo(zoomlevel, "当前地图缩放级别:" + map.getZoom());
});
析:当鼠标动左边的缩放按钮时,监听事件为Zoomed,并相应的监听缩放级别并显示。如图4-5:
图4-5
3)调用改变地图类型函数;
function addMapTypeListener()
{
//监听地图上maptypechanged事件
GEvent.addDomListener(map, 'maptypechanged', function()
{
updateInfo(eventinfo, "当前事件:maptypechanged");
updateInfo(maptype, "当前地图类型:" + map.getCurrentMapType().getName(false));
});
}
析:当鼠标点击左上方的地图类型按钮时,监听到事件为Maptypechanged,并相应的改变地图类型并显示。如图4-6:
图 4-6
4.3.4 设计旅行路线,显示城市信息
图 4-7
效果如图4-7所示。可以挪动红色标签,改变行车路线,并可以点击其他城市的绿色标签,显示不同信息。假如我不想去西安了,我想去重庆,并且想查看上海的信息,如图4-8所示:
图4-8
添加的红色标签,也可以显示信息,但是标签的内容只能是一样的,如图4-9所示:
图 4-9
具体代码见HTMl文件travel.htm,并可以打开查看效果。
功能代码分析:
一共有三个函数,注释及代码如下:
1) 创建红色地标代码分析:
function createMarker(point)
{
var marker = new GMarker(point, {icon: myIcon, draggable: true, bouncy: true}); //创建新地标,类型为定义的myIcon类型,可以拖拽,并且有阴影
var index = markers.length; //记录添加的标签的个数
//双击地标删除该地标
GEvent.addListener(marker, 'dblclick', function()
{
deleteMarker(marker);//调用删除方法
});
//dragstart事件,换新图标
GEvent.addListener(marker, 'dragstart', function()
{
marker.setImage("http://www.google.com/mapfiles/dd-start.png");//设置要换的新图标的类型
});
//dragend事件,换回原图标
GEvent.addListener(marker, 'dragend', function()
{
marker.setImage("http://www.google.com/mapfiles/marker.png");//换回原来的标签类型;
});
//单击显示形成安排,即显示红的标签信息
GEvent.addListener(marker, 'click', function()
{
marker.openInfoWindowHtml("这个城市很好玩!");
});
//drag事件
//注意,如果添加了polyline,则拖动地标时需要重画路线
GEvent.addListener(marker, 'drag', function()
{
redrawPolyline();//重新画路程线;
});
marker.setIndex(index);//并重新设置地标个数
markers[index] = marker;//将现在的标签替换为原来的标签
map.addOverlay(marker);//创建新地标
//每创建一个新的地标就重画一次
redrawPolyline();
}
2) 创建绿色标签,并显示相应的内容;
function createsmall(point){
var marker = new GMarker(myPoints[i], {icon: myIcon1, bouncy: true});
//如上,在数组myPoint[i]处设置类型为myPoint1,并且有阴影的标签
map.addOverlay(marker);//显示标签;
GEvent.addListener(marker, 'click', function(point)
{
for(i=0;i if(point==myPoints[i]) marker.openInfoWindowHtml(names[i]); } //点击绿色标签时,显示内容names[i]; }); } 3) 添加路线函数: function addPolyline() { var points = []; for(var i=0; i { points[i] = markers[i].getPoint();//获取端点; } polyline = new GPolyline( points, //GLatLng()数组 "#FF0000", 10, 0.5 );//设置行程的颜色,宽度,透明度。 map.addOverlay(polyline); //画路线 } //删除行程路线方法 function removePolyline() { polyline.remove();//调用remove方法; polyline = null; } //重画行程路线方法 function redrawPolyline() { if(polyline) { removePolyline(); } addPolyline(); } 4) 双击删除标签: function deleteMarker(marker) { //弹出窗口确定是否真的删除 if(!confirm("确定删除该地标吗?")) return; var index = marker.index; //移除该图层 map.removeOverlay(marker); //从数组中删除指定GMarker并更新index for(var i = index; i { markers[i+1].setIndex(i); markers[i] = markers[i+1];//减少一个标签 } markers.length = markers.length-1;//使标签的数量减一 } 【注】:上面添加的这些地图信息完全可用应用Ajax技术实现,即先建立一个XML文件,然后再代码中加载这个XML文件,便可将信息加载到地图中,这种方法简洁好用。但是这要求能和Goolge Maps服务器的通信,我们做时就是通信问题没有解决,故用的是最原始的办法(直接在代码中添加地图信息)。 此功能达到的效果图如下: 1)根据输入的经纬度获取地图信息,如图4-10: 图 4-10 2)直接在地图上点击,获取地图信息,如图4-11: 图 4-11 代码分析: 此过程先建立了一个文件maps存放地图的各种载入信息,包括与Google Maps API的连接,地图信息的连接,以及地图信息的回应和载入。应用的技术为Ajax技术,具体里面的实现方法特别复杂,故有待考察。 主程序代码如下: 1) 此过程表示的JavaScrpt脚本放在Google Maps JavaScript API Example Reverse Geocoder.files文件夹中的maps文件中;即把各种地图信息载入到代码中。 2)调用函数,功能为在文本框中输入值后,重新设置地图中心,并调用下一个函数; function getGeoInfo(q, p){ var point = new GLatLng(q, p);//建立新点 map.panTo(point);//重新设置地图中心 if (point != null) { geocoder.getLocations(point, showAddress);//调用showAddress函数; //geocoder为和Google 服务器通讯的方法 } } 3)调用showAddress函数; function showAddress(response){ map.clearOverlays();//清空上次的地标; if (!response || response.Status.code != 200) { alert("Status Code:" + response.Status.code); }//判断网络是否连通 else {//得到各种回应信息; place = response.Placemark[0]; point1 = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]); //得到服务器回应的经纬度 marker = new GMarker(point1); map.addOverlay(marker);//设置地标 marker.openInfoWindowHtml('orig latlng:' + response.name + ' 'latlng:' + place.Point.coordinates[1] + "," + place.Point.coordinates[0] + ' 'Status Code:' + response.Status.code + ' 'Status Request:' + response.Status.request + ' 'Address:' + place.address + ' 'Accuracy:' + place.AddressDetails.Accuracy + ' 'Country code: ' + place.AddressDetails.Country.CountryNameCode); //显示各种服务器回应的地图信息 } } 4)直接在地图上点击的功能实现: GEvent.addListener(map, "click", getAddress);//设置监听事件,并调用getaddress函数; geocoder = new GClientGeocoder(); //此类用于和 Google 服务器建立直接通信,以获取用户指定地址的地址解析; getAddress函数如下: function getAddress(overlay, latlng){ if (latlng != null) { address = latlng; geocoder.getLocations(latlng, showAddress);//调用上面的showAddress函数; } } 【注】4.3 应用实例中的网页及具体代码见附件 图 5-1 如图5-1所示。谷歌地图是Google公司提供的地图服务,包括局部详细的卫星照片。 图 5-2 如图5-2所示。谷歌地球是一款Google公司开发的虚拟地球仪软件,它把卫星照片、航空照相和GIS布置在一个地球的三维模型上。Google Earth于2005年向全球推出,被“PC 世界杂志”评为2005年全球100种最佳新产品之一。用户们可以通过一个下载到自己电脑上的客户端软件,免费浏览全球各地的高清晰度卫星图片。 Google Earth使用了公共领域的图片、受许可的航空照相图片、KeyHole间谍卫星的图片和很多其他卫星所拍摄的城镇照片。甚至连Google Maps没有提供的图片都有。分为免费版与专业业版两种。 总的来说Google Earth 是软件版,使用本机运行的软件来浏览卫星图片,有FREE\PLUS\PRO三种版本,能实现不同的功能.看地图相对很方便;Google Maps 是网页版,无需安装软件,在浏览器中就可以看,可以只看地图,也可以叠加上卫星图片一起看.但只有路线规划等很少的功能,不支持3D地形和建筑。 Google Earth 要安装一个客户端软件,通过这个客户端软件浏览地图。而Google Maps是直接在浏览器上以访问网页的形式查看地图,客户端不需要安装,对初学者来说,Google Maps更容易上手,而Google Earth安装对机器硬件还要有要求,因为Google Earth要在OpenGL或DirectX模式下工作,如果两者有问题,你甭想打开Google Earth,我就出现两次安装Google Earth后无法打开的情况。 Google Earth安装界面,如图5-3、5-4所示: 图 5-3 图 5-4 选择安装路径 Google Maps使用界面,如图5-5所示: 图 5-5 两者的地图操作相类似,都是用鼠标直接移动地图,可以通过鼠标滚动缩放地图。不过Google Earth的飞行浏览是基于web形式的Google Maps无法实现的。这个飞行浏览效果真如在飞机上浏览地面,很令人耳目一新。另外,自定义地图功能上Google Maps要弱一些,最近Google Maps推出My maps,允许用户自定义标注点、线、面。功能上逐渐向Google Earth靠近。 另外,Google Earth的3D模型显示也是Google Maps目前不能实现的,如图5-6所示: 图 5-6 My Maps,如图5-7所示: 图 5-7 My maps,允许用户自定义标注点、线、面 Google Earth是个独立软件,而Google Maps提供了API用于二次开发,允许用户在自已的网页上显示地图。现在已有许多网站利用Google Maps API开发了地图应用。 Google Maps/Earth使用的是国际通用的WGS-84坐标系统,中国的地图数据使用的是Peking-54。具体原因不详。这样做的结果导致了地位数据的偏移。像Garmin这样的GPS设备都是通过软件补丁来解决导航时的偏移问题。它导出的数据也是基于Peking-54的坐标系统。因此这样的数据显示在Google Maps/Earth的Satellite/Hybrid View的路线上就会整个产生往东南方向的偏移。 Map View,这里没有产生偏移,如图5-8所示: 图 5-8 Hybrid View,这里就能发现,航迹整个就往东南方向发生了偏移,如图5-9所示: 图 5-9 Google Earth的地标功能非常受欢迎,而Google Map却一直是一张光秃秃的地图,而现在地图上的内容终于可以丰富起来了.Google已经将Wiki的概念带入了Google Map,它可以让你利用“MapMaker”在地图上标志方便大家的内容,例如咖啡厅等,当然商家也可以利用它来吸引网上的客人,但目前为止57个国家支持了这种服务,Google Map的中国版还是无法做到这一点.含视频和图像,如图5-10所示: 图 5-10 地图通常代表着我们周围的信息,跟我们的生活有密切的关系,在网上将地图与信息整合,有助于我们凝聚对于同一区域的感情。例如,当在网上提供一个美食地图的服务时,通常也会引来更多有相同兴趣的网友一起讨论,因为我们都住在相同的地方,有着对同一地区的了解。Google Maps API真正的魅力除了丰富完整的地图功能外,还提供了API程序库让所有有兴趣的人一起参与使用,分享自己的信息,并加入自己的创意以创造不同的地图服务。 虽然可以利用HTML和JavaScript语言编写程序,但是Google Maps的背后的真正技术是Ajax,尤其信息量特别大时,Google Maps API和Ajax的完美结合,真正使Google Maps 得到了更加广泛和更加方便的应用,但是要想编写更好的程序,实现更加实用的功能,自己创造出更加个性和更加方便的地图,仅限于我们介绍的这些代码和代码是远远不够的,还要更加认真的钻研和学习。 在制作和学习的过程中,我们虽然遇到了很多困难,但是最后也终于攻破了,总结出一定要多看书,多看资料,反复看,总会想出解决的办法的,总之,书是最好的老师,并且个人的力量是渺小的,只有大家齐心协力,团结协作才能做出大事情,攻克大难题! 最后引用 1) 《程序天下——Google Maps 与Google Earth 双剑合璧》 江宽 龚小鹏; 2) 《Google 成功背后的技术——Ajax网页程序设计》 沈时宇 3) http://code.google.com/intl/zh-CN/apis/maps/documentation/index.html 4) 《基于Google Maps API的Web地图服务系统研究及应用》 耿庆斋 缪纶 段媛媛 李江华 5) 《Google Maps组件二次开发与应用》 陈园园 简季 杨武年 张敏 6) 《Google Maps运行机制以及应用研究》 巫细波 胡伟平 7) 百度网页中关于JavaScript和Google Maps API的简介 1、张兆安 20% 1071000135 序号:80 贺静文 15% 1071000146 序号:87 根据经纬度获取地图信息、开发环境、Google Maps API 介绍 2、张家越 20% 1071000134 序号:79 郝 铭 15% 1071000145 序号:86 设计旅行路线,显示城市信息、服务体验、总结、整理文档 3、周昉石 15% 1071000136 序号:81 王 洋 15% 1071000160 序号:93 Google地图夜间版、改变Google地图色调、Google Maps与Google Earth 09-10秋学期网络工程大作业 Windows Server 2003下的 IPv6配置 作者(学号) 程金龙 (1071000004) 作者(学号) 陈雪松 (1071000003) 作者(学号) 高 欢(1071000006) 作者(学号) 谢和秋(1071000041) 信息工程学院 中文摘要 本文介绍IPv6的基本知识及相关技术,详细说明了在Windows Server 2003环境下如何对IPv6主机进行配置,包括主机IP地址、默认网关、DNS设置等。对实际通信中相关问题进行了研究,如路由的配置等。 关键词: IPv6 ;Windows Server 2003;DNS Servers;路由器;IPv6/IPv4 Abstract:This text not only introcuced the basic knowledge and correlative technic of IPv6 but also has a particular explain about collocate a computer for IPv6 under the Windows Server 2003 include IP address、Default Gateway and DNS servers’collocate.We also had a research about some problem in fact communicate such as collocate the router . KEY Word :IPv6; Windows Server 2003; DNS Servers;Router; 目录 一、IPv6的基本认识 3 1.1 什么是IPv6....................................................................................................... 3 1.2 IPv6的特点和优点............................................................................................ 3 1.3 IPv6的相关技术................................................................................................ 4 1.3.1 BIN技术.................................................................................................. 4 1.3.2 SOCKS64技术............................................................................................. 5 1.3.3隧道技术.................................................................................................... 6 1.3.4传输层中继(Transport Relay)............................................................... 6 1.3.5应用层代理网关(ALG)............................................................................. 6 二、 IPv6的基本配置 7 2.1 实验环境............................................................................................................ 7 2.1.1 软件环境................................................................................................... 7 2.1.1 硬件环境................................................................................................... 7 2.2 IPv6协议的安装.................................................................................................. 7 2.2.1 Windows对话框下的协议安装................................................................... 7 2.2.2 DOS命令提示符下的协议安装................................................................... 8 2.3 添加IP地址........................................................................................................ 9 2.4 添加默认网关.................................................................................................... 10 2.5 DNS服务器设置................................................................................................ 11 2.5.1 添加DNS服务器................................................ 11 2.5.2 启用DNS服务器..................................................................................... 12 2.6 路由器的设置.................................................................................................... 14 2.6.1 实验环境....................................................... 14 2.6.2 详细设置................................................................................................. 14 实验感想 18 参考文献 19 IPv6是Internet Protocol Version 6的缩写,其中Internet Protocol译为“互联网协议”。 现有的互联网是在IPv4协议的基础上运行。IPv6是下一版本的互联网协议,它的提出最初是因为随着互联网的迅速发展,IPv4定义的有限地址空间将被耗尽,地址空间的不足必将影响互联网的进一步发展。为了扩大地址空间,拟通过IPv6重新定义地址空间。IPv4采用32位地址长度,只有大约43亿个地址,估计在2005~2010年间将被分配完毕,而IPv6采用128位地址长度,几乎可以不受限制地提供地址。按保守方法估算IPv6实际可分配的地址,整个地球每平方米面积上可分配1000多个地址。在IPv6的设计过程中除了一劳永逸地解决地址短缺问题以外,还考虑了在IPv4中解决不好的其它问题。当然,IPv6并非十全十美、一劳永逸,不可能解决所有问题。IPv6只能在发展中不断完善,也不可能在一夜之间发生,过渡需要时间和成本,但从长远看,IPv6有利于互联网的持续和长久发展。 特点: (1)IPV6地址长度为128比特,地址空间增大了2的96次方倍; (2)灵活的IP报文头部格式。使用一系列固定格式的扩展头部取代了IPV4中可变长度的选项字段。IPV6中选项部分的出现方式也有所变化,使路由器可以简单路过选项而不做任何处理,加快了报文处理速度。 (3)IPV6简化了报文头部格式,字段只有7个,加快报文转发,提高了吞吐量; (4)提高安全性。身份认证和隐私权是IPV6的关键特性。 (5)支持更多的服务类型; (6)允许协议继续演变,增加新的功能,使之适应未来技术的发展。 优点: 与IPV4相比,IPV6具有以下几个优势: 一、IPv6具有更大的地址空间。IPv4中规定IP地址长度为32,即有2^32-1(符号^表示升幂,下同)个地址;而IPv6中IP地址的长度为128,即有2^128-1个地址。 二、IPv6使用更小的路由表。IPv6的地址分配一开始就遵循聚类(Aggregation)的原则,这使得路由器能在路由表中用一条记录(Entry)表示一片子网,大大减小了路由器中路由表的长度,提高了路由器转发数据包的速度。 三、IPv6增加了增强的组播(Multicast)支持以及对流的支持(Flow Control),这使得网络上的多媒体应用有了长足发展的机会,为服务质量(QoS,Quality of Service)控制提供了良好的网络平台。 四、IPv6加入了对自动配置(Auto Configuration)的支持。这是对DHCP协议的改进和扩展,使得网络(尤其是局域网)的管理更加方便和快捷。 五、IPv6具有更高的安全性。在使用IPv6网络中用户可以对网络层的数据进行加密并对IP报文进行校验,极大的增强了网络的安全性。 目前IPv4网络众多,大部分的网络用户十分依赖互联网,然而从IPv4向IPv6的过渡又是必须的,因此在过渡过程中,就必须保证过渡期处在两个网络中的用户都可以互相通讯,不影响正常使用。这就要求过渡过程要平稳、安全,确保其间不会给用户带来麻烦。目前对于这一问题,国际上有许多解决办法,然而最根本的要数双栈策略,他是其他技术的基础,因此首先介绍双栈策略。 双栈策略,简单的说就是将网络中的某个节点同时设置上IPv4与IPv6协议,再通过技术手段将来自两个协议间的通信转换成彼此需要的数据,来实现两个协议间的通信。在双栈策略的基础上,可利用多种技术实现IPv6与IPv4间的互联,下面介绍一些基于双栈策略的通信技术。 BIA技术在双栈主机的SocketAPI模块与TCP/IP模块之间加入一个API翻译器(如图1所示)。API翻译器包含三个模块:域名解析器,地址映射器和函数映射器。其中,域名解析器负责对IPv4应用程序的请求域名返回一个正确的应答,地址映射器在主机内部维护一张IPv4与IPv6地址对的表格(分配的IPv4地址来自IPv4地址池中,采用未使用的IPv4地址,如 图1 采用BIA机制的双栈主机的结构模型 RFC3338中描述了采用BIA机制的双栈主机与IPv6主机之间相互通信的过程。其中双栈主机DualStack向IPv6主机Host6发起通信的过程如下: ·当双栈主机DualStack上的IPv4应用向它的域名服务器(DNS)发送查询目的主机的地址请求时,域名解析器拦截了这个请求,并产生一个新的查询请求转发给DNS来解析A和AAAA两种记录。 由IPv6主机Host6发起到双栈主机DualStack的通信过程相对简单一些。Host6通过它的DNS解析DualStack的AAAA记录,然后向DualStack发送一个IPv6的数据包。为了通过调用IPv4的API函数和IPv4应用通信,函数映射器检测到IPv6数据包到达Dual Stack后,向地址映射器发送一个IPv4地址请求,并用返回的IPv4地址发起一个IPv4的Socket API调用。然后,函数映射器再向地址映射器请求与该IPv4地址对应的原来的IPv6地址,按照这个地址对Host6答复,下图2为BIA技术中域名解析流程图。 SOCKS64技术是原有SOCKS协议(IETFRFC1928)的扩展,相当于IP层的代理,其原理如图2所示。它增加了两个新的功能部件*SocksLib*和*Gateway*。*SocksLib*是在客户机一端引入的,它位于应用层和Socket层之间,可以替代应用程序的Socket API和DNS域名解析API。在*Socks Lib*中有一个DNS域名解析代表,它在源节点(客户机C)全权代表到中继服务器(网关G)的域名解析行为。*Gateway*是安装在IPv6和IPv4双栈网关上的一个增强型的SOCKS服务器,可以完成客户机C(IPvX)和目的端D之间的任何协议组合类型的中继。当*Socks Lib*调用中继时,由父*Gateway*来产生出一个*Gateway*进程(线程)来负责中继连接。 图3 采用SOCKS64技术的网络通信原理 目前IPv6处于起步状态,被众多的IPv4网络阻隔成多个独立的“IPv6岛”,为了使这些IPv6岛互通,就可以利用隧道技术。利用穿越现存IPV4因特网的隧道技术将许多个“IPV6孤岛”连接起来,逐步扩大IPV6的实现范围,这就是目前国际IPV6试验床6Bone的计划。 工作机理:在IPV6网络与IPV4网络间的隧道入口处,路由器将IPV6的数据分组封装入IPV4中,IPV4分组的源地址和目的地址分别是隧道入口和出口的IPV4地址。在隧道的出口处再将IPV6分组取出转发给目的节点。 隧道技术在实践中有四种具体形式:构造隧道、自动配置隧道、组播隧道以及6to4。 对于隧道技术来说,手工配置隧道的扩展性很差,因此用户需要一个简化的方法来配置隧道。TB技术就可满足这一需求。TB即Tunnel Broker,是隧道代理的简称,主要目的就是简化隧道的配置,提供自动的配置手段。对于已经建立起IPv6的ISP来说,使用TB技术为网络用户的扩展提供了一个方便的手段。从这个意义上说,TB可以看作是一个虚拟的IPv6 ISP,它为已经连接到IPv4网络上的用户提供连接到IPv6网络的手段,而连接到IPv4网络上的用户就是TB的客户 与SOCKS64的工作机理相似,只不过是在传输层中继器进行传输层的“协议翻译”,而SOCKS64是在网络层进行协议翻译。它相对于SOCKS64,可以避免“IP分组分片”和“ICMP报文转换”带来的问题,因为每个连接都是真正的IPV4或IPV6连接。但同样无法解决网络应用程序数据中含有网络地址信息所带来的地址无法转换的问题。 ALG是Application Level Gateway的简称,与SOCKS64、传输层中继等技术一样,都是在V4与V6间提供一个双栈网关,提供“协议翻译”的功能,只不过ALG是在应用层级进行协议翻译。这样可以有效解决应用程序中带有网络地址的问题,但ALG必须针对每个业务编写单独的ALG代理,同时还需要客户端应用也在不同程序上支持ALG代理,灵活性很差。显然,此技术必须与其它过渡技术综合使用,才有推广意义。 Windows Server 2003 DNS服务器组件 如图4所示,实验用的网络为实验室环境下的无路由结构,由一台交换机连接两台PC机,PC2在后边的实验中作为DNS服务器。 在网上邻居上点右键->属性->本地连接上点右键->属性->点击安装后,在弹出的对话框中选择协议,点击添加,出现如图5对话框后,选择TCP/IP协议版本6,这样就成功的安装好了IPv6协议,在本地连接属性中发现如图6所示,即表示已经安装好了IPv6协议。 图5 选择TCP/IP版本6 图6 已经安装好IPv6协议 进入Windows 后,从开始中进入到DOS命令提示符后,依次输入:Netsh 为了确认协议是否安装上了,可在安装后利用ipconfig命令就可显示出系统已经分配了一个IPv6下的链路地址,如图7中所示,并可通过键入 netsh ->interface->ipv6 ->show address命令,显示出如图8所示的IPv6中各接口地址信息,这样就证明我们就成功的在系统上安装了IPv6协议,接下来就可以对协议进行相关的设置了。 图7 系统自动分配的IPv6链接地址 图8 显示各接口地址信息 命令格式: add address [interface=] [[type=]unicast|anycast] [[validlifetime=] [[preferredlifetime=] [[store=]active|persistent] 参数: 标记 值 interface - 接口名或索引。 address - 要添加的 IPv6 地址。 type - 下列值之一: unicast: 添加一单址广播地址(默认值)。 anycast: 添加一任意广播地址。 validlifetime - 路由有效的寿命。默认值是无限。 preferredlifetime - 路由首选的寿命。默认值是无限。 store - 下列值之一: active: 更改只持续到下一次重新启动。 persistent: 更改持久有效(默认值)。 例如 :add address 4 3222::1 用add address命令为PC1添加一个ipv6地址后,可用show命令显示出已配置好的IPv6地址,如下图9所示: 图9 显示添加的IP地址 在上述环境下用add route命令添加默认网关 命令格式: add route [prefix=] [[nexthop=] [[metric=] [[validlifetime=] [[preferredlifetime=] [[store=]active|persistent] 参数: 标记 值 prefix - 要添加的路由前缀。 interface - 接口名或索引。 nexthop - 如果前缀不在链路上,网关地址。 siteprefixlength - 如果在链路上,整个网站的前缀长度。 metric - 路由指标。 publish - 下列值之一: no: 在路由公布中不公布(默认值)。 age: 在路由公布中公布,递减寿命。 yes: 在路由公布中公布,寿命不变。 validlifetime - 路由有效的寿命。默认值是无限。 preferredlifetime - 路由首选的寿命。默认值是无限。 store - 下列值之一: active: 更改只持续到下一次重新启动。 persistent: 更改持久有效(默认值)。 例如:add route :: /0 4 3222::2 用add route命令为PC添加一条默认网关后,可用show route命令显示网关状况,如下图10所示: 图10 显示添加的网关 添加默认网关后,就可以用ping -6命令测试网络是否连通,由于我们所设置的两台主机的IP地址在同一网段中,所以在不设置网关时也可以ping通,而在有路由的网络结构中,就一定要设置相应的网关或路由才能正常通信。 网络结构与上一实验用相同的无路由结构。我们先将PC2设置为PC1的DNS服务器,在上述环境下使用add dns命令为本机添加一个IPv6的DNS服务器,需要说明的是,由于Windows Server 2003 的系统问题,当我们用IPv6的DNS服务时,必须将本机IPv4的DNS服务器设成IPv6 DNS服务器对应的IPv4地址,即需同时将PC2的IPv4地址设为PC1的IPv4 DNS服务器,否则即使正常配置了IPv6也无法利用DNS功能。 add dns命令格式 add dns [interface=] 参数: 标记 值 interface - DNS 服务器添加的接口名。 address - 您在添加的 DNS 服务器的 IPv6 地址。 index - 指定特定的 DNS 服务器的索引(建议使用)。 例如:add dns “本地连接” 3222::2 同样为PC1添加了DNS服务器后,可用show dns命令查看目前DNS服务器列表,如图11所示: 图11 显示添加的DNS服务器 说明:在本实验中,我们直接使用手动添加的IP地址进行实验,如果在有路由的环境中,同样可用路由自动分配的本地站点地址进行该实验,只需将相关的地址换成相应的站点地址即可,同样需对IPv4进行设置,结果如图12所示,在此不进行详细说明。 图12 使用站点地址实验结果 为IPv6启动DNS服务器与IPv4的步骤大致一样,启动DNS服务->创建正向查找区,需要注意,此时IPv4中我们直接建立主机即可,而IPv6则需选择添加其他记录->IPv6主机,这样方可建立与IPv6地址做映射的站点,如图13所示: 图13 建立IPv6主机记录 图14 测试DNS服务功能 在服务器上启动DNS功能后,就可在客户机(PC1)上PING-6 目的域名(test.ipv6),对DNS服务器进行测试,当可以收到正常的回复包时,说明DNS设置正常,已经可以以域名访问网站了。 硬件环境: 图15 网络环境 图15中Rout1和Rout2为两台装有双网卡的PC机,PC1 PC2为两台普通PC机,所有设备均装有IPv6协议,所注IP地址均为站点地址,链接地址为站点地址去掉网络号后以fe80开头。 首先为两台充当路由器的PC机开启路由服务,方法与IPv4中设置完全一致,在此不做介绍。启动了服务器的路由功能后就可以进入到DOS命令提示符下对其进行设置了,首先可用show interface命令显示当前可用的接口名,如图16所示:之后可根据相应的接口用 set interface命令进行设置。 图16 显示接口信息 Set interface 命令格式 : set interface [interface=] [[advertise=]enabled|disabled] [[mtu=] [[siteid=] [[firewall=](enabled|disabled)] [[siteprefixlength=] [[store=]active|persistent] 参数: 标记 值 interface - 接口名或索引。 forwarding - 到达此接口的数据包是否可以转寄到其它接口。 默认值是禁用。 advertise - 是否在此接口上发送路由公告。默认值是禁用。 mtu - 此接口的 MTU。默认值是链路的自然 MTU。 siteid - 站点作用域标识符。 metric - 添加到接口上的所有路由指标。 firewall - 是否在防火墙模式下操作。 siteprefixlength - 默认整个站点的全局前缀长度。 store - 下列值之一: active: 更改只持续到下一次重新启动。 persistent: 更改持久有效(默认值)。 实例 :set interface interface =5 forwarding=enabled advertise=enabled 设置本地连接和本地连接2为可转发数据包并可发送路由公告: 图17 设置路由 之后用add route 命令为两个接口添加两个服务网段: 命令格式: add route [prefix=] [[nexthop=] [[metric=] [[validlifetime=] [[preferredlifetime=] [[store=]active|persistent] 参数: 标记 值 prefix - 要添加的路由前缀。 interface - 接口名或索引。 nexthop - 如果前缀不在链路上,网关地址。 siteprefixlength - 如果在链路上,整个网站的前缀长度。 metric - 路由指标。 publish - 下列值之一: no: 在路由公布中不公布(默认值)。 age: 在路由公布中公布,递减寿命。 yes: 在路由公布中公布,寿命不变。 validlifetime - 路由有效的寿命。默认值是无限。 preferredlifetime - 路由首选的寿命。默认值是无限。 store - 下列值之一: active: 更改只持续到下一次重新启动。 persistent: 更改持久有效(默认值)。 实例 : add route fec0:0:0:3::/64 5 publish=yes 假设两个网段分别为fec0::3::/64和 fec0::2::/64 图18 设置路由网段 当然要对Rout2进行相应的设置: 图19 对route2设置 也许有人会问,上图中进行相应设置后,为什么要重置,这不是多此一举吗,我们也觉得这是多此一举,然而在实验中,我们经过多次实践证实,只有将Rout2进行设置又重置,之后再次设置,Rout2才能正常的转发数据包,实现路由功能。进行了这些设置后,PC2就可以访问Rout1了,然而如果想要PC2访问PC1的话,就还需要对Rout1和Rout2各设置一条路由条目: 图20 对route1增加路由条目 图21 对route2增加路由条目 这是因为PC1和PC2并不在同一网段中,因此需要设置路由条目。这里有一点需要说明的就是在Rout1和Rout2中不可以设置默认路由,在很多论文中说需要设置静态路由,但经过我们的实验证实,设置静态路由后,PC1与PC2的确可以ping通,然而用tracert命令进行路由跟踪后发现,设置静态路由后,会使数据包在两个路由间无限循环,而无法到达对方,产生如图22中的情况: 图23 数据包不能正确到达目的地 而当我们删除了默认路由条目后,数据方可正确送达对方: 图24 删除默认路由后 数据包正常到达目的地 虽然我们通过实践证实了这个结果,但由于我们水平有限,始终无法从理论上解释清楚这一点。 在本次实验过程中,我们对IPv6的相关知识进行了系统的学习,达到了扩展知识面的目的,同时熟悉了对一个项目进行研究的大概步骤和研究方法。在实验研究过程中,我体会到了实验研究一定要本着严谨求实的态度去进行,只有认真的做下去,才能学到真的知识。如果只是觉得好做,万事都是“想当然”的话,将最终一事无成,所学到的知识也只能是别人说的,而无法在自己心中融会贯通,真正领悟。另外一个体会就是对网络和书籍上的资料知识需要进行分析和鉴别,决不可直接拿来用,特别是在这些新的领域里,很多知识并不普及,一些作者也许并不是很确定就把资料出版了,因此在实验过程中我们走了很多弯路,遇到了很多问题。最终还是经过我们自己的探索,进行试探性的实验,才解决了问题。所以我们也许我们不具备鉴别知识的能力,但我们应该有对其进行鉴别的意识,否则将永远没有创新,只是跟随者前人,重复学习而已。正所谓纸上得来终觉浅,绝知此事要躬行。 ——程金龙 实验感想:这个实验,我主要是负责根据资料做实验的,因为本身可查的资料少,感觉挺困难的,刚开始的时候照着配IPV4的方法来弄,遇到的问题不少,在弄DNS时,我们按照查到的资料弄,结果怎么都不出来,最后还是误打误撞的弄上了IPV4的DNS后才通的。后来弄路由也是这样,资料里很少有详细的介绍配置路由条目,我们也是根据对IPV4里的路由条目的理解弄的,最后也遇到了问题,就是默认路由的问题,最终也是在老师的帮助下才解决了。所以我感觉做这个实验很多时候还是和小组的其他成员乱蒙乱碰出来的,最后再总结为什么还得需要这些过程,所以我觉得在学习这种新的技术时就应该有这种乱蒙乱碰的意识,当然得是在已知知识下的试探。这个实验提醒我们,以后做实验时要开拓思路,不能拘泥于现有的资料。 ——谢和秋 在本次实验中,我主要是编写文档并参加了部分的实验。在实验的初期,我们搜集了一些IPv6的相关知识以及相关技术。于是简单的分析后就开始了实验,在初期实验过程中,我们遇到了许许多多的问题,最后发现大部分是由于我们对相关的知识和命令不了解,于是我们又对相关知识进行了系统的学习,最后才能初步的对IPv6进行设置。 在后来的实验过程中,我学会了IPv6的相关配置,知道了怎么通过网络连接进行IPv6的协议安装,以及在DOS命令提示符下通过命令进行协议安装。也学会了IPv6的相关命令,如通过show 命令查看信息,通过add address,add rouet,add dns这些命令来设置IP地址,默认网关以及DNS服务器。在小组的其他成员完成的工作中,通过与他们的交流和学习,我也知道了IPv6 中路由和DNS服务器的设置以及设置中的关键问题。 通过这次实验,我也明白了做事的道理,明白了万事认真做就一定能成功,体会到了万事不能盲目的“凭感觉”,必须真正了解才能将事情做好,面对问题时一定要养成严谨的态度,认真查阅资料,只有真正了解了才能更好的更明白的解决问题。 ——陈雪松 实验感想:经过了这近几个星期的反复实验,我们小组的windows下的ipv6设置这一课题终于有了很大的进展。 我们体会到进行研究的困难,尤其是在没有任何基础的情况下。在这次实验之前,我们对于ipv6的认识很少。所以试验中遇到了许多困难。 因为没有任何这方面的知识作为基础,所以我们上网搜集了一些相关的论文,并对内容进行分析,对于ipv6进行了基础知识的学习。开始,我们自认为学到了一些东西,就盲目的开始了实验,没有想到,我们懂得的只是一点皮毛。所这阶段试验我们遇到了许多问题,许多参数看不懂,甚至有时连最基本的命令都看不明白。这样做下去也没什么意义,于是我们停下来进行反思。我们此时掌握的只是一些皮毛,根本无法将整个实验完整的进行下去。于是我们决定从基础做起,再慢慢的深入。 我们在实验室里搭建好网络环境,首先对局域网中的同一交换机下的两台主机进行基本的ipv6设置,实现两台主机间的通信。通过多次试验,终于实现了两台主机间的通信。能够取得成功我们很兴奋,也有了继续深入的信心。 配置路由实验时,我们对相关参数深入了解后,正确的配置了路由条目,但就是无法通信。然而配置Router2完成后将所有配置重置,然后在进行配置,就可以正常通信了。我们小组成员谁都说不清楚这是为什么,这也是我们心中的遗憾,虽然实验成功了,老师也给予很高的评价,但是我们心中还是存有这个疑问。 我个人认为,一项知识,或者一项技术,只有当你真正的理解其功能原理,才算是真正的理解它,再有就是只有通过不懈的努力才能够得到想要的结果,想当然的做出定论,而不去做出实践的人永远不会取得成功。这就是我这次实验后的感想。 ——高欢 [1] 李晖.蒋理.李丹.在实验室环境下配置IPv6[J].现代情报.2005年2月第二期 [2] 常江.Internet用户IPv6实验网设计与实现[J].计算机与数字工程 2005年第8期 [3] 徐远超.网络工程实践指导教程[M].北京 清华大学出版社 2009年5月 [4] 傅德谦.聂真理.毛红旗.IPv6教学环境的构建[J].计算机与网络.2005年.第24期 [5] 刘立强.王永志.用Window 2003 构建IPv6域名系统[J].黑客防线 2007年7月 [6] 朱善良.IPv6过渡技术[J].电脑知识与技术.第五卷 第22期、 [7] http://www.edu.cn 任务分工: 程金龙 30%(实验25%,论文5%) 谢和秋 20%(实验15%,论文5%) 高 欢 25%(实验5%,论文20%) 陈雪松 25%(实验5%,论文20%) 说明:论文与实验各占50%,各有两人合作完成,程金龙与谢和秋主要负责实验,并参与论文中涉及实验内容部分的修改;高欢与陈雪松主要负责搜索文献资料以及论文的撰写与修改,由于实验内容很有价值,所以在实验过程中,都参加了具体的实验活动。
' +
' +
' +
' +
' +
' +5 Google Maps与Google Earth
5.1 Google Maps与Google Earth的直观介绍:
5.2 比较:
5.3 Google Maps与Google Earth实例比较:
5.4 Google Maps与Google Earth的结合:
6 总结
参考文献:
小组成员及分工
一、IPv6的基本知识
1.1什么是IPv6?
1.2 IPv6的特点和优点
1.3 IPv6相关技术
·DNS解析出Host6的AAAA记录后,将它返回给域名解析器。
·域名解析器要求地址映射器为IPv6地址分配一个IPv4地址。
·地址映射器在IPv4地址池中选择一个未用的保留地址,在映射表中注册后返回给域名解析器。
·域名解析器为分配的IPv4地址产生一条A记录,返回给IPv4应用程序。
·IPv4应用程序调用IPv4的SocketAPI函数,函数映射器对调用命令进行拦截,判断其是否来自于IPv6的应用。若不是,跳过翻译程序;否则,函数映射器向地址映射器请求该IPv4地址对应的IPv6地址,地址映射器从映射表中查找后将结果返回。函数映射器使用收到的这个AAAA型地址调用Host6上相应的IPv6socketAPI函数。
·当函数映射器接收到Host6上IPv6socketAPI函数的应答后,向地址映射器请求与Host6对应的IPv4地址。然后,函数映射器利用此IPv4地址继续完成socketAPI函数的调用。
图2 域名解析流程图二、 IPv6的基本配置
2.1 实验环境
图4 无路由网络环境 2.2 IPv6协议的安装
2.2.1 Windows对话框下的协议安装
2.3 添加IP地址
2.4添加默认网关:
2.5 DNS服务器设置
设置完成后在服务器端(即PC2)上ping-6 目标域名(test.ipv6),测试DNS功能是否已可以工作,如果可以显示如图14中的信息,正常接收到从目的主机发回的回复包,说明服务器的DNS服务功能已经启动,可以正常提供服务了。 2.6 IPv6 中 路由器的设置
实验感想
参考文献