版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章物联网中间件物联网中间件基本概念5.1物联网中间件关键技术5.2物联网中间件编程实例5.35.1物联网中间件基本概念
5.1.1物联网中间件的定义和分类5.1.2物联网中间件的基本组成和特点
5.1.3物联网中间件举例5.1.1物联网中间件的定义和分类
1.中间件定义:独立的系统软件或服务程序。应用于客户机、服务器的操作系统,管理计算机资源和网络通信。连接两个独立应用程序或独立系统的软件,使相连接的系统即使具有不同的接口,利用中间件仍然能相互交换信息。执行的关键途径是信息传递。2.中间件示意图3.中间件发展史最早具有中间件技术思想及功能的软件是IBM的CICS,而CICS不是分布式环境的产物,因此人们一般把Tuxedo作为第一个严格意义上的中间件产品。
3.中间件发展史 Tuxedo是1984年在当时属于AT&T的贝尔实验室开发完成的,由于分布式处理当时并没有在商业应用上获得像今天一样的成功,Tuxedo在很长一段时期里只是实验室产品,后来被Novell收购,在经过Novell并不成功的商业推广之后,1995年被现在的BEA公司收购。3.中间件发展史 BEA公司1995年收购Tuxedo才成为一个真正的中间件厂商。IBM的中间件MQSeries也是20世纪90年代的产品,其他许多中间件产品也都是最近几年才成熟起来。TUXEDO名字的由来:TransactionforUNIXhasbeenExtendedforDistributedOperation,即被分布式操作扩展之后的UNIX事务系统。Tuxedo是一个客户机/服务器的“中间件”产品,它在客户机和服务器之间进行调节,以保证正确地处理事务。Tuxedo是一个事务处理(TP)监督器,它管理联机事务处理(OLTP)系统操作的事务。4.中间件主要特点满足大量应用的需要运行于多种硬件和OS平台支持分布计算,提供跨网络、硬件和OS平台的透明的应用或服务的交互支持标准的协议支持标准的接口5.什么是物联网中间件 在物联网中采用中间件技术,以实现多个系统和多种技术之间的资源共享,最终组成一个资源丰富、功能强大的服务系统。6.物联网中间件的分类 基于目的和实现机制的不同,业内将中间件分为以下几类:远程过程调用中间件(RemoteProcedureCall)面向消息的中间件(Message-OrientedMiddleware)对象请求代理中间件(ObjectRequestBrokers)
几类中间件可向上提供不同形式的通信服务,在这些基本的通信平台之上,可构筑各种框架,为应用程序提供不同领域内的服务,如事务处理监控器、分布数据访问、对象事务管理器等。7.物联网中间件发展的三个阶段应用程序中间件阶段(ApplicationMiddleware)
架构中间件阶段(InfrastructureMiddleware)
解决方案中间件阶段(SolutionMiddleware)。
目前,物联网中间件最主要的代表是RFID中间件,其他的还有嵌入式中间件、数字电视中间件、通用中间件、M2M物联网中间件等。下面,重点介绍一下RFID中间件。
RFID中间件扮演RFID标签和应用程序之间的中介角色,从应用程序端使用中间件所提供一组通用的应用程序接口(API),即能连到RFID读写器,读取RFID标签数据。 这样一来,即使存储RFID标签数据的数据库软件或后端应用程序增加或改由其他软件取代,或者读写RFID读写器种类增加等情况发生时,应用端不需修改也能处理,省去多对多连接的维护复杂性问题。8.RFID中间件的三大类发展阶段(1)应用程序中间件发展阶段(2)基础架构中间件发展阶段(3)解决方案中间件(SolutionMiddleware)发展阶段。
5.1.2物联网中间件的基本组成和特点
基本组成:实现全球物品的统一编码,给物品打上电子标签。要实现每个小的应用环境或系统的标准化以及它们之间的通信,必须设置一个通用的平台和接口,也就是中间件。以RFID为例,下图描述了中间件在系统中的位置和作用。物联网特点:(1)独立于架构。(2)数据流。(3)处理流。(4)标准化。(1)ASPIRE特征:轻量级、可重新编程、智能、适合当前标准、可升级、安全性高、完整。ASPIRE的解决办法是完全开源和免版权费用,这大大降低了总的开发成本。5.1.3物联网中间件举例
(2)Hydra定位于操作系统和应用之间的中间件层。中间件包含了众多软件组成部分,它们被设计用于处理各种任务,以完成一个有效利用成本的智能物联网应用开发过程。可以在新的和已经存在的分布式设备网络上协作。5.1.3物联网中间件举例
(2)Hydra它是基于语义模式驱动的架构。Hydra中间件利于实现环境感知行为和解决在资源受限设备中处理数据的持久性问题。Hydra安全框架部署了一个规则框架。虚拟化结构。5.1.3物联网中间件举例
5.2物联网中间件关键技术
5.2.1web服务5.2.2嵌入式中间件技术
5.2.3万维物联网5.2.4上下文感知技术Web服务(WebServices)就是一种可以通过Web描述、发布、定位和调用的模块化应用。Web服务可以执行多种功能,从简单的请求到复杂的业务过程。一旦Web服务被部署,其他的应用程序或是Web服务就能够发现并且调用这个部署的服务。5.2.1web服务
Web服务(WebServices)向外界提供一个能够通过Web进行调用的API(ApplicationProgrammingInterface,应用程序编程接口),能够用编程的方法通过Web来调用这个应用程序。我们把调用这个WebServices的应用程序叫做客户。WebServices举例:
创建一个WebServices,功能是返回当前的天气情况。WebServices定义:
建立可互操作的分布式应用程序的平台。WebServices平台是一套标准,它定义了应用程序如何在Web上实现互操作性。WebServices为实现物联网的应用与服务提供了一个基本的框架。 WebServices通过简单对象访问协议(SimpleObjectAccessProtocol,SOAP)来调用。
SOAP是一种轻量级的消息协议,它允许用任何语言编写的任何类型的对象在任何平台之上相互通信。
SOA(Service-OrientedArchitecture,面向服务的体系结构)是一个组件模型,它将应用程序的不同功能单元通过这些服务之间定义的接口和协议联系起来。 接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以用一种统一和通用的方式进行交互。这种具有中立的接口定义的特征称为服务之间的松耦合。松耦合系统的优势主要有两点:一点是它具有很高的灵活性另一点是当组成整个应用程序的每个服务的内部结构和实现逐渐地发生改变时,它能够继续存在 嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。5.2.2嵌入式中间技术服务
嵌入式中间件是在嵌入式应用程序和操作系统、硬件平台之间嵌入的一个中间层,通常定义成一组较为完整的、标准的应用程序接口。。1.嵌入式Web嵌入式Web服务主要具有以下优点。(1)统一的客户界面(2)平台独立性(3)高可扩展性(4)并行性与分布性1.嵌入式WebWeb服务器
对Web服务器而言,在物理设备上是指存放那些供客户访问的信息资源的计算机或嵌入式系统;在软件上是指能够按照客户的请求将信息资源传送给客户的应用程序。1.嵌入式WebWeb客户端 对Web客户端而言,在物理设备上是指客户所使用的本地计算机或者嵌入式设备;在软件上是指能够接受Web服务器上的信息资源并展现给客户的应用程序。 嵌入式Web服务器技术的核心是HTTP协议引擎。嵌入式Web服务器通过CGI接口和数据动态显示技术,可以在HTML文件或表格中插入运行代码,供RAM读取/写入数据。典型的嵌入式Web服务器系统模型 CGI是通用网关接口(CommonGatewayInterface)的缩写。它是Web服务器主机与外部扩展应用程序交互的一种标准接口。
它提供了将参数传递给程序并将结果返回给浏览器的一种机制。CGI工作流程示意图 CGI程序可以通过以下两种调用方式来获取客户请求的内容: 一是通过URL直接调用 二通过交互式表单(Form)来调用。1.JAVAVM 除了利用Web实现中间件外,JavaVM(Java虚拟机)以其良好的跨平台特性成为了物联网中间件的重要平台。Java编译执行流程图 每个Java
VM都有两种机制,一个是装载具有合适名称的类(类或是接口),叫做类装载子系统;另一个是负责执行包含在已装载的类或接口中的指令,叫做运行引擎。 每个Java
VM又包括方法区、Java堆、Java栈、程序计数器和本地方法栈这5个部分,这几个部分和类装载机制与运行引擎机制一起组成JavaVM的体系结构。JavaVM体系结构图 近几年来随着物联网的兴起,越来越多的研究正在考虑将Web技术与物联网技术相结合。 基于这样的思想就产生了万维物联网(WebofThings)的概念。5.2.3万维物联网
WebofThings具有以下特性:(1)使用HTTP作为应用协议,HTTP不仅是用来连接传感器和网络的传输协议。(2)通过REST接口(或RESTAPI)将智能设备的同步功能开放出来。(3)智能设备的异步功能开放采用广为接受的Web聚合标准。(4)前端利用Web的呈现方式,提供直观、友好的用户体验。(5)开放平台。 通过WebofThings,可以为物联网应用带来了众多便利,以下列举其几点优势:减少智能设备安装、整合、执行和维护开销;加快智能设备安装和移除速度;对智能设备可进行移动和临时安装;任何时刻、任何地点都可以提供实时信息服务;增强可视化、可预见、可预报和维护日程的能力;确保各类应用有效和高效率执行。WebofThings的基本框架由以下3部分组成:(1)网络节点集成接口(IntegrationInterfaceofNetworkNode)(2)基于REST风格终端节点(TerminalNodesBasedonRESTStyle)对智能设备可进行移动和临时安装;(3)网络Mashup功能(WebMashupFunction)增强可视化、可预见、可预报和维护日程的能力;基于REST风格的WebofThings架构 上下文感知技术是用来描述一种信息空间和物理空间相融合的重要支撑技术,它能够使用户可用的计算环境和软件资源动态地适应相关的历史状态信息,从而根据环境的变化自动地采取符合用户需要或者设定的行动。5.2.4上下文感知技术
上下文感知系统首先必须知道整个物理环境、计算环境、用户状态等方面的静态和动态信息,即上下文(context)。 上下文能力的获取依赖于上下文感知技术,主要包括上下文的采集、建模、推理及融合等。上下文感知技术是实现服务自发性和无缝移动性的关键。(1)上下文采集 上下文的应用领域不同,上下文的采集方法也有所不同。通常情况下,有3种方法:传感类上下文、派生出的上下文(根据信息记录和用户设定)、明确提供的上下文。 采集技术属于物联网感知层的技术。(2)上下文建模 要正确地利用上下文信息,必须对获得的上下文信息进行建模。上下文信息模型反映了设计者对上下文的理解,决定了使用什么方法把物理世界里面的一些无意义和无规律的数据转化成计算世界里的逻辑结构语言,为实现上下文的正确运行打下基础。(3)上下文推理 系统中的所有上下文信息构成上下文知识库,基于这些知识库,可以进行上下文的推理。 实现推理一般有两种方式,一是将逻辑规则用程序编码实现,二是采用基于规则的推理系统。(4)上下文融合 在上下文感知计算中,要获得连续的上下文的解决方法,必须联合相关的上下文服务从而聚集上下文信息,称为上下文融合。 这种上下文的融合类似于目前已被广泛应用的传感器融合,其关键在于处理不同上下文服务边界之间的无缝融合。5.3物联网中间件编程实例5.3.1利用RubyonRails开发基于 REST风格的中间件5.3.2用J2EE开发WebService中间件5.3.1利用RubyonRails开发基于REST风格的中间件RubyonRails,简称RoR或Rails,是一个使用Ruby语言写的开源网络应用框架,能使开发变得更加容易,目前我们用其致力于Web应用的开发、部署和维护。
像其他Web框架一样,Rails采用MVC的开发框架。但相比于其他框架,Rails更加简单易用。这是因为:1、Ruby语言的特性:自然、简介、快速,有丰富的类库,并且全面地支持面向对象的程序设计。2、Rails的基本设计原则:“不要重复你自己”(Don’tRepeatYourself,简称DRY)以及“惯例重于配置”。
Rails是一种敏捷的框架,它强调与客户的交互,随时准备“响应变化”。 Rails提倡测试驱动开发,所有的Rails应用内嵌对于测试的支持。1.
RubyonRails开发环境搭建RubyonRails可以运行在各种操作系统下,其平台是独立的。总的来说,要安装运行一个Rails应用需要下列组件。
(1)Ruby解释器:我们在此使用Ruby-1.8.6。这个版本的解析器可以很好的满足Rails以及后续一些RubyGems的要求。
(2)RubyGems:它是一个标准的Ruby程序包管理器,可以很方便的在线安装各种Ruby程序包,包括Rails等。
(3)RubyonRails框架:为简单起见,我们采用gem自动进行安装,在撰写本书时Rails的最新版本为2.3.8。(4)数据库:Rails的最新版本默认是采用SQLite3的数据库,在此为了通用性考虑,我们采用最常用的MySQL数据库。
(5)一些必要的库:采用MySQL数据库只需要安装mysqlgem包即可。如果使用Rails默认的数据库则需安装sqlite3-rubygem包。
下面我们主要介绍在Windows下安装部署Rails的具体过程。由于很多程序针对Windows平台都有很方便的一键式安装,所以在Windows下安装Rails还是很轻松的。
(1)安装Ruby解释器。可以从Ruby官网(/en/downloads/)上下载Ruby-1.8.6One-Click的安装包。
为了检验是否安装成功,可以从Windows的开始菜单点击“运行”,输入“cmd”,启动Windows命令提示符,然后输入“ruby–v”(回车),如能正确显示Ruby程序的版本号则证明安装成功。
(2)安装RubyGems。可以从RubyForge(/)或是RubyGems的官网(/)上下载最新的安装包。下载完成后将该压缩包进行解压,我们假设解压后根目录为${dir}目录;然后启动命令提示符,并切换到${dir}中,然后输入rubysetup.rb运行RubyGems的安装程序。为了验证是否安装成功,可以从Windows命令提示符中输入“gem–v”(回车);如能正确显示RubyGems的版本号则安装成功。(3)安装RubyonRails。在命令提示符中输入“geminstallrails”(回车),然后将会在线安装Rails的程序以及Rails的一些依赖包。安装完成后可以通过“rails–v”命令查看Rails的版本号来验证是否安装成功。(4)MySQL数据库。在MySQL官网上下载最新的MySQL-5.1版本的安装程序,然后进行安装即可。具体安装过程也可参考官方的安装说明(/doc/refman/5.1/
zh/installing.html)。(5)安装mysqlgem包。在命令提示符中输入“geminstallmysql”进行在线安装。
至此Rails的安装过程就已经全部完成。在Linux下的安装也大同小异,主要是安装Ruby和mysql时略有不同,其他安装步骤都和Windows下安装相同。2.RubyonRails编程实例下面的章节将简单介绍一个关于温度的Rails物联网中间件实例。Rails是一个网络应用框架,它可以很方便地处理各种应用请求,客户端和Rails服务器之间采用统一的REST接口,它们通过HTTP协议来向服务器端发送请求。
※本示例的系统整体架构图如图5-8所示。在该示例中温度传感器也认为是Rails服务器的一个客户端,它会实时地向服务器端发送数据,服务器会把这些数据处理后保存到数据库中以供浏览器或其他客户端调用。服务器的另一种客户端是浏览器或是手机Widget应用,这些客户可以向服务器端发送请求来获取自己所关心的数据。
※
本示例中采用REST的方式来进行服务器端的设计,我们将温度(temperature)看做一种资源,每个资源有相应的id、温度值、更新时间、设备名称等信息。本示例中对于温度资源的操作只包括Put和Get两种操作,这两种操作分别通过HTTP的Post和Get请求来完成。具体为温度传感器通过Post请求向服务器上传温度数据,而浏览器通过Get请求来从服务器获得温度数据的记录。
对于REST中的其他资源操作如Update、Destroy等操作在本示例中可以不需要,所以进行了省略。RubyonRails是支持所有的REST操作的,可以通过scaffold来进行实现。假定对于这种资源的Put操作对应HTTP的Post请求,请求的URL为{root_
dir}/temperature/post_temperature;获取资源的Get操作对应HTTP的Get请求,请求的URL为{root_dir}/temperature/index。
※
在此示例中采用mysql数据库,其实由于Rails对于不同数据库接口有很好的封装和适配,采用不同的数据库不会对代码产生太大影响。针对该示例,数据库中只建立一张表来进行数据的存储。表的结构如表5-1所示,其中id字段用于标识每条记录,value字段记录温度值,time字段记录上传的时间,device_id字段记录上传数据的设备标识。图5-8温度传感中间件系统架构示意图表5-1温度表结构idvaluetimedevice_id(1)建立工程。
建立一个名称为smart_sensor的工程,首先在命令提示符中进入待建工程的目录,在此使用F:\example目录,然后输入rails--database=mysqlsmart_sensor,如图5-9所示。图5-9建立smart_sensor工程本示例的实现步骤包括以下几步:
此时修改smart_sensor\config\database.yml文件,在这个文件中会有3个数据库配置选项,分别为development、test、production,在此只修改development选项即可,修改成如下格式。 development: adapter:mysql encoding:utf8 reconnect:false database:smart_sensor_development pool:5 username:root password:mysql host:localhost(2)建立数据库。
需要修改的主要是username和password,修改成mysql数据库的用户名和密码即可。然后在命令行根目录smart_sensor下执行rakedb:create来建立数据库,数据库名称默认为smart_sensor_development,如图5-10所示。下面的命令如没有特别说明均是在smart_sensor根目录下执行的。图5-10建立数据库
下面需要建立基本的数据表,在Rails中数据表是由一个Model来管理的,可以用Rails的命令来建立基本的Model。在根目录下输入rubyscript\generatemodeltemperature,如图5-11所示。图5-11建立基本的Model(3)建立基本的Model类。此时在db\migrate目录下会生成一个xxx_create_temperatures.rb的文件,打开该文件并修改成如下结果。这里主要是设置数据表的各个字段的类型以及其他细节。classCreateTemperatures<ActiveRecord::Migrationdefself.upcreate_table:temperaturesdo|t|
#establishthedatatablet.decimal:value,:precision=>4,:scale=>1t.datetime:timeeger:device_idt.timestampsendenddefself.downdrop_table:temperaturesendend
然后执行rakedb:migrate命令将temperatures表的结构写入数据库。
控制器的功能主要是对外部的请求进行处理并返回相应的结果。此处可以通过Rails的基本命令来建立基本的控制器。在根目录下输入命令rubyscript\generatecontrollertemperatureindex,如图5-12所示。图5-12生成基本的控制器(4)建立temperature控制器。
classTemperatureController<ApplicationController#listallthetemperaturesinthedatabasedefindex@temperatures=Temperature.allrespond_todo|format|format.html#index.html.erbformat.xml{render:xml=>@temperatures}endend
然后修改app\controllers\temperature_controller.rb文件以真正实现该示例需要的方法。在此我们将实现index方法以输出所有的temperature数据,并且增加一个添加数据的方法以把传感器发来的数据存入数据库,具体修改如下。
#processthepostrequestandstorethedatainthedatabasedefpost_temperaturebegin#constructaninstanceofTemperaturea_temperature=Temperature.new(:value=>params[:value],:time=>params[:time],:device_id=>params[:device_id])#storea_temperatureinthedatabasea_temperature.saverescue#returnFailiffailsstorethedatarender:text=>"Fail"returnend#returnOKifallsuccessrender:text=>"OK"returnendend这里增加了两个方法,index和post_temperature。其中index方法用于输出当前存入数据库的所有温度的记录,post_temperature方法是用来处理传感器发来的提交数据的请求,并把这些温度数据存入数据库,执行成功则返回“OK”,否则返回“Fail”。
在此因为index方法会返回一个html文件,来控制返回结果的显示。在Rails中会在views目录下对返回的页面文件进行集中的管理。在此需要修改app\views\
temperature\index.html.erb文件,修改结果如下。(5)修改view页面。<divid="temperature-list"><h1>Listingtemperatures</h1><table><%fortemperaturein@temperatures%><tr><td> <%=temperature.id%></td><td> <%=temperature.value%></td><td> <%=temperature.time%></td><td> <%=temperature.device_id%></td></tr><%end%></table></div>
为了让Rails当收到某个请求时知道该调用哪个控制器下的哪个方法来进行处理,在此需要修改Rails的路由以符合该示例的要求。在Rails中修改路由也十分简单,只需要修改config\routes.rb文件即可。在该文件的最后已经有两条默认的路由格式,需要修改这些路由规则以符合我们的需要,具体如下。
map.connect'temperature/post_temperature',:controller=>"temperature",
:action=>"post_temperature",:conditions=>{:method=>:post} map.connect':controller/:action' map.connect':controller/:action.:format’(6)修改路由。
①当收到发往temperature/post_temperature这个路径的Post请求时调用temperature控制器的post_temperature方法来进行处理。
②当收到:controller/:action格式的路由时,则将第一个参数作为controller,第二个作为action。例如发送temperature/index,此时则会采用temperature控制器的index方法来进行处理。这里解释一下这3条路由分别的含义。
③前面与(2)相同,另外增加了:format参数用来控制返回的格式,例如发送temperature/index.html则采用temperature控制器的index方法,采用html格式的返回结果。如果发送temperature/index.xml则以xml格式返回结果。路由的匹配规则是从上向下依次进行匹配,如果遇到匹配的规则,则采用该规则,并且停止向下匹配。
在此我们采用外部客户主动POST数据的方式来向Server发送请求。Rails中为了避免恶意的POST数据,采用了认证授权的机制来防止这种攻击,类似我们现在采用的POST的方式进行上传数据,则会引发RailsActionController::Invalid
AuthenticityToken异常,并且不会对我们的POST操作进行处理。我们在此需要禁用该认证机制,方法也很简单,只要修改app\controllers\application_controller.rb文件即可,修改结果如下。(7)修改控制器的认证过滤器。classApplicationController<ActionController::Basehelper:all#includeallhelpers,allthetimeprotect_from_forgery#SeeActionController::RequestForgeryProtectionfordetails
#allowuploadthedatadirectlyskip_before_filter:verify_authenticity_token
#Scrubsensitiveparametersfromyourlog#filter_parameter_logging:passwordend
接下来我们对本实例的功能进行测试,包括两部分:数据上传和数据显示。
①数据上传。
我们采用Curl来发送HTTP的POST请求。Curl工具是Lin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度版权保护与监管合同
- 2024年度网站建设与维护承包合同
- 2024年微计小程序城市代理经营合同3篇
- 2024年呼伦贝尔客运从业资格证理论考题
- 2024年度个人施工承包工程合同文本3篇
- 2024年度国际货物买卖合同(家电)3篇
- 2024年学校食堂厨师劳动合同3篇
- 2024年仓储物流搬运服务合同3篇
- 2024年建筑安装项目承包合同范本版B版
- 2024年教育行业新媒体推广与运营合作协议3篇
- JT-T-1180.8-2018交通运输企业安全生产标准化建设基本规范第8部分:水路旅客运输企业
- 考勤管理系统设计方案
- 2024年宁波城投集团第一期内部人才市场招聘重点基础提升难、易点模拟试题(共500题)附带答案详解
- 重症医学科感染监测规范
- 统计与数据分析基础-形成性考核一(项目1-项目2阶段性测试权重15%)-国开-参考资料
- 健身数据隐私保护与数据安全
- GB/T 17937-2024电工用铝包钢线
- 语言、文化与交际智慧树知到期末考试答案章节答案2024年湖南大学
- 威图电柜空调SK3304500使用说书
- 电梯维保服务维保服务质量保障措施
- 多图中华民族共同体概论课件第十一讲 中华一家与中华民族格局底定(清前中期)根据高等教育出版社教材制作
评论
0/150
提交评论