摘 要
Web Service是近几年较为流行的Web应用开发技术,它改变了传统的B/S或C/S软件开发模式,为软件实体之间共同协作提供了公共平台。嵌入式的Web服务技术, 具有功能强大、实时性好、可靠性高和安全性好等优点,将成为今后Web服务技术发展的主流方向。
本文介绍了Web Service 的定义及其关键技术,对于课题要求嵌入式的Web Service的实现采用Linux+SkyEye等软件虚拟出相应的嵌入式的开发环境,利用嵌入式Linux即Uclinux来充当嵌入式的Web Service 平台。本文就课题实现所须的一些关于嵌入式和Web Service的知识进行了详细介绍,具体介绍了如何利用SkyEye等软件来模拟嵌入式系统。这样我们就不必自己去主动解析XML和了解SOAP的细节。本文是用C来实现简单的客户端和服务器端的通信程序。能够进行简单的加,减,乘,除和幂运算。
我们本次设计采用的软件都是免费的,下载方便,使用简单,由此可见嵌入式Web之路因为种种的有利条件和优好的性能,必定有着广袤的前景,是必然的趋势。
关键词:WebService,嵌入式系统,xml,uclinux ,skyeye
I
孙世盛:Linux下嵌入式web服务的研究与实现
Abstract
Web Service is more popular in recent years of Web application development technologies; it has changed the traditional B / S or C / S software development model for software entities together to provide a public platform. Embedded web services technology is a powerful, real-time, high reliability and security of such advantages will become web services technology development mainstream.
This paper describes the web service definition and key technologies, embedded requested topics for the web service to achieve the adoption of linux and other software skyeye + virtual corresponding embedded development environment embedded linux is to act as embedded remote web service platform. This article topics to be achieving some of the embedded web service and the knowledge of the details, give specific details of how to use the skyeye software to simulate the embedded system. In this way we would not have to take the initiative themselves to parsing xml and soap to understand the details. This is the c to achieve a simple client and the server side of the communication process. To simple, plus or minus, multiplication, addition and exponentiation.
We used this design of the software are free and convenient download, easy to use, so embedded web various road because of the favorable conditions and advantages of a good performance, we have vast prospects is an inevitable trend
Key words:WebService, embedded systems ,xml,uclinux,skyeye
II
山东交通学院毕业设计(论文)
目 录
前 言 ..........................................................................................................................................1 1 绪论 ..........................................................................................................................................2
1.1嵌入式的现状....................................................................................................................2 1.2研究思路...........................................................................................................................3 1.3发展前景...........................................................................................................................3
1.3.1嵌入式的发展前景………………………………………………………………………….3 1.3.2嵌入式web服务的发展前景………………………………………………………………4
2 WebService和其核心技术............................................................................................................5
2.1 WebService的相关介绍 .....................................................................................................5 2.2WebService体系结构 ..........................................................................................................6 2.3 WebService的核心技术 .....................................................................................................8
2.3.1可扩展标记性语言XML……………………………………………………………………8 2.3.2简单对象访问协议SOAP…………………………………………………………………..9 2.3.3Web Service描述语言WSDL……………………………………………………………….9 2.3.4UDDI…………………………………………………………………………………………9
3需求分析 .................................................................................................................................. 10
3.1研究目的......................................................................................................................... 10 3.2运行环境规定.................................................................................................................. 11 3.3系统功能描述.................................................................................................................. 11 3.4数据流程图 ..................................................................................................................... 11 3.5输入输出......................................................................................................................... 12 4嵌入式下的WebService的实现.................................................................................................. 12
4.1软件和硬件需求 .............................................................................................................. 12 4.2相关基础知识介绍........................................................................................................... 12 4.3环境配置和平台搭建 ....................................................................................................... 13 4.3uclinux下的编译工具介绍 ................................................................................................ 19 4.4简单程序测试.................................................................................................................. 22 5详细设计计算器程序的实现 ...................................................................................................... 24
5.1程序设计和功能实现 ....................................................................................................... 24 5.2 流程图 ........................................................................................................................... 27 5.3程序测试......................................................................................................................... 27 结 论 ........................................................................................................................................ 31 致 谢 ........................................................................................................................................ 32 参考文献 ..................................................................................................................................... 33
III
孙世盛:Linux下嵌入式web服务的研究与实现
附录A部分程序原码................................................................................................................... 34
IV
山东交通学院毕业设计(论文)
前 言
Web Services似乎一夜之间就热了起来。世界上的顶级公司,不管是微软IBM还是SUN,都纷纷推出web Services的相关技术。然而,Web Services技术还处于不成熟的发展阶段,其运行性能也是人们关沣的焦急之一。本论文是对此背景对Web Services的实现和性能进行了深入研究和探讨。
目前,被业界称为计算机IT 技术的第三次(继PC 和Internet 之后) 的Web Services 技术已经逐步显露出巨大商业机会,软件业因此正在酝酿一场巨变。这将是自从WWW 问世以来这个产业所面临的一次最大规模的”洗牌”,但也酝酿着巨大的商业机会。商业机会的实现,需要依靠技术和应用模式的双重保障。Web Services 技术的发展将促使Web Services 应用的成熟和完善,而Web Services 应用模式将为商业应用提供指引,那就是,传统Web 应用技术解决的问题是如何让人来使用Web 应用所提供的服务,而Web Services 则要解决如何让计算机系统来使用Web 应用所提供的服务。Web Services 技术完全基于标准的技术,只有基于标准,所有的开放厂商才有相同的准则,才能够在各自的平台上开发出具有跨平台互操作能力的软件产品和解决方案。标准是达成跨平台互操作能力的灵魂。
基于本次设计的要求比较简单,只需要实现简单的嵌入式的Web Services,能够进行客户端和服务器端的简单通信就行。
嵌入式的Web Services系统,具体来说就是使用嵌入式系统来实现Web Services或者类似的架构。在具体实现中,主要应用方式为使用嵌入式系统来架构服务。在这种系统中,我们使用嵌入式系统来实现Services,使用嵌入式系统来实现一些单一,简单的Web Services(服务)。形成一组组服务集群在网络上供客户端通过标准的Web Services调用方法来使用。
1
孙世盛:Linux下嵌入式web服务的研究与实现
1 绪论
1.1嵌入式的现状
目前,国内外企业应用系统的结构主要有基于“客户端/服务器”的C/S结构和基于
“浏览器/服务器”的B/S结构,虽然两种结构都曾广泛应用,但随着软件技术的不断不展,均暴露出了不少问题。
C/S结构,由客户端与数据库服务器构成。客户端与用户进行交流,首先向数据库服务器发出请求,然后数据库服务器响应请求,并将结果返回客户端。相对于以前的单机结构,C/S模式有了很大发展,能支持多用户共享数据库信息。但是,随着企业规模的不断扩大以及应用程序日益复杂化,这种结构的弊端逐渐暴露出来,主要表现在以下几个方面:
(1)客户端需要专用软件支持,而软件安装、维护及升级需要在客户端逐台进行,工作量大。
(2)系统资源浪费,由于硬件更新远跟不上软件的更新速度,因此客户不得不在本地硬盘上安装大量软件,而实际只用到其中的很小部分。 (3)系统不支持Internet 。
B/S结构,由Web服务器负责与用户连接,响应用户请求后先对指令进行内部编码,判断指令的内容,然后执行相应的操作,需要时调用应用服务器中企业对象提供的服务,最后在服务器中产生动态的,Web页面,并回传到客户端浏览器显示结果。
B/S结构主要是利用了不断成熟的Web浏览器技术,结合浏览器的多种脚本语言(如JavaScript)和ActiveX技术才能实现其强大功能。B/S结构的客户端无需再装用户界面程序,用户界面完全由Web浏览器实现,从而使得传统C/S结构下的客户端相比大大“减肥”。但是,随着B/S结构的不断发展与应用,其不足之处也开始暴露出来,由于它不支持跨平台通信,因此在大型的企业级基于.NET 的Web Service的多层分布式体系结构的研究与应用应用系统中,一直都无法得到很好的应用。
无论是CAS还是BSS结构都只是同一数据库系统所采用的不同结构,无法在由多数据库组成的复杂系统中进行跨平台的交互,在一些大型的系统应用中,常常要整合现有的各个分布的子系统资源,而采用基于Web Service的多层分布技术正是解决这一难题的关键途径。
针对上述情况,众多的国外大公司都陆续推出来与这些技术相适应的软件开发平台和Web Service技术,例如在系统开发平台方面有微软公司的.Net平台,SUN公司的J2EE平台等;在Web服务器方面有微软公司的IIS (Internet Information Server), The Apache Group推出的Apache和Netscape公司的Enterprise Server等;在分布式技术方面上有Web Service, CORBA和DCOM等。
2
山东交通学院毕业设计(论文)
1.2研究思路
本次课题的设计要求在嵌入式设备中实现Web Service可以轻松实现嵌入式设备的远程管理以及远程获取该设备的功能及服务。嵌入式Web Service不同于简单的嵌入式Web Server。它可以建立在Web Server的基础上;也可以不需要Web Server。只要在规定的协议(XML/SOAP)基础上实现Web service的功能即可。嵌入式Web Service不需要支持全部的XML协议,只须支持必须的协议子集即可。
设计嵌入式Web Service首先需要实现TCP/IP协议下的网络编程,在此基础上,进行XML协议的解析、执行。设计嵌入式Web Service,要求提供如下功能:
1、 能提供本地参数修改服务:可以通过XML协议2、 能提供数据采集的服务:模拟实现数据采集(从数据文件中抽取数据),通过Service远程提供数据。
以上是最基本的功能,其他功能可以灵活发挥。运行环境:建议采用PC机,安装Linux,编写Linux下终端运行的程序。也可以采用WinCE等。如果有相应的嵌入式设备,则可以直接在相应设备上运行。
对于课题要求嵌入式的Web Service的实现采用Linux+SkyEye等软件虚拟出相应的嵌入式的开发环境,利用嵌入式linux即uclinux来充当嵌入式的Web Service 平台。这个我们就不必自己去主动解析xml和了解soap的细节。先在在Linux下安装SkyEye,然后安装uclinux,实现嵌入式环境,用C来实现简单的客户端和服务器端的通信。
来修改本地的一些工作参数,如允许建立连接的最大数等,这些参数能保存。
1.3发展前景
1.3.1嵌入式的发展前景
嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一。嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应要求很高等。特别是随着消费家电的智能化,嵌入式更显重要。像我们平常常见到的手机、PDA、电子字典、可视电话、VCD/DVD/MP3 Player、数字相机(DC)、数字摄像机(DV)、U-Disk、机顶盒(Set Top Box)、高清电视(HDTV)、游戏机、智能玩具、交换机、路由器、数控设备或仪表、汽车电子、家电控制系统、医疗仪器、航天航空设备等等都是典型的嵌入式系统。
嵌入式技术的发展以及对未来工业将产生的巨大影响已经引起世界各国的高度关注。
欧洲目前在航空、汽车电子、工业、通信和消费电子方面的嵌入式技术占有领导位置,为了继续保持对美国和日本的竞争对手的领先优势,欧盟在2004年成立了ARTEMIS(Advanced Research and Development on Embedded Intelligent Systems)组织,
3
孙世盛:Linux下嵌入式web服务的研究与实现
在欧洲范围内整合资金和技术优势,把嵌入式技术上升到一个重要的战略高度进行发展。
欧盟认为,嵌入式技术是IT领域中发展最快的内容,并将保持巨大的技术发展和商业应用机会,掌握嵌入式技术的领导位置,将具有强大的经济和政治利益。嵌入式系统的应用领域非常广泛,在产业发展中的重要性仍在持续提升。
据欧盟的统计:2003年,全球大概有80亿片嵌入式可编程微处理器。到2010年,预计会达到160亿片,地球上的人平均有3个处理器。在航空电子中,嵌入式软件的开发成本占整个飞机研制成本的50%;对于汽车工业,汽车电子在整车价值中的比例逐年提高,将从1997年的20%提升到2010年的33-40%。
消费电子数量越来越大,据预测,到2010年,仅数字家在美国的销售额就将达到2000亿欧元。由此我们相信嵌入式在未来的发展中,必定有着广袤的前景。 1.3.2嵌入式web服务的发展前景
对于嵌入式Web服务器的研究和应用,其意义是重大的。它为我们管理、控制和监测各种各样设备提供了一个很好的途径。这种设备可以是具有有限内存资源的8位或16位系统,已足够提供一个用户界面,而且这种方式是基于Internet的。这种设备可以在世界任何一个地方,只要它连入Internet就能够控制它。
目前国外的相关研究很多,如Pharlap公司的MicroWeb、AgranatSystems公司的EmWeb、EmWare公司的emMicro、Allegro公司的RomPager、WindRiver公司的Wind,还有Boa、Enea、PicoWeb、ChipWeb、Ipic、NetAcquire、Voyager、Quiotix等。国内的有Webit。
如图1-1所示就是典型的嵌入式Web系统模型
图1-1嵌入式Web系统模型 Fig.1-1Embedded Web System Model
4
山东交通学院毕业设计(论文)
嵌入式Web服务器的发展是很有前景的,它为未来信息家电的网络化和信息化提货了切实可行的途径。嵌入式Web技术是现在研究的一个热点,还有很多问题需要解决,其应用的范围也有待进一步探索。
2 WebService和其核心技术
2.1 WebService的相关介绍
研究一下当前的应用程序开发,你会发现一个绝对的倾向:人们开始偏爱基于浏览器的瘦客户应用程序。这当然不是因为瘦客户能够提供更好的用户界面,而是因为它能够避免花在桌面应用程序发布上的高成本。发布桌面应用程序成本很高,一半是因为应用程序安装和配置的问题,另一半是因为客户和服务器之间通信的问题。
传统的Windows富客户应用程序使用DCOM来与服务器进行通信和调用远程对象。配置好DCOM使其在一个大型的网络中正常工作将是一个极富挑战性的工作,同时也是许多IT工程师的噩梦。事实上,许多IT工程师宁愿忍受浏览器所带来的功能,也不愿在局域网上去运行一个DCOM。在我看来,结果就是一个发布容易,但开发难度大而且用户界面极其受限的应用程序。极端的说,就是你花了更多的资金和时间,却开发出从用户看来功能更弱的应用程序。不信?问问一个会计师对新的基于浏览器的会计软件有什么想法:绝大多数商用程序用户希望使用更加友好的Windows用户界面。 关于客户端与服务器的通信问题,一个完美的解决方法是使用HTTP协议来通信。这是因为任何运行Web浏览器的机器都在使用HTTP协议。同时,当前许多防火墙也配置为只允许HTTP连接。
许多商用程序还面临另一个问题,那就是与其他程序的互操作性。如果所有的应用程序都是使用COM或.NET语言写的,并且都运行在Windows平台上,那就天下太平了。
然而,事实上大多数商业数据仍然在大型主机上以非关系文件(VSAM)的形式存放,并由COBOL语言编写的大型机程序访问。而且,目前还有很多商用程序继续在使用C++、Java、Visual Basic和其他各种各样的语言编写。现在,除了最简单的程序之外,所有的应用程序都需要与运行在其他异构平台上的应用程序集成并进行数据交换。这样的任务通常都是由特殊的方法,如文件传输和分析,消息队列,还有仅适用于某些情况的的API,如IBM的\"高级程序到程序交流(APPC)\"等来完成的。
在以前,没有一个应用程序通信标准,是于平台、组建模型和编程语言的。只有通过Web Service,客户端和服务器才能够自由的用HTTP进行通信,不论两个程序的平台和编程语言是什么
Web Service是一种编程模型,它提供了在可缩放的、松棍合和非特定平台的环境下交换信息的能力,交换信息使用诸如HTTP, XML, XSD, SOAP和WSDL之类的标准协
5
孙世盛:Linux下嵌入式web服务的研究与实现
议。Web Service是用标准的、规范的XML概念描述的,称为Web Service的服务描述。这一描述囊括了与服务交互需要的全部细节,包括消息格式(详细描述操作)、传输协议和位置。
Web Service不是简单的我们平时访问的网站,或者网页。它是分布式技术在互联网时代的新发展。本质上说,它是松散藕合的、可复用的软件模块;从外部使用者的角度来看,Web Service就是一种部署在Web上的对象/组件。它们发布以后可以通过标准的Internet协议在用户使用任何语言编写的客户端程序中访问,也可以通过浏览器的形式访问。具体来说,可以分为以下几点:
首先,Web Service是可复用的软件模块,Web Service是对软件开发中面向对象设计的发展和升华。基于组件的模型允许开发者复用其它人创建的代码模块,组成或者扩展它们,形成新的软件。
其次,这些软件模块是松散祸合的。传统的应用软件设计模式要求各个单元之间紧密连接,这种联接形成的复杂性要求开发者必须对联接的两端元素有完全的了解和控制能力。而且,这种连接一旦建立后,很难从中把一个元素取出,用另外一个元素代替。相反,松散祸合的系统,只需要很简单的协调,并允许自由的配置。
第三,从语义上看,Web Service封装了离散的功能。一个Web Service就是一个自包含的‘小程序’,完成单个的任务。Web Service的模块使用其它软件可以理解的方式描述输入和输出。其它软件知道它能做什么,如何调用它的功能以及返回什么结果。
第四,Web Service可以在程序中访问。和Web网站或桌面程序不同,Web Service
的设计更多的是为了被其他软件调用,并与其它软件交换数据。
最后,Web Service是在Internet或者Intranet上发布的。与以往的组件模型不同的是,调用Web Service时并不是通过特定的组件模型协议,而是通过互联网的标准协议HTTP和标准数据格式XML的SOAP(Simple Object Access Protocol)协议,因此克服了传统组件模型间不能互通讯的缺点。
此外,Web Service的接口是通过它所能接受的请求消息和产生应答消息的消息格式来定义的,因此我们可以在任何第一章关键技术:XML和Web Service平台下使用任何程序设计语言来编写程序调用Web Service,只要它能按照Web Service接口所要求的形式生成请求消息并应答消息。
2.2WebService体系结构
WebService是用面向对象技术封装起来的对象,它对外以对象方法的形式提供服务,在Internet 环境中,提供远程发现和调用的机制。首先,对象在UDDI (其功能类似
6
山东交通学院毕业设计(论文)
DNS) 中注册,则应用开发就可以利用其发现机制,查找所需的服务, UDDI 就会返回查找结果(服务名称和位置) 。
应用开发就可以通过SOAP 协议访问远程的Web Service , 远程的Web Service 通过身份认证后,就会调用其方法,并将结果返回应用程序。Web Service 这些服务是用WSDL 来描述的。
Web Service 的体系结构图如图2-1:
图2-1体系结构图
Fig2-1Architecture plans
更加直观的表示方法如图2-2所示:
图2-2体系结构图 Fig2-2Architecture plans
7
孙世盛:Linux下嵌入式web服务的研究与实现
WebService体系结构是面向服务的体系结构(SOA),是基于三种角色(服务提供者,服务注册中心和服务请求者)之间的交互。这种交互涉及到的内容包括发布,查找和帮定操作。图2-2显示了这些操作和提供这些操作的组件及他们之间的交互过程。 这里这里服务提供者定义了Web Services的服务捕述并把它发布到服务请求者或注册服务中心。服务请求者使用盘找操作从本地或服务注册中心检索服务描述, 然后使用WSDL与服务提供者进行绑定并调用Webervices实现或同它交互。
2.3 WebService的核心技术
从表面上看,Web Service 就是一个应用程序, 它向外界提供一个可被Web 调用的应用程序接口。也就是说, 用户可以用编程的方法通过Web来调用这个应用程序。其基本理念是: 把软件做成服务, 且遵从相应的标准, 让不同的系统可以跨越平台, 彼此相互兼容, 具有无缝通信和数据共享的能力。Web Service 技术架构由以下相关标准协议构成。
如图2-3所示:
图2-3Web Service的技术架构图
Fig2-3 Web Service Technology chart
Web Service 技术要让异构平台上的不同系统可以互相通信和共享数据, 数据在Web上传输必须以XML 标准进行, XML 是Web Service 的基石。而且,不同系统必须遵从SOAP协议来传输XML 数据, SOAP是利用XML 技术与远程过程调用的通讯协议, 它把对象间的请求和响应都打包成XML文档, 以HTTP方式在对象间传递。通过WSDL (Web Service Description Language) 协议可以让其它系统了解本系统Web Service 提供了哪些服务和功能, 它用机器可阅读形式描述本系统的Web Service, 从而让其它系统可以调用本系统提供的服务。 2.3.1可扩展标记性语言XML
可扩展标记语言(XML) 是Web Service 平台中表示数据的基本格式,是一种数据结构化标准语言。除了易于建立和易于分析外,XML 主要的优点在于它既是平台无关的, 有时厂商无关的。W3C 制定的XML Schema(XSD) 定义了一套标准的数据类型,并给出
8
山东交通学院毕业设计(论文)
了一种语言来扩展这套数据类型。Web Service 平台就是利用XSD来作为其数据类型系统的。XML是一种界定文本数据的简单而标准的方法,它是开放的、自描述的。可以说,XML是为Web设计的。它使我们可以方便地与其他人或者应用程序之间共享数据,这也是Web Services使用XML作为其数据存储的原因。
Web services使用XML作为表示数据的标准方法。大多数Web services相关的规范使用XML作为数据表示形式,并使用XML架构述数据类型。XML(extensible Markup Language 可扩展标记 言)是针对网络应用的一项新技术。SGML, HTML都是我们非常熟悉的标记语言,XML也是标记语言的一种。XML也是SGML的一个子集,它不仅继承了SGML的优点,并在此基础上去掉了SGML的不重要的部分。使之变得简单、易学、好懂。
XML具有内容和形式的分离,良好的扩展性,良好的跨平台移植性和良好的自捕述等特点。
2.3.2 简单对象访问协议SOAP
SOAP (Simple Object Access Protocol , 简单对象访问协议) 是一种基于XML的不依赖传输协议的表示层协议,用来在应用程序之间方便地以对象的形式交换数据。Web services使用SOAP作为它的标准通信协议。
SOAP是一个用来在分散,分布式的环境巾交换信息的简单协议,它是一个基于XML的协议。因为SOAP消息的格式是标准的,并且是基于XML的,所以SOAP可以用来在不同的计算机体系结构、不同的语言和不同的操作系统之间进行通信。 2.3.3 Web Service描述语言WSDL
WSDL(Web Services Description Language,Web services描述沿言)是由Microsoft和IBM合作开发的一种基于XML的协定语言。它用来定义Web services并捕述如何访问这些服务。WSDL文档把Web 8elvices定义为一组在包含面向文档或面向过程信息的消息上执行操作的端口(endpoin1)。其中操作(operation)和消息(message)采用抽象方式进行捕述。然后把它们绑定到具体的网络协议和消息格式上来定义一个具体的端口。多个相关的具体端口结合在一起就构成了服务(service)。WSDL是可扩展的,用户可以使用它来描述端点和消息i 不用考虑实际通信所使用的网络协议。当用户获取Web services的WSDL文档后,就能从中得知Web services所处的位置、它所包含的方法,以及每个方法的参数和返回值的类型等信息,并使用这些信息来执行方法调用。 2.3.4UDDI
UDDI(统一描述、发现和集成协议)计划是一个广泛的,开放的行业计划,它使得商业实体能够
(1) 彼此发现。
(2) 定义他们怎样在internet上互相作用,并在一个全球的注册体系架构享信
9
孙世盛:Linux下嵌入式web服务的研究与实现
息。
UDDI是这样一种基础的系统构筑模块,他使商业实体能够快速,方便地使用他们自身的企业应用软件来发现合适的商业对等实体,并与其实施电子化的商业贸易。 UDDI同时也是Web服务集成的一个体系框架。它包含了服务描述与发现的标准规范。UDDI规范利用了W3C和Internet工程任务组织(IETF)的很多标准作为其实现基础,比如扩展标注语言(XML),HTTP和域名服务(DNS)这些协议。另外,在跨平台的设计特性中,UDDI主要采用了已经被提议给W3C的SOAP(Simple Object Access Protocol,简单对象访问协议)规范的早期版本。
UDDI是一套面向WEB服务的信息注册中心的实际标准和规范。创建UDDI注册中心的目的实现WEB服务的发布和发现。利用UDDI规范在WEB上建立发现服务,这些发现服务为所有请求者提供了一致的接口。使得已经发布的WEB服务能通过编程并需要的请求者发现。UDDI规范文本定义了UDDI操作人口站点(UDDI Operator Site1能够支持的API接口和API中用XML描述的数据结构的具体定义。
组成Web services标准的各协议之间的层次关系如图2-4:
Work Flow Uaivcrsal Description,Discovery,and Integration Services Description Messaging Transport Protocols WSDL SOAP HTTP and others Fig2-4 Hierarchy Chart
WSFL UDDL Extensible Markup Language XML 图2-4层次关系图
3需求分析
3.1研究目的
研究目的:Linux下嵌入式web服务的研究与实现。Web Services 技术的发展将促使Web Services 应用的成熟和完善,而Web Services 应用模式将为商业应用提供指引,那就是,传统Web 应用技术解决的问题是如何让人来使用Web 应用所提供的服务。Web Services 则要解决如何让计算机系统来使用Web 应用所提供的服务。Web Services 技术完全基于标准的技术,只有基于标准,所有的开放厂商才有相同的准则,才能够在各自的平台上开发出具有跨平台互操作能力的软件产品和解决方案。如何在嵌入式设备中实现Web Service,实现嵌入式设备的远程管理以及远程获取设备的功能及服务,是我们研究的重点。
10
山东交通学院毕业设计(论文)
3.2运行环境规定
硬件环境
CPU:
PentinumⅢ以上 128MB以上 1GB以上
内存: 硬盘:
软件环境
OS:
linux9.0以上版本
时钟频率: 90MHz以上
编译和测试软件: SkyEye,uclinux
3.3系统功能描述
在嵌入式系统下,本设计采用的是uclinux系统,实现Web Service。具体表现为客户端和服务器进行简单的通信,即能够进行加,减,乘,除运算。服务器端运行后,客户端向服务器端发送运算请求,服务器做出响应,在客户端出现运行结果。
3.4数据流程图
客户端 运算 加 减 服务器端 乘 除
11
孙世盛:Linux下嵌入式web服务的研究与实现
3.5输入输出
输入:阿拉伯数字,运算命令(+,-,*,/) 输出:结果
4嵌入式下的WebService的实现
4.1软件和硬件需求
硬件要求为:能够装上和运行linux9.0的电脑。软件:需要安装linux9.0, linux下安装Skyeye, 安装arm-elf交叉编译器,安装ucosii for skyeye,编译并运行uClinux-dist-20020927.tar.gz,gcc。
4.2相关基础知识介绍
要在嵌入式系统下进行开发,就要建立嵌入式的开发平台,uclinux是当前广泛使
用的一种嵌入式的操作系统。
uCLinux 是Linux 2.0核心的分支,是针对没有MMU管理单元的微控制器,继承了Linux的大多数特性。多数的Linux下应用程序和驱动程序都可以在uClinux下运行。 虽然大多数 Linux 系统运行在 PC 平台上,但 Linux 也可以作为嵌入式系统的操作系统。Linux 的安装和管理比 UNIX 更加简单灵活,这对于那些 UNIX 专家们来说又是一个优点,因为 Linux 中有许多命令和编程接口同传统的 UNIX一样。但是对于习惯于Windows操作系统的人来说,需要记忆大量的命令行参数却是一个缺点。随着Linux社团的不断努力,Linux的人机界面开发环境正在不断完善。
典型的Linux系统经过打包,在拥有硬盘和大容量内存的 PC 机上运行,而嵌入式系统不需要这么高的配置。一个功能完备的 Linux 内核要求大约 1 MB 内存。而 Linux 微内核只占用其中很小一部分内存,包括虚拟内存和所有核心的操作系统功能在内,只需占用系统约100KB内存。只要有 500KB的内存,一个有网络栈和基本实用程序的完全的 Linux 系统就可以在一台 8 位总线(SX)的 Intel 386 微处理器上运行得很好了。由于内存要求常常是由应用的需要所决定的,例如 Web 服务器或者 SNMP 代理,Linux 系统甚至可以仅使用 256 KB ROM 和 512 KB RAM 进行工作。因此它是一个瞄准嵌入式市场的轻量级操作系统。
与传统的实时操作系统(RTOS)相比,采用像嵌入式 Linux 这样的开放源码的操作系统的另外一个好处是 Linux 开发团体看来会比 RTOS 的供应商更快地支持新的 IP 协议和其他协议。例如,用于 Linux 的设备驱动程序要比用于商业操作系统的设备驱动程序多,如网络接口卡(NIC)驱动程序以及并口、串口驱动程序。
Linux 操作系统本身的微内核体系结构相当简单。网络和文件系统以模块形式置于微内核的上层。驱动程序和其他部件可在运行时作为可加载模块编译到或者是添加到
12
山东交通学院毕业设计(论文)
内核。这为构造定制的可嵌入式系统提供了高度模块化的构件方法。而在典型情况下该系统需结合定制的驱动程序和应用程序以提供附加功能。
嵌入式系统也常常要求通用的功能,为了避免重复劳动,这些功能的实现运用了许多现成的程序和驱动程序,它们可以用于公共外设和应用。Linux 可以在外设范围广泛的多数微处理器上运行,并早已经具备了现成的应用库。
Linux用于嵌入式的因特网设备也是很合适的,原因是它支持多处理器系统,该特性使Linux具有了伸缩性。因而设计人员可以选择在双处理器系统上运行实时应用,提高整体的处理能力。例如,可以在一个处理器运行GUI,同时在另一个处理器上运行Linux系统。
在嵌入式系统上运行 Linux 的一个缺点是 Linux 体系提供实时性能需要添加实时软件模块。而这些模块运行的内核空间正是操作系统实现调度策略、硬件中断异常和执行程序的部分。
由于这些实时软件模块是在内核空间运行的,因此代码错误可能会破坏操作系统从而影响整个系统的可靠性,这对于实时应用将是一个非常严重的弱点。尽管如此,已经有许多嵌入式 Linux 系统的示例,可以有把握地说,某种形式的 Linux 能在几乎任一台执行代码的计算机上运行
4.3环境配置和平台搭建
(1)在Linux下安装SkyEye开源软件包
要求先在在PC机上安装Red Hat linux9.0以上版本。
SkyEye是一个开源软件(OpenSource Software),中文名字是“天目”。SkyEye的目标是在通用的Linux和 Windows平台实现一个纯软件模拟集成开发环境,模拟常见的嵌入式计算机系统。让我们在这种虚拟的嵌入式环境下进行嵌入式平台下的操作。
可在SkyEye上运行Linux、uclinux等多种嵌入式操作系统和各种系统软件(如TCP/IP,图形子系统,文件子系统等),并可对它们进行源码级的分析和测试。
通过SkyEye仿真集成环境可以很方便地进入到嵌入式系统软件学习和开发的广阔天地中。尤其对于缺少嵌入式硬件开发环境和软件开发环境的用户来说,它将是一个非常有效的学习工具和开发手段,因为SkyEye的整个软件系统都是Open Source的,且基于GPL协议(μCOS-II除外)。因此,如果要学习Linux操作系统或者进行嵌入式系统开发,但苦于没有硬件支持,SkyEye仿真环境软件是一个很好的选择!
如果想研究与具体硬件无关的系统软件(如TCP/IP协议栈等),采用SkyEye可以有效地提高工作效率,因为你可以直接在μCOS-II和μCLinux for SkyEye上进行开发和调试,而与具体硬件打交道的各种driver已经存在,且有源码级调试环境,只需关心高层的逻辑设计和实现就可以了。
由于SkyEye的目标不是验证硬件逻辑,而是协助开发、调试和学习系统软件,所以在实现上SkyEye与真实的硬件环境相比还是有一定差别的。SkyEye在时钟节拍的时
13
孙世盛:Linux下嵌入式web服务的研究与实现
序上不保证与硬件完全相同,对软件透明的一些硬件模拟进行了一定的简化,这样带来的好处是SkyEye的执行效率更高。
SkyEye并不能取代开发板等硬件的功能,但通过它可以比较容易进入到嵌入式软件的广阔天地中。由于SkyEye建立在GDB基础之上,使用者可以方便地使用GDB提供的各种调试手段对SkyEye仿真系统上的软件进行源码级的调试,还可以进行各种分析,如执行热点分析、程序执行覆盖度分析等。由于SkyEye提供了源代码和相关文档,有经验的用户完全可以修改和扩充SkyEye来满足自己的需求。
SkyEye硬件模拟逻辑结构图如下图4-1
图4-1硬件模拟逻辑结构图 Fig4-1Hardware simulation logic chart
目前SkyEye模拟了大量的硬件,包括CPU内核、存储器、存储器管理单元、缓存单元、串口、网络芯片、时钟等。下面做一简单介绍。 ①CPU和开发板系列
SkyEye可以模拟的CPU主要是基于ARM内核的CPU,包括ARM7TDMI,ARM720T,
14
山东交通学院毕业设计(论文)
ARM9TDMI,ARM9xx,ARM10xx,StrongARM,XScale等。ARM7/9/10TDMI是ARM系列CPU的基本核心部分,它们不支持MMU/CACHE和一些扩展指令,是ARM CPU基本核。ARM720T、ARM920T、ARM10xx、StrongARM、Xscale是建立在以上ARM CPU核上,并扩展了MMU/CACHE和其它功能。各硬件开发公司可以根据它们的需求在上述CPU核上加上特定的扩展,形成基于各种ARM基本核心的特定CPU,如Atmel91X40和 ep7312,分别扩展了ARM7TDMI和ARM720T的内存控制和各种I/O控制器,简化了开发板的逻辑设计,大大增强了开发板的功能。
SkyEye模拟的开发板包括基于Atmel 91X40/AT91RM92 CPU的开发板,基于Crirus Logic ep7312的开发板、基于StrongARM CPU的ADSBITSY开发板,基于XScale PXA250 CPU的LUBBOCK开发板、基于SAMSUNG S3C4510B/S3C44B0 CPU的开发板、基于SHARP LH7A400 CPU的开发板、基于Philip LPC22xx CPU的开发板等。主要模拟了对应各个开发板的串口、时钟、RAM、ROM、LCD、网络芯片等硬件外设
目前能在SkyEye上运行下面的操作系统和系统软件有uC/OSII-2.5.x(支持网络),uClinux(基于Linux2.4.x内核, 支持网络),ARM Linux 2.4.x/2.6.xlwIP on uC/OSII基于uC/OSII, uclinux, ARM Linux的应用程序。
有了Skyeye,我们就可以通过SkyEye可以模拟嵌入式环境进行嵌入式开发,帮助促进嵌入式系统的学习,在不需要额外硬件的情况下学习和分析uclinux操作系统和其它嵌入式操作系统,如ucosII等,通过skyeye促进操作系统的研究,如ucosII,uclinux+RTAI,uclinux2.5.x等。 SkyEye的安装
②存储器管理单元和缓存单元
MMU(Memory Management Unit)即存储器管理单元,是用来管理虚拟内存系统的硬件。MMU的两个主要功能是:将虚地址转换成物理地址;控制存储器的存取权限。MMU关掉时,虚地址直接输出到物理地址总线。MMU本身有少量存储空间存放从虚拟地址到物理地址的匹配表,此表称作TLB(Translation Lookaside Buffers)。TLB表中保存的是虚址及其对应的物理地址,权限,域和映射类型。当CPU对一虚拟地址进行存取时,首先搜索TLB表以查找对应的物理地址等信息,如果没有查到,则进行查找translation table,称为Translation Table Walk(简称TTW)。经过TTW过程后,将查到的信息保存到TLB。然后根据TLB表项的物理地址进行读写。CACHE是缓存单元,主要用于缓存内存中的数据,其读写速度远快于内存的读写速度,所以可以提高CPU的内存数据的访问效率。
write/read buffer硬件单元的作用与CACHE的作用类似。MMU、CACHE、write/read buffer一般是高性能CPU的重要组成部分,且不同类型CPU的MMU、CACHE、write/read buffer的逻辑行为也有一定的差异。为了支持模拟多种类型CPU的MMU/CACHE,SkyEye包含了一个通用的MMU/CACHE模拟实现。通过对一些参数的调整可以支持模拟多种类型的MMU/CACHE物理结构和逻辑行为。
15
孙世盛:Linux下嵌入式web服务的研究与实现
③网络芯片
目前SkyEye模拟了网络芯片8019AS,其特点是:NE2000兼容,内建 16KRAM缓冲区,10MB传输速率。虽然目前模拟的开发板上不一定有网络芯片8019AS,但我们可以在我们模拟的开发板上加上网络芯片8019AS的模拟。这样再加上在不同操作系统上的8019AS驱动程序,就可以方便地完成各种网络应用的开发和设计。目前已经在在基于Atmel91X40 CPU的开发板上实现了网络芯片8019AS扩展,并增加了uc/OS-II和uclinux的网络驱动程序,已经支持大量的网络应用程序,如LwIP (一个TCP/IP协议栈实现)、nfs server/clinet、http server/client、telnet server/client、ftp server/client等。
先到http://gro.clinux.org/projects/skyeye/下载直接编译好的Skyeye,选择版本为 skyeye-0.4.7-redhat9.0.bin,因为此版本为在redhat9下编译好的代码。把下载的skyeye-0.4.7-redhat9.0.bin 移动到/usr/local/bin目录下,并改名为skyeye,改变skyeye的属性,运行以下命令:
@mv skyeye-0.4.7-redhat9.0.bin /usr/local/bin/skyeye @chmod 755 /usr/local/bin/skyeye
在编译安装过程中,须注意以下几点:如果你使用的是Mandrake Linux,那么有可能你在编译SkyEye时会出现有关readline, ncurse, termcap等库的一些错误,那么你需要运行下面的命令: ln -s /usr/include/ncurses/termcap.h
/usr/local/include/termcap.h 然后再重新编译 。如果你使用的是Debian Linux, 不要用gcc 2.95 或 gcc 3.0, 要使用gcc 3.2或更高版本。在你系统中所使用的gcc 版本号应该要大于或等于2.96 ,如果SkyEye版本号大于0.6.0, 那么你需要在你的系统中安装GTK (LCD模拟要用到) 。
(2)安装arm-elf交叉编译环境并配置uclinux
交叉编译就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如 C代
16
山东交通学院毕业设计(论文)
码)编译(compile)成计算机可以识别和执行的二进制代码。比如,我们在 Windows 平台上,可使用 Visual C++ 开发环境,编写程序并编译成可执行程序。这种方式下,我们使用 PC 平台上的 Windows 工具开发针对 Windows 本身的可执行程序,这种编译过程称为 native compilation,中文可理解为本机编译。
然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的 ARM 平台,其一般的静态存储空间大概是 16 到 32 MB,而 CPU 的主频大概在 100MHz 到 500MHz 之间。这种情况下,在 ARM 平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilation tool chain)需要很大的存储空间,并需要很强的 CPU 运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在 CPU 能力很强、存储控件足够的主机平台上(比如 PC 上)编译出针对其他平台的可执行程序。要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。常见的交叉编译例子如下:
在 Windows PC 上,利用 ADS(ARM 开发环境),使用 armcc 编译器,则可编译出针对 ARM CPU 的可执行代码。
在 Linux PC 上,利用 arm-linux-gcc 编译器,可编译出针对 Linux ARM 平台的可执行代码。
在 Windows PC 上,利用 cygwin 环境,运行 arm-elf-gcc 编译器,可编译出针对 ARM CPU 的可执行代码。
我们这里用的就是在 Linux PC 上,利用 arm-linux-gcc 编译器,到www.uclinux.org处下载arm-elf-tools-20030314.sh,改变文件属性,并执行:
@chmod 755 arm-elf-tools-20030314.sh @./arm-elf-tools-20030314.sh (3)安装ucosii for skyeye
下载版本为ucosii4skyeye-v1.9.3.tgr.gz,并解压。 进入解压生成的目录下,编译ucosii for skyeye: @Make config @Make dep @Make
结束后,则生成五个sample的执行文件,分别位于ucosii4skyeye/samples/对应的应用名目录下。
(4)下载并运行uClinux-dist-20020927.tar.gz软件包
到www.uclinux.com站点下载uClinuc-dist-20020927,并解压。然后在
17
孙世盛:Linux下嵌入式web服务的研究与实现
/usr/local/uclinux-dist/目录下执行:
@make xconfig
在vendor/product中选择GDB/ARMulator,kernel版本选择2.4,save and exit。这时在/usr/local/uclinux-dist/linux-2.4.x目录下生成linux文件,证明安装成功。
在 uclinux-dist 目录下建立仿真AT91的skyeye配置文件 skyeye.conf,内容如下:
cpu: arm7tdmi mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000 mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000 mem_bank:
map=M,
type=R,
addr=0x01400000,
size=0x00400000,
file=images/romfs.img
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000 mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000 mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000 mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000 在/usr/local/uclinux-dist执行如下命令: skyeye linux-2.4.x/linux (skyeye)target sim (skyeye)load (skyeye)run
会出现如图4-2所示的运行结果
18
山东交通学院毕业设计(论文)
图4-2运行结果
Fig4-2Operation Results
4.3uclinux下的编译工具介绍
在为Linux开发应用程序时,绝大多数情况下使用的都是C语言,因此几乎每一位Linux程序员面临的首要问题都是如何灵活运用C编译器。目前Linux 下最常用的C语言编译器是gcc(gnu Compiler Collection),它是gnu项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。gcc不仅功能非常强大,结构也异常灵活。最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、 Fortran、Pascal、Modula-3和Ada等。开放、自由和灵活是Linux的魅力所在,而这一点在GCC上的体现就是程序员通过它能够更好地控制整个编译过程。在使用gcc编译程序时,编译过程可以被细分为四个阶段:
(1) 预处理(Pre-Processing) (2)编译(Compiling) (3)汇编(Assembling) (4)链接(Linking)
Linux程序员可以根据自己的需要让 gcc在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备。和其它常用的编译器一样,gcc也
19
孙世盛:Linux下嵌入式web服务的研究与实现
提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。gcc提供了30多条警告信息和三个警告级别,使用它们有助于增强程序的稳定性和可移植性。此外,gcc还对标准的C和C++语言进行了大量的扩展,提高程序的执行效率,有助于编译器进行代码优化,能够减轻编程的工作量。从程序员的角度看,只需简单地执行一条gcc命令就可以了,但从编译器的角度来看,却需要完成一系列非常繁杂的工作。首先,gcc需要调用预处理程序 cpp,由它负责展开在源文件中定义的宏,并向其中插入“#include”语句所包含的内容;接着,gcc会调用ccl和as将处理后的源代码编译成目标代码;最后,gcc会调用链接程序ld,把生成的目标代码链接成一个可执行程序。为了更好地理解gcc的工作过程,可以把上述编译过程分成几个步骤单独进行,并观察每步的运行结果。
第一步是进行预编译,使用-E参数可以让gcc在预处理结束后停止编译过程;下一步是将.i文件编译为目标代码,这可以通过使用-c参数来完成,gcc默认将.i文件看成是预处理后的C语言源代码,因此上述命令将自动跳过预处理步骤而开始执行编译过程,也可以使用-x参数让gcc从指定的步骤开始编译。最后一步是将生成的目标文件链接成可执行文件。
在Linux 下开发软件时,完全不使用第三方函数库的情况是比较少见的,通常来讲都需要借助一个或多个函数库的支持才能够完成相应的功能。从程序员的角度看,函数库实际上就是一些头文件(.h)和库文件(.so或者.a)的集合。虽然Linux下的大多数函数都默认将头文件放到/usr/include/目录下,而库文件则放到/usr/lib/目录下,但并不是所有的情况都是这样。正因如此,gcc在编译时必须有自己的办法来查找所需要的头文件和库文件。GCC采用搜索目录的办法来查找所需要的文件,-I选项可以向gcc的头文件搜索路径中添加新的目录。例如,如果在/home/xiaowp/include/目录下有编译时所需要的头文件,为了让GCC能够顺利地找到它们,就可以使用-I选项: # gcc foo.c -I /home/xiaowp/include -o foo同样,如果使用了不在标准位置的库文件,那么可以通过-L选项向gcc的库文件搜索路径中添加新的目录。例如,如果在/home/xiaowp/lib/目录下有链接时所需要的库文件libfoo.so,为了让gcc能够顺利地找到它,可以使用下面的命令:# gcc foo.c -L /home/xiaowp/lib -lfoo -o foo。
值得好好解释一下的是-l选项,它指示GCC去连接库文件libfoo.so。Linux下的库文件在命名时有一个约定,那就是应该以lib三个字母开头,由于所有的库文件都遵循了同样的规范,因此在用-l选项指定链接的库文件名时可以省去lib三个字母,也就是说gcc在对-lfoo进行处理时,会自动去链接名为libfoo.so的文件。Linux下的库文件分为两大类分别是动态链接库(通常以.so结尾)和静态链接库(通常以.a结尾),两者的差别仅在程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。默认情况下,GCC在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库,如果需要的话可以在编译时加上-static选项,强制使用静态链接库。例如,如果在/home/xiaowp/lib/目录下有链接时所需要的库文件
20
山东交通学院毕业设计(论文)
libfoo.so和libfoo.a,为了让 GCC在链接时只用到静态链接库,可以使用下面的命令:# gcc foo.c -L /home/xiaowp/lib -static -lfoo -o foo。
在编译一个包含许多源文件的工程时,若只用一条GCC命令来完成编译是非常浪费时间的。假设项目中有100个源文件需要编译,并且每个源文件中都包含 10000行代码,如果像上面那样仅用一条GCC命令来完成编译工作,那么GCC需要将每个源文件都重新编译一遍,然后再全部连接起来。很显然,这样浪费的时间相当多,尤其是当用户只是修改了其中某一个文件的时候,完全没有必要将每个文件都重新编译一遍,因为很多已经生成的目标文件是不会改变的。要解决这个问题,关键是要灵活运用GCC,同时还要借助像Make这样的工具。
使用Make程序的目的是自动确定一个软件包都是哪些部分需要重新编译,并用特定的命令去编译他。准确的使用Make可以大大的减少编译程序所花费的时间,因为它可以消除不必要的重编译make在执行时,需要一个命名为makefile的文件。这个文件告诉make以何种方式编译源代码和链接程序。makefile规则如下:
target:
Prerequisites command
target是要生成的目标文件(可以是.o文件或可执行文件)。prerequisites是target要生成的依赖文件。comman是要执行的命令。
Linux各级内核源代码的子目录下都有Makefile,大多数Makefile要嵌入主目录下的Rule.make,Rule.make将识别各个Makefile中所定义的一些变量。变量obj-y表示需要编绎到内核中的目标文件名集合,定义O_TARGET表示将obj-y连接为一个O_TARGET名称的目标文件,定义L_TARGET表示将obj-y合并为一个L_TARGET名称的库文件。同样obj-m表示需要编绎成模块的目标文件名集合,如果还需进行子目录make,则需要定义subdir-y和subdir-m。在Makefile中,自动为obj-y、obj-m、subdir-y、subdir-m添加文件名。有时,情况没有这么单纯,还需要使用条件语句个别对待。Makefile中还有其它一些变量,如mod-subdirs定义了subdir-m以外的所有模块子目录。
Rules.make是如何使make进入子目录的呢? 先来看subdir-y是如何处理的,在Rules.make中,先对subdir-y中的每一个文件名加上前缀"_subdir_"再进行排序生成subdir-list集合,再以它作为目标集,对其中每一个目标产生一个子make,同时将目标名的前缀去掉得到子目录名,作为子make的起始目录参数。subdir-m与subdir-y类似,但情况稍微复杂一些。
由于subdir-y中可能有模块定义,因此利用mod-subdirs变量将subdir-y中模块目录提取出来,再与subdir-m合成一个大的MOD_SUB_DIRS集合。subdir-m的目标所用的前缀是"_modsubdir_"。
一点说明,子目录中的Makefile与Rules.make都没有嵌入.config文件,它是通过主Makefile向下传递Makefile变量完成的。Makefile是make自已识别的一个变量,在执行新的Makefile之前,make会首先加载Makefile所指的文件。在主Makefile中
21
孙世盛:Linux下嵌入式web服务的研究与实现
它即指向.config。
4.4简单程序测试
写一个小程序world.c #include for(i = 0; i < 10; i++) { printf(\"i = %d \ printf(\"Hello world!\\n\"); } return 0; } 然后执行: @arm-elf-gcc -Wl,-elf2flt -o world world.c -elf2flt参数是将elf文件格式转为flat文件格式,这个工具是在你安装交叉编译器产生的。 @cd testsuits/at91/uclinux2 @mkdir romfs(建一个目录,后面用) @mount -o loop boot.rom /mnt/shy @cp -r /mnt/xxx/* romfs 另外,把编译好的可执行程序拷贝到/romfs/bin目录里,这里就是world.gdb、world在uClinux2目录下,执行: @genromfs -f boot.rom -d romfs 再执行下面的命令: skyeye linux (skyeye)target sim (skyeye)load (skyeye)run cd /bin world 生成如图4-3文件 22 山东交通学院毕业设计(论文) 图4-3生成文件 Fig4-3Generating documents 运行结果如图4-4所示: 图4-4运行结果 Fig4-4Operation Results 23 孙世盛:Linux下嵌入式web服务的研究与实现 5详细设计计算器程序的实现 5.1程序设计和功能实现 下面写出了部分程序代码,详细介绍各部分功能的实现。 服务器端计算程序: /*加法运算功能函数*/ int ns__add(struct soap *soap, double a, double b, double *result) { *result = a + b; return SOAP_OK; } /*实现加法运算*/ /*减法运算功能函数*/ int ns__sub(struct soap *soap, double a, double b, double *result) { *result = a - b; return SOAP_OK; } /*实现减法运算*/ /*乘法运算功能函数*/ int ns__mul(struct soap *soap, double a, double b, double *result) { *result = a * b; return SOAP_OK; } /*实现乘法运算*/ /*除法运算功能函数*/ int ns__div(struct soap *soap, double a, double b, double *result) { if (b) *result = a / b; else { char *s = (char*)soap_malloc(soap, 1024); sprintf(s, \" return soap_sender_fault(soap, \"Division by zero\ } return SOAP_OK; } /*实现除法运算*/ /*幂运算功能函数*/ int ns__pow(struct soap *soap, double a, double b, double *result) { *result = pow(a, b); 24 山东交通学院毕业设计(论文) if (soap_errno == EDOM) /* soap_errno is like errno, but compatible with Win32 */ { char *s = (char*)soap_malloc(soap, 1024); sprintf(s, \"Can't take the power of %f to %f\ sprintf(s, \" return soap_sender_fault(soap, \"Power function domain error\ } return SOAP_OK; } /*实现幂运算*/ 服务器连接: 重新打开一个窗口,进入到同样的目录 /SoapService/gsoap-linux-2.7/samples/calc (运行服务器需要一个会话) 执行 calcserver 5050,5050 表示服务器在本地的监听端口,客户端要访问服务器需要使用到该端口值.如果得到如下的提示表示服务启动成功 Socket connection successful: master socket = 3 进入/SoapService/gsoap-linux-2.7/samples/calc 目录. 执行 make 命令,然后就会产生calcclient,calcserver两个可执行程序 执行 calcclient add 100 200 ,过一会儿就得到 result = 300 表示客户端已经成功了。 连接图在程序测试中出现。 客户端程序的实现 如何使用gSOAP编译环境来编译SOAP客户端程序通常,一个SOAP客户端应用的实现需要为每个客户端需要调用的远程方法提供一个存根例程(stub routine)。存根例程主要负责编码参数信息;将包含参数信息的调用请求发送给制定的SOAP服务;等待返回结果;将结果中的参数信息编码。客户端程序调用访问远程方法的存根例程就像调用本地方法一样。用C/C++手工别写一个存根例程是个十分痛苦的差使,尤其当远程方法的参数中包含特定的数据结构(如:记录、数组、图等)时。幸运的是,gSOAP包中的'wsdl2h'WSDL解析器和'soapcpp2’存根及架构编译器能够将web服务客户端及服务端的开发工作自动化。'soapcpp2’存根及架构编译器是可以生成构建C++ SOAP客户端所需的C++源码的预编译器。该预编译器的输入参数是一个标准的C/C++头文件。这个头文件可以由WSDL解析器根据相关的WSDL文档自动生成。 下面是客户端部分程序(加注释) #include \"soapH.h\" // 包含生成的存根例程定义 #include \"calc.nsmap\" const char server[] = \"localhost:5050\";//连接的本地端口 int main(int argc, char **argv) 25 孙世盛:Linux下嵌入式web服务的研究与实现 { struct soap soap; // gSOAP运行环境 double a, b, result; if (argc < 4) { fprintf(stderr, \"Usage: [add|sub|mul|div|pow] num num\\n\"); exit(0); } soap_init(&soap);// 初始化运行环境(只执行一次) a = strtod(argv[2], NULL); b = strtod(argv[3], NULL); /*分别取add、sub、mul、div、pow的首字母进行运算判断*/ switch (*argv[1]) { case 'a': soap_call_ns__add(&soap, server, \"\ break; case 's': soap_call_ns__sub(&soap, server, \"\ break; case 'm': soap_call_ns__mul(&soap, server, \"\ break; case 'd': soap_call_ns__div(&soap, server, \"\ break; case 'p': soap_call_ns__pow(&soap, server, \"\ break; default: fprintf(stderr, \"Unknown command\\n\"); exit(0); }//运算判断 if (soap.error) { soap_print_fault(&soap, stderr); exit(1); } else printf(\"result = %g\\n\出错判断 26 山东交通学院毕业设计(论文) soap_destroy(&soap); //删除类实例(仅用于C++中) soap_end(&soap); //清楚运行环境变量 soap_done(&soap); //卸载运行环境变量 system(\"pause\"); return 0; } 嵌入式系统与web服务技术相结合,在ucLiunx上开发了一个嵌入式Web服务,实现了计算器功能,能够进行加、减、乘、除以及幂运算。 5.2 流程图 启动运算 显示结果 UCLINUX 登陆服务器 调用服务器函数 客户端发出请求 加 减 乘 除 5.3程序测试 在LINUX目录下运行./calcclient 5050后能进行数字运算。 服务器程序开启:表示连接成功 27 孙世盛:Linux下嵌入式web服务的研究与实现 图5-1服务器程序开启 Fig5-1 Open server 减法运算如图5-2所示: 图5-2减法运算 Fig5-2SUBTRACTION 除法运算如图5-3所示 28 山东交通学院毕业设计(论文) 图5-3除法运算 Fig5-3Operational division 加法运算如图5-4所示 图5-4加法运算 Fig5-4Multiplications 29 孙世盛:Linux下嵌入式web服务的研究与实现 乘法运算如图5-5所示 图5-5乘法运算 Fig5-5Multiplication 幂运算如图5-6所示 图5-6幂运算 Fig5-6Exponentiation 30 山东交通学院毕业设计(论文) 结 论 嵌入式的Service系统,具体来说就是使用嵌入式系统来实现WebService或者类似的架构。在具体实现中,主要应用方式为使用嵌入式系统来架构服务。在这种系统中,我们使用嵌入式系统来实现Service,使用系统来实现一些简单的单一的服务。由于水平有限,我们对Service的实现只能限于实现简单的数字运算,只能在嵌入式系统下进行简单的客户端和服务器端的交流。 31 孙世盛:Linux下嵌入式web服务的研究与实现 致 谢 通过2个多月的学习和设计,我学到了很多东西,最宝贵的是收获了同学之间的珍贵的友谊,充分体会到了团队合作的需要和快乐。在此首先要感谢不顾辛苦,即使课务繁忙也要对我们进行指导的黄卫东老师。还要感谢我们小组的刘德昭、曹学渊及姜盈盈同学,谢谢你们让我学到很多东西,让我充分体会到什么是团队合作。 32 山东交通学院毕业设计(论文) 参考文献 [1]许佑骏 ,王力生.嵌入式Service系统应用研究.2002 [2]刘峥嵘 ,张智超.嵌入式LINUX应用开发详解.北京:机械工业出版社,2004. [3]胡恩华.技术参考大全GCC.北京:清华大学出版社,2004. [4]韩存兵 ,龚波.构建嵌入式LINUX系统.北京:中国电力出版社,2004. [5]张斌 ,高波.LINUX网络编程.北京:清华大学出版社,2000. [6]刘建勋.论Web Services的服务集成设计与实现.2006. [7] 郑莹.探讨Web Service的关键技术及其实现.湖南铁道技术学院.2006. [8]D.Eastlake,J.Reagle,D.Solo.XML-Signature Syntax and Processing.2002. [9]R.V.Engelen.gSAOP web services toolkit.2000 33 孙世盛:Linux下嵌入式web服务的研究与实现 附录A部分程序原码 部分程序原码: ⑴头文件 //gsoap ns service name: calc //gsoap ns service style: rpc //gsoap ns service encoding: encoded //gsoap ns service namespace: http://websrv.cs.fsu.edu/~engelen/calc.wsdl //gsoap ns service location: http://websrv.cs.fsu.edu/~engelen/calcserver.cgi //gsoap ns schema namespace: urn:calc int ns__add(double a, double b, double *result); int ns__sub(double a, double b, double *result); int ns__mul(double a, double b, double *result); int ns__div(double a, double b, double *result); int ns__pow(double a, double b, double *result); ⑵服务器端 #include \"soapH.h\" #include \"calc.nsmap\" int main(int argc, char **argv) { /* master and slave sockets */ int m, s; struct soap soap; soap_init(&soap); if (argc < 2) /* serve as CGI application */ soap_serve(&soap); else { m = soap_bind(&soap, NULL, atoi(argv[1]), 100); if (m < 0) { soap_print_fault(&soap, stderr); exit(-1); } fprintf(stderr, \"Socket connection successful: master socket = %d\\n\ for ( ; ; ) 34 山东交通学院毕业设计(论文) { s = soap_accept(&soap); fprintf(stderr, \"Socket connection successful: slave socket = %d\\n\ if (s < 0) { soap_print_fault(&soap, stderr); exit(-1); } soap_serve(&soap); soap_end(&soap); } } return 0; } /*加法运算功能函数*/ int ns__add(struct soap *soap, double a, double b, double *result) { *result = a + b; return SOAP_OK; } /*减法运算功能函数*/ int ns__sub(struct soap *soap, double a, double b, double *result) { *result = a - b; return SOAP_OK; } /*乘法运算功能函数*/ int ns__mul(struct soap *soap, double a, double b, double *result) { *result = a * b; return SOAP_OK; } /*除法运算功能函数*/ int ns__div(struct soap *soap, double a, double b, double *result) { if (b) *result = a / b; else { char *s = (char*)soap_malloc(soap, 1024); sprintf(s, \" return soap_sender_fault(soap, \"Division by zero\ 35 孙世盛:Linux下嵌入式web服务的研究与实现 } return SOAP_OK; } /*幂运算功能函数*/ int ns__pow(struct soap *soap, double a, double b, double *result) { *result = pow(a, b); if (soap_errno == EDOM) /* soap_errno is like errno, but compatible with Win32 */ { char *s = (char*)soap_malloc(soap, 1024); sprintf(s, \"Can't take the power of %f to %f\ sprintf(s, \" return soap_sender_fault(soap, \"Power function domain error\ } return SOAP_OK; } ⑶客户端 #include \"soapH.h\" #include \"calc.nsmap\" const char server[] = \"localhost:5000\"; int main(int argc, char **argv) { struct soap soap; double a, b, result; if (argc < 4) { fprintf(stderr, \"Usage: [add|sub|mul|div|pow] num num\\n\"); exit(0); } soap_init(&soap); a = strtod(argv[2], NULL); b = strtod(argv[3], NULL); /*分别取add、sub、mul、div、pow的首字母进行运算判断*/ switch (*argv[1]) { case 'a': soap_call_ns__add(&soap, server, \"\ break; 36 of %f 山东交通学院毕业设计(论文) case 's': soap_call_ns__sub(&soap, server, \"\ break; case 'm': soap_call_ns__mul(&soap, server, \"\ break; case 'd': soap_call_ns__div(&soap, server, \"\ break; case 'p': soap_call_ns__pow(&soap, server, \"\ break; default: fprintf(stderr, \"Unknown command\\n\"); exit(0); } if (soap.error) { soap_print_fault(&soap, stderr); exit(1); } else printf(\"result = %g\\n\ soap_destroy(&soap); soap_end(&soap); soap_done(&soap); system(\"pause\"); return 0; } 37
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 99spj.com 版权所有 湘ICP备2022005869号-5
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务