基于linux开发及物联网的语音识别智能多媒体管理终端_第1页
基于linux开发及物联网的语音识别智能多媒体管理终端_第2页
基于linux开发及物联网的语音识别智能多媒体管理终端_第3页
基于linux开发及物联网的语音识别智能多媒体管理终端_第4页
基于linux开发及物联网的语音识别智能多媒体管理终端_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

北京理工大学珠海学院2020届本科生毕业设计基于linux开发及物联网的语音识别智能多媒体管理终端摘要随着社会的科学技术的发展,我们用到的媒体管理终端的作用越来越明显,它可以进行音视频的录取播放、可以演示文档和保存相关资料等的功能,我们在生活中随处会用到它,同时它也担负着越来越多的功能,这些媒体管理终端往往会被应用到公司企业、学校教室和民宅里,而在较早的媒体管理终端中需要我们进行较繁杂键盘信息输入才能调用其相关的功能,这样在一定程度上会降低企业的培训管理效率,或者说会降低学校的教室的演讲效率和家庭环境中的使用效率,会浪费比较的时间和人力,而本人的相关设计就是让以Linux和物联网为基础的媒体管理终端变得更加便捷化和智能化,通过向系统发出类似“播放音乐”“打开视频”等语音来让系统调用相关功能,使得在教室和企业中有更高的教学效率和工作效率。关键词:媒体管理终端;Linux;物联网;便捷化;智能化DevelopmentofvoicerecognitionintelligentmultimediamanagementterminalbasedonLinuxAbstractWiththedevelopmentofsocialscienceandtechnology,theroleofthemediamanagementterminalthatweuseismoreandmoreobvious.Itcanbeusedforaudioandvideorecording,demonstrationdocumentsandsavingrelatedmaterials.Wewilluseiteverywhereinourlife,anditalsotakesonmoreandmorefunctions.Thesemediamanagementterminalsareoftenappliedtocompanies,schoolsandteachersIntheroomandthehouse,butintheearliermediamanagementterminal,weneedtoinputmorecomplexkeyboardinformationtocallitsrelevantfunctions,whichwillreducethetrainingmanagementefficiencyoftheenterprisetoacertainextent,orreducetheefficiencyofspeechintheclassroomoftheschoolandtheuseefficiencyinthefamilyenvironment,andwastecomparativetimeandmanpower,andmyrelevantdesignistoThemediamanagementterminalbasedonLinuxandtheInternetofthingsbecomesmoreconvenientandintelligent.Bysendingvoicelike"playmusic","openvideo"tothesystem,thesystemcancallrelevantfunctions,whichmakestheteachingefficiencyandworkefficiencyhigherintheclassroomandenterprise.Keywords:Mediamanagementterminal;Internetofthings;Facilitation;Intellectualization;目录1前言11.1设计的目的、意义及应达到的技术要求11.2本设计在国内外的发展概况及存在的问题11.3本设计应解决的主要问题42.本设计42.1本设计涉及的相关技术支持42.2本设计涉及的相关原理92.2.1网络编程技术原理92.2.2嵌入式Linux系统构造102.2.3C语言编译器的工作原理112.2.4C语言编译器的工作流程122.3方案选择132.4分析设计中遇到的问题142.5设计过程153结论30参考文献31谢辞32附录33前言随着社会的科学技术的发展,我们用到的媒体管理终端的作用越来越明显,它可以进行音视频的录取播放、可以演示文档和保存相关资料等的功能,我们在生活中随处会用到它,同时它也担负着越来越多的功能,这些媒体管理终端往往会被应用到公司企业、学校教室和民宅里,而在较早的媒体管理终端中需要我们进行较繁杂键盘信息输入才能调用其相关的功能,这样在一定程度上会降低企业的培训管理效率,或者说会降低学校的教室的演讲效率和家庭环境中的使用效率,会浪费比较的时间和人力,而本人的相关设计就是让以Linux和物联网为基础的媒体管理终端变得更加便捷化和智能化,通过向系统发出类似“播放音乐”“打开视频”等语音来让系统调用相关功能,使得在教室和企业中有更高的教学效率和工作效率。1.1设计的目的、意义及应该达到的技术要求本设计的目的主要是体现该系统调用了Linux相关技术和物联网的原理作为语音识别的技术基础,同时能够在媒体管理终端接收到相关请求而执行相关指令,展示能够进行语音识别的媒体管理终端的便捷性和智能化。其意义在于在研究该系统的原理和设计同时能够掌握了解Linux相关技术和物联网的原理,并能够展现使用了语音识别的媒体管理终端的优越性。说到应该达到的技术要求,就是要以Linux系统和相关语言像C语言作为编程语言来编写整个程序,同时实现一个服务器和一个客户端,服务器是接收语音文件进行声音分析,而客户端就是多媒体管理终端进行接收服务器的信息进行相关的指令,这里用到的就是物联网的原理和技术,而在多媒体管理终端方面需要实现播放音乐、显示图片和打开关闭Led灯等功能。总体合并来说就是应该达到对多媒体管理终端进行语音录取后该系统能短时间内做出相关指令的技术要求。1.2本设计和相关技术在国内外的发展概况及存在的问题在我们国内的语音识别多媒体管理终端是已经达到较为先进的水平,虽然我们国家对于语音识别技术的研究较为晚,但是发展迅速,目前已经达到紧跟国际水平的标准,因为我们使用的是汉语其实在语音识别是更为困难同时也是更有成就感,例如我们国家的科大讯飞企业就是我们的代表,有能够进行多种语言语音识别功能和翻译的产品,在语音识别和移动通信方面都是达到国际水平的标准,也有较多的产品设备在市场上销售。在我们国内存在关于语音识别的问题就是计算机在人机交互上还存在一定的不足。需要注意的是我们还需要走相当长的一段路来取得突破性的进展。在国外也就是国际上其实在较早80年代开始美国方面就已经在语音识别方面进行深入研究,HMM模型和人工神经元网络的成功应用,使得他们在比我们较早的时候实现了语音识别的功能,伴随着多媒体管理加载语音识别功能的时代来临,Apple公司的Siri系统和微软的PhoneQuery引擎就是其目前顶尖水平的体现。Linux系统的发展历史Linux系统时期的前身是UNIX操作系统,而这个UNIX系统是完全用汇编语言进行编写的操作系统。在1983年理查德斯创立出GNU计划,为了创建一个完全自由的类UNIX操作系统,其开始进行大量的产生和收集各种系统所必备的组件,例如库、编译器、调试工具。在80年代时DOS操作系统是微机系统中的主宰。而此时以为芬兰赫尔辛基大学的学生LinusToevalds开始计划编写自已的操作系统,并开始找合作伙伴,并不懈的研发编写下于1991年的10月向外宣布了Linux内核系统的诞生,在往后的新版本诞生时都会选择这个时间发布。Linux在1998年达到了发展最快,与此同时这年的RedHat成立研发实验室进行对Linux系统的研究开发。IBM在1999年与小红帽公司建立合作关系,RedHat在2000年时间发布了嵌入式的开发环境,到现在Linux在商业化方面做得可以说非常好。Linux作为一套自由使用的软件,比Apple的MacOs在价格和自由度上有较大优势,用户可以无偿地得到Linux使用权,可以对大量的程序进行研究开发,在现在为止Linux是唯一的一个为用户提供多任务功能的操作系统。与此同时Linux系统可以做到兼容POSI2.0标准和多任务独立运行等的多种特点。现在Linux系统是可以被移植到很多的平台和嵌入式系统上的,像手机、工业机器系统和平板电脑等,我们生活中许多人热衷的Android系统,其实就是在Linux的内核基础上进行研发得到的。Linux社区是一个非常受编程人士欢迎的平台,里面时常会有网友推出一些Linux组件、GNU内核等的系统文件。图1.1Linux系统物联网的发展历史作为新一代的通信技术的不可或缺组成部分,物联网从本质来说就是以互联网为基础进行的提升。2005年11月国际电信联盟正式提出“物联网”的概念,这时候的物联网不再只是以RFID技术为基础,还可以通过因特网进行物品与物品的交换和通信,许多的通信技术如RFID技术射频识别技术、职能嵌入式技术会在物联网中得到更为广泛的使用。在此之后许多国家政府开始重视物联网的技术发展规划上,可见物联网在如今时代的重要性和普遍化。图1.2物联网在我国从物联网的概念产生开始就很重视物联网方面的发展,在1999年中科院就开始对物联网相关技术进行研究,在现在关于移动基站、微型终端机和无线通信技术等方面都是取得了比较明显的进展和突破,2009年我们在无锡市建立第一个物联网交流园区,国内的三大运营商也先后建立了物联网研究中心,在制定十二五规划时将物联网纳入新兴产业的发展规划中,各地高校也陆续开设物联网专业,许多民营公司企业成立物联网工作小组进行对物联网产业的研究。在政府、产业圈、主管部门的共同努力下,我国的物联网产业发展取得了显著成果,目前已经是世界上物联网领先水平的国家之一。目前我们国家的物联网和传统产业正在进行融合与相互渗透,生成新型产业和新的应用。作为我国的信息产业重要组成部分,正在不断进行更深层次应用的发展,对传统产业向智能化升级等方面起着重要的作用。 智慧社区是物联网应用中比较有代表性的,智慧社区利用包括云计算、大数据、物联网等方面的信息技术,来制造一个更为方便、智能、安全的生活环境,从而有效的提升居民的生活居住舒适度、安全度。1.3本设计应解决的主要问题关于本设计在分析设计过程中,需要创建一个服务器和一个客户端来实现该设计,而在服务器方面遇到的主要问题就是需要做到与客户端进行一个以TCP协议为技术基础的通信连接,并接收客户端发送过来的语音文件进行处理,再向客户端发送一个信息进行反馈,以上是服务器方面需要解决的主要问题。而在客户端方面的话,客户端是在一个Cortex-A53嵌入式开发板上实现声音的录取并向服务器发送语音文件并接收服务器发送过来的对语音进行识别后的反馈信息,并实现播放音乐、显示相关图片和打开关闭LED灯等功能,以上就是客户端方面需要解决的主要问题。总体来说就是需要解决TCP协议连接和发送接收问题、语音文件识别问题及多媒体的相关功能调用的问题。2.本设计 (1)该设计以GEC6818开发板作为平台,采用嵌入式ARM处理器,搭载Linux系统。 (2)首先采用网络编程相关技术,利用TCP/IP协议,创建一个服务器程序系统和客户端程序系统,并通过创建TCP套接字、绑定ip、端口号和id端口号的转换、服务器设置监听状态、客户端发起连接请求和服务器接收请求来达到成功连接的状态。 (3)采用科大讯飞企业的相关例程代码进行分析并修改,实现客户端对语音文件的录取发送和服务器对语音文件的接收和识别。 (4)采用C语言相关编程技术及嵌入式图形系统framebuffer编程相关技术,实现对GEC6818开发板的屏幕触摸的信息输入和触屏控制语音的录制,实现图片的调用显示和音乐的播放。 (5)利用开发板的硬件GPIO口的输入输出和使用软件结合来驱动一些外部模块,例如电机转动。 (6)对程序的代码进行编译方面采用的是以Linux系统作为编译平台,利用交叉编译的使用方法实现对程序代码的编译并烧录进GEC6818开发板中,最终完成整个设计。2.1本设计涉及的相关技术支持Linux系统的特点(1)让用户喜欢一个特点是可以同时开启多个独立的窗口进行编程开发,对应的每个窗口是有属于自已的权限,其他的窗口无法干涉。(2)Linux系统还可以做到同时进行对多个任务的处理,并给使用的用户一个非常优化的用户界面。(3)Linux操作系统还可以做到把外部的系统设备当成能够识别的文件处理,使用的用户可以对这些能够识别的文件进行多种操作。(4)同时Linux操作系统还提供大量的优化程度非常高的网络功能,还提供许多保护程度高的子系统和提供高级别的授权等操作。(5)Linux操作系统可以在多种类型的计算机环境下正常运行,这也体现了Linux系统高移植性的优势。(6)Linux系统的内核设计分成了进程管理、进程通信、虚构文件系统,Linux系统的模块内核是可以根据每个用户的要求,对内核插入或者移走模块,使每个用户根据自已的需求来设置不同模块来应用不同场景。(7)受到广泛的硬件支持:因为免费开源的原因,使得大量的程序员进行设计开发并分享代码,让Linux系统有丰富的设备资源。对主流的硬件支持性非常高,并能在目前市场上的处理器上运行。(8)Linux系统在运行期间会启动审视追踪和核心授权等的安全技术措施,并且系统还具备了稳固的防火墙,还提供了许多对当前网络状况进行管理和分析的实用软件。(9)完善的网络服务支持:在作为客户端方面,Linux有着丰富的客户端应用软件,其支持的网络服务包括FTP服务、网路信息服务、电子邮件服务等多种网络服务,目前的Linux系统支持大量的网络搭载硬件和文件操作系统。(10)任何人和组织只要遵守Linux系统中的GPL条约,就能使用其公开的系统代码,给使用用户提供了最大程度上的自由化,每个设计者都可以根据实际情况对源代码进行修改和优化。(11)对于Linux系统的开发关键就是需要有一套完整的研发工具,而Linux系统就能做到给目标程序提供一个较为完善的模仿拟定环境,这样开发者可以很清晰地看到目标程序在板子上的状态。Linux系统目前存在的不足 (1)没有固定的支持厂商:因为Linux系统上的所有套件几乎都是自由软件,所以大部分的自由软件都不是盈利性的团体,但我们在Linux上的软件使用过程中遇到问题,是只能自已去寻找解决方案的。 (2)游戏方面支持度不够高:现在的游戏各种类型丰富多样,但是在Linux系统上进行开发的几乎没有,在游戏方面的开发还需要提高。 (3)操作较为复杂:因为Linux系统主要用于对程序应用的开发,通过输入命令的形式管理与操作的,与Windows系统的图形界面相比操作难度显而易见的大,这样对新手或者对开发感兴趣的人一定程度的台阶,需要熟悉操作系统原理和Linux相关指令,当然只要花费一段时间去理解,上手还是可以的。物联网的特点 (1)是各种感知技术的广泛应用:物联网可以利用多种感应设备来感知得到测试物体的多种信息,大量的各种类型传感器存在于物联网中,其捕获的信息实质和信息格式都是不同的,其中传感器能够按照一定的同步时间采集需要的信息。 (2)互联网作为物联网的重心和根底,利用两种线路下的网络与互联网的交汇,从而把信息数据实时地发送到各个客户端中。同时为了保证发送数据的准确性,传感器在发送和接受数据过程中需要顺应多种的不同结构下的网络协议。 (3)物联网在供应传感器需要的链接条件同时,也具有对数据进行智能化处理。物联网能够通过大数据、云计算等的智能化处理,提升其中的应用层次,对传感器收集的大量数据进行处理,以此解决用户的要求,从而能够开发新的应用和模式。 图2.1物联网在当今社会上起着重要作用(4)具备较高的可靠性:因为物联网是以互联网和无线网络为基础的融合而成,所以物联网可以将物体的信息准确无误和实时地传送出去,从而有效和实时地进行信息的交流和分享。 (5)具备较高的效率:因为物联网的相互通信并处理大量任务,所以它能在最大限度地减少人力,同时因为减少了大量的人力,它在一定程度上节省了时间。目前物联网存在的问题 (1)安全性不足:物联网因为其系统互相连接,通过互联网为基础的通信,存在网络攻击造成信息泄露等问题,也就是安全性得不到保障,尽管一直以来系统都采取了相应的安全措施,但因为其系统不提供任何控制,所以总体来说目前物联网的安全性还得不到有效的保障。通信协议MQTT其中就存在缺乏加密的问题,XMPP没有服务质量规定。在目前市场价值不可估计的物联网市场,如果安全性不够高,那信息泄露、数据消极修改等问题的发生会造成市场的崩溃等不良情况的发生,其中的一些物联网恶意软件像Miral、PerckerBot、Rowdy等的软件对物联网的恶意攻击,对制造业、交通、能源、电力和医疗等领域都造成不良的影响。其中2017年的“水滴直播”事件让我们国家的物联网从业者反省物联网的数据归属问题,个人和群体的隐私信息得不到有效保护。 (2)物联网卡的设计销售依然不够完备:所谓的物联网卡是根据信息传输技术来进行信息的发送接收。目前我国的物联网卡的市场是非常大并具备较宽阔的潜力,现阶段进行了从软件技术、传感器方向等机器设备向硬件设备方面运用的升级。物联网卡的应用流程主要是改装集成ic控制模块等方面。然而,目前我国对应的物理学网口因为市场营销问题存在使用寿命较短的问题,其次物联网卡的资费套餐不够透明,存在一定程度潜规则和标准不够完善,这些都是目前我国的物联网卡存在的问题,但是我相信随着物联网的技术飞速发展,物联网卡会朝着创新方向发展,同时营销市场根据一定的政府政策来管制,能够逐渐改善下来。我国在物联网技术层面的发展现状 (1)在感知层方面,摄像头、RFID识别器等都是感知层目前比较突出的产品应用,在我们国内的自行开放传感器的研发水准与欧美国家相比还处于比较劣势的地位,大部分的高端传感器以进口的为主。 (2)在传输层方面,其主要的传输载体是移动通信网络,在传输层发展方面我们比较完善,如今传输层的水准要求变得越来越高,因此相关的传输层技术产业竞争也是比较强。 (3)在物联网应用层方面,我国的相关企业主要是以对硬件进行应用层开发为主,同时外国企业的应用层技术较为高,由于我们国家的应用层技术与外国企业的多年交接,传统的IT行业也正在进入物联网业务,物联网应用开发的相关企业也在明显增加。总体来说我国的物联网相关技术的覆盖范围非常广泛,其中的发展空间是非常有潜力的。我国的物联网技术的发展趋势 我们国家在物联网方面的技术就目前来说是较为发达的,其中物联网的应用是主要技术体现和成果。我们国家的物联网技术水平体系正在越来越发达,同时在近年会产生一些综合性的产品应用。未来的市场上将是由设备提供商、运营商服务商合作推出一个个服务完善、类型众多的应用。国外物联网发展现状 国外方面美国是最先提出了物联网的概念,2008年IBM提出“智慧地球”方案后受到当时的美国政府的响应,提出要在电子网络、教育和医疗等领域加大投入力度来带动物联网技术的研究开发,美国国家情报委员会把物联网列为六种关键技术之一,同时像思科、英特尔、高通和微软等企业也开始强化物联网的核心技术研发。美国政府于2012年到2014年期间发布相关政策来大力推广大数据等物联网成果受用到各个部门当中。并且在近年美国还将服务业和物联网的特点结合起来,并通过Cisco、Amazon等知名企业来打造工业物联网与数据分析平台,推动工业方面的物联网标准制定。 2010年8月欧盟公布《欧盟物联网行动计划》,并推出在2011、2016和2022年的物联网的研发计划,在飞行方面、交通运输方面、医学研究方面等领域进行开发性的进展。欧盟还制定一系列的物联网相关的关联规则来加强政府对物联网的管理,建立有效的管理架构,并制订修改相关立法制度来解决数据泄露和个人隐私曝光等问题。2015年3月欧盟成立AIOTI(物联网创新联盟),以此来让各个国家的的物联网相关技术结合起来,创建一个物联网的一体化区域。现在欧盟在智能服务业、智能工业等领域有着深入的发展研究,同时也向安全模式、法律层面和隐私方面进行一定程度的研究。 日本在2004年提出了U-Japan战略,目标是实现全日本的计算机通信普遍化,日本后续开始研发出智能服务业、一体化家具等方面的应用。2015年日本的物流、智能财富、交通等八个领域的用户量达到318万以上,在交通。物流行业有超过100万KDDI用户。2015年10月日本成立物联网推进联盟,主要为了解决技术开发问题。2016年日本甲普公司开始利用物联网技术对相关工厂的设备故障、温度、压力等因素进行分析来应对问题,同时实现提升系统创造新商机,近年日本着手设计新的商业模式布局来建构新的物联网社会。 从1999年开始的Cyhber-Korea技术到2015年对串口数据发送接收等技术规划部署,韩国政府在4年内推出多项政策致力于在大数据开发和传感器开发等方面来提高韩国的经济发展。为了推动物联网普及到应用中,韩国于2016年推出Korea-U政策,旨在达成国内大范围覆盖宽带网络。同时在食品、药品、军火管理和通道设施管理等方面进行试点实验,旨在推动USN在实际生活中的使用和商业化。在首尔市政府、春川市江源道和济州岛建设通信基站进行相关研发,实现物联网相关技术、物联网服务范围化等领域的研究开发。韩国通信相关部门在2013年发布产业培育战略,主要内容是在服装、交通、家具电器、食品等区域提高串口数据发送接收的使用率,提供给服务人群手机定位查询、购物结算、观看视频等服务。2011年韩国提出到2016年的6年内在大数据等相关区域投入7000亿韩元来培养出相关技术人员。2.2本设计涉及的相关原理2.2.1网络编程技术原理 关于网络编程技术方面在我的设计中用的其实较为少,所以在这方面并没有太过深入的研究。网络编程对应的OSI模型是有一共七层,第一层是物理层,主要是提供由底层网络定义协议建立、维护和断开物理连接,在这层会进行比特率方面的通道传输;第二层是数据链路层,其主要作用是对相关硬件的链路层地址寻找、比特流转换等,但是存在对比特组进行拼接组成字节时会出现访问错误;第三层是网络层,这层可以控制内部子网的运作,这个控制过程调用了安全封装载荷、路由和外部网关等协议;第四层传输层也是较为重要的一层,我们在这层可以把上一层网络层的数据进行切割并发送给网络层,可以实现相互提供的数据有效到达对方端层,还能做到流控和差错校验;第五层的会话层可以给多台机器用户相互之间建立数据发送接收,其中调用了传输层安全、远程调用等协议;第六层表示层主要负责解析到达该层的数据的语法解析和联系,像加密翻译、相关格式的解压缩;第七层应用层是整个OSI的最高一层同时也是网络用户与交接用户的接口,像文件传输协议、超文本传输协议、TCP\IP协议等都受用于该层。图2.2OSI七层模型2.2.2嵌入式Linux系统构造 目前较新型的Linux系统可搭载多种平台,提供其源代码。嵌入式Linux是把微机当成基础,其中体系含有相应的应用中心,具备实时的特性,只需要更少量的精准代码,处理速率比之前的旧版本更为快速,可靠性更加高。在构造内核方面,Linux系统在目前PC机上拥有2G总空间,其内核特性包括了管理内在网络、管理内在设备、构建文件体系、管理内存和管理处理装置。在系统内存方面,嵌入式的系统内存往往因为实时系统的开发而需要被利用到许多任务进程中,所以内存分配起着非常重要的作用。Linux系统的内存布局包括只读区域、可读可写区域、堆区、栈区和内核虚拟内存,只读区域是有具体程序来确定,这个区域相当于可执行的文本段,例如常量字符串就是设定与只读区域,该区域的常量由程序运行结束由系统统一释放;堆区自定义产生的变量可以由设计该程序的人员自主进行任何位置的释放,不主动释放变量则会在程序运行结束后自动被回收;栈区的变量是完全由编译器自主进行分配内存空间和释放内存空间;程序员自行初始化的变量包括了局部变量和全局变量,他们是在一个区域内分配内存空间,假如没有程序员的主动对其释放空间,则会在程序运行结束后由系统释放局部变量或全局变量。图2.3静态区域和动态区域存在不同的内存分配方式在这里说到栈需要表达我对Linux系统下堆和栈的区别理解:在栈的空间里主要是产生由程序员自主设定的局部静态变量,而堆空间里面主要作用是存放由程序员使用类似malloc等指令进行设定的全局动态变量。栈空间是一个较为大的区域,而新产生的动态变量在栈空间里的具体分配的大小是由编译器自行处理,不需要我们程序员进行干涉处理,而在堆空间里面需要程序员自主设定其变量大小;堆用头端来存储堆的空间大小;从存取效率来分析,栈里的数据只要一条汇编指令来进行数据的读取,而堆中数据需要先读取到eax中,再利用eax读取其中的变量,比栈的存取效率要慢得多。在构造特性方面:包含最开放的内核最新型的Linux系统内置有细微、复杂的内核系统,并提供出内核代码给有需要的用户,有需要的用户可通过对内核代码的改造设计。Linux系统首先其内核设计下来是可以支持标准协议,并可以实现嵌入式,同时还支持对ests及eomf的文件识别。跨越大量障碍提供便利性最新Linux系统提供完备的工具链,可构建交叉环境,通过采纳仿真工具来跨越了之前早时期开发不能交叉编译的障碍,这样就给使用用户更好的便利性。在过去传统的开发程序里,必须要在ICE在线仿真下才能进行调试,而目前的Linux系统使用嵌入式处理器进行调试,这样即使去除了仿真装置,也可以进行完全正常的调试,并节省过去使用仿真设备需要的大量金钱。嵌入式设备体系提供最先进的工具链和增设编辑器,来进行更为方便的应用调试。支持多类硬件Linux系统可支持多种配件使用,包括多种处理器、RISC、X86范畴内的各类芯片等配件,各类的新型技术也被目前Linux系统支持使用,虽然没有搭载MMU存储单元,也可常规运行使用。图2.4Linux设备相关驱动构造2.2.3C语言编译器的工作原理 C语言编译器其中一个工作原理是语法分析,其主要作用就是将原始程序中的相应字符进行识别分析,判断得出其中需要分析的单词或句子,并将其转换成相应的内部编码形式,内部的编码格式一般是一种二进制下的编码形式,根据相应的单词法则将原始程序中的单词或句子识别出来,从而最终完成语法分析。一般的C语言编译器语法分析过程中,其代码符号的内部代码是以二元式存在的,其中涉及到二进制、代码之间的计算值、分隔符等多种编码的运算。在计算机运行过程中,C语言的编译器利用语法分析原理把所有的原始代码进行解析得到系统能够识别运行的编码格式,同时此时的编译器根据分析得到的内容进行逻辑分析,找到可能存在的不符合逻辑的地方并报告给计算机。语法分析在这个识别过程中会采用两种分析模式,分别为自顶向上和子弟向下的模式。在进行语法分析时往往会出现障碍问题,可以利用确定符号的传输过程来避免语法符号的错误识别。 C语言编译器的另一个工作原理是语义分析,语义分析的主要过程是在对源程序进行处理时会使用到“中间语言”,通过中间语言来解析源程序代码,得到最终的指令含义。当源程序代码难以解析其中的指令含义时,中间语言能够发挥作用利用其较为独特的解析原理进行处理,提高代码处理效率。 预防分析也是C语言编译器的一个主要工作原理流程,这种原理主要是对整个源程序进行分层,对每一层进行整体解析,当该层的解析能够成功,则能够得到完整的语法结构,在这样每一层的解析并得到完整的语法结构后就能进行拼接最终得到整个源程序代码的指令含义。 在C语言编译器的设计实现方面,由两个描述文件实现设计,这是两个由C语言书写的文件,asip.h文件也可以叫做库文件,主要是通过宏定义来产生相关的端口,而asip.c文件能够根据asip.h文件中的宏定义产生的端口实现对该库文件的函数的确定和定义,而在确定和定义过程中会采用多种途径进行寄存器的寻址,在对寄存器进行分组后,会确定枚举类型reg_class的枚举值。我们在对库文件进行自主设计时,需要注意文件的格式,根据汇编代码的格式进行编写,有些没有前缀符号的标号需要我们加上前缀符号#,还可以利用“\\”等符号作为前缀给一些指令进行解释,这样在后面的修改中能够更为方便迅速地解决问题。 2.2.4C语言编译器的工作流程 词法分析是作为C语言编译器编译的第一个阶段,过程就是首先对其整个源程序代码解析识别得到系统内部二进制格式的编码,并对子程序进行词法分析,每次产生新单词时就能调用相关子程序,在此之后就会产生特别的单词,编译器根据其内部编码格式识别该单词,同时根据上述提到的C语言编译器会此时进行逻辑分析,把判断出不符合逻辑的相关字符报告给系统,系统通过相关程序显示在系统中告诉程序员。 语义分析是C语言编译器编译的第二个阶段,在通过第一个阶段的词义分析过后,会产生一个相应的内部编码,而词义分析的主要目的是将内部编码转换成中间代码,这种中间代码在编译器的编译识别中被较为明确和简单地解析出来,C语言下的源程序往往会较为复杂,在编译运行起来会较为缓慢,而在C语言编译器下词义分析后就能较为快速地完成指令解析。 语法分析作为C语言编译器编译的第三道阶段,通过词义分析阶段后能够产生一个独特的语法结构,通过语法规则对语法结构进行解析后,能够解析出相应的函数、变量和语句等。 最后一个阶段就是类型检查,C语言编译器在运行到这一步时,会根据当前语法分析得到的语法结构设定一个表达式和规则,这个规则可以说就是类型检查,编译器通过这个规则对整个源码进行扫描,找到存在错误变量或语句的地方,从而避免源程序的错误发生。 图2.5gcc编译过程简述2.3方案选择 作为对基于Linux和物联网的语音识别智能多媒体管理的设计,首先是要在Linux系统下进行编译生成程序,并使用C/C++语言技术进行编写程序,同时利用TCP/IP协议相关技术来进行创建网络,从而形成一个客户端和一个服务器,这时需要考虑哪一方是作为服务器,是进行语音识别的一方作为服务器,还是反馈的一方作为客户端,分析到反馈的一方需要先发送语音文件再接收反馈信息,所以应该把反馈一方作为客户端,而进行语音识别作为服务器较为合理。作为设计对象是智能多媒体终端,所以需要设计体现多媒体终端功能的效果,常见的多媒体终端能够切换图像、播放音乐、打开关闭LED灯等,所以在本次设计中我选择加入切换显示图像、播放音乐、打开关闭LED灯和控制电机转动的功能来突出智能多媒体终端的对象,在GEC6818开发板作为客户端时,考虑设计一个账号密码登录会更加严谨,所以选择在客户端方设计一个账号密码框架来通过触屏输入信息进行注册登录。最终整个方案确定下来,GEC6818开发板作为客户端首先通过对开发板触屏来进行信息输入,来注册信息和登录,登录进去来到主界面,有一个区域显示触屏此位置来开始录音,这时触屏该位置后开始对开发板大声说出指令,开发板对声音录取后生成相关文件,并发送给服务器方,服务器存在对文件进行分析的相关逻辑,分析得到程序类型的反馈后,再发送给客户端,客户端对此作出相关多媒体方面的功能像图片切换、播放音乐等。 图2.6最终程序设计成型的功能展示2.4分析设计中遇到的问题 在该设计时,首先需要考虑到利用TCP协议来进行连接发送接收信息,所以在客户端和服务器方都需要创建TCP套接字、绑定端口号和地址池等。因为要设计一个客户端注册登录界面,所以需要利用GEC6818的触屏文件驱动来调用对屏幕触碰的感应,这时候触碰屏幕,GEC6818只会找到触碰位置的坐标,并不能直接确定触碰位置代表什么信息的输入,所以进行分析思考后,可以通过对同一个触碰位置进行多次触碰来确定该触碰位置的坐标范围。因为没有对录取声音和发送文件相关技术基础知识,所以还需要通过网上等渠道来学会相关知识。在服务器方面需要设计对声音文件的接收并对声音文件进行识别分析,来得到相关具体指令要求,并返回指令给客户端,客户端在这里接收到指令后需要设计条件来筛选指令的具体要求,并显示出相关功能出来,因为设计了显示图像、播放关闭音乐、打开关闭LED灯等功能,所以还需要利用C/C++相关语言进行编写程序来生成这些具体功能出来。2.5设计过程 设计的过程首先是在电脑中使用Ubuntu来生成Linxu系统,并创建两个程序代码文件,其中一个作为客户端,另一个则为服务器,客户端和服务器都需要写入创建TCP套接字、端口号和地址池绑定、监听和连接,并给客户端和服务器创建同一网段的IP地址来进行连接,下面是相关设计代码:intsockfd=init_sock(argv[1]);//由命令行自行输入一个IP地址,并且在init_sock中包括了创建套接字、绑定地址和监听printf("waitingforresult...\n");//显示“等待结果” show_color_logo(sockfd);//调用显示图片的函数 while(1) { //1,调用arecord来录一段音频 printf("inputnumtostartRECin3s...\n"); scanf("%d",&num); //启动录音 system(REC_CMD); //2,将录制好的PCM音频发送给语音识别引擎 send_pcm(sockfd,PCM_FILE); //3,等待对方回送识别结果(字符串ID) xmlChar*id=wait4id(sockfd); if(id==NULL) continue; 客户端方面因为触屏不能直接得到输入信息,所以设计代码来通过条件限制,在该坐标位置范围内为对应的信息输入,最后能够触碰键盘图片的具体位置就能把相应字母信息显示到屏幕中,达到输入信息的效果,同时因为要对账号密码进行注册登录,所以利用文件IO相关技术,创建TXT文件并对文件进行写入,实现把新注册的信息写入到文本文件中,下一次输入信息后,不需要再进行注册,点击屏幕登录功能位置后,会调用出所有已注册的文件,利用数据结构的单链表相关技术,把所以的文件里面的信息提取出来并作为单链表的一个节点,通过遍历的功能来对输入的信息与文本信息进行匹配,如果匹配到则是找到相应的文件,则登录成功进入主界面;而遍历下来没有找到相匹配的文本后,就是账号或密码错误,需要重新输入信息。下面是相关代码:intlcd_x;//定义两个全局变量来显示坐标intlcd_y;structLcdDevice*lcd;//创建一个结构体指针//初始化LcdstructLcdDevice*new_init_lcd(constchar*device){//申请空间 structLcdDevice*lcd=malloc(sizeof(structLcdDevice)); if(lcd==NULL)//如果lcd指针指向内容为空 { returnNULL;//返回空 } //1打开设备 lcd->fd=open(device,O_RDWR); if(lcd->fd<0)//如果lcd结构体中的fd小于0 { perror("openlcdfail");//显示“打开lcd失败” free(lcd);//释放指针lcd returnNULL;//返回空 } //映射 lcd->mp=mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcd->fd,0); returnlcd;}intlcd_draw_bmp(char*bmppath)//定义一个函数{ intpic,lcd,ret;//定义一些需要使用的变量 inti,j; intx,y; charbmp_buf[800*480*3];//创建字符型数组来写入像素点 intlcd_buf[800*480];//创建整型数组 intshow_buf[800*480]; //打开图片 pic=open(bmppath,O_RDONLY);//打开开卡板中的相应触摸驱动文件 if(pic<0) { printf("openpicerror!\n");//显示“打开图片失败!” } //打开LCD屏幕 lcd=open("/dev/fb0",O_WRONLY); if(lcd<0)//如果返回值小于0 { printf("openlcderror!\n");//显示“打开lcd错误!” } lseek(pic,54,SEEK_SET);//因为开发板相关原因需要进行偏移54个字节 //读取bmp图片的数据 ret=read(pic,bmp_buf,800*480*3); if(ret!=800*480*3)//如果返回值的大小不等于800*480*3 { printf("readpicerror!\n");//显示“读取错误!” } //24位转32位 for(i=0,j=0;i<800*480;i++,j+=3)//设置for循环 { lcd_buf[i]=(bmp_buf[j]<<0)|(bmp_buf[j+1]<<8)|(bmp_buf[j+2]<<16); } //因为开发板相关原因需要对图片进行翻转 for(y=0;y<480;y++) { for(x=0;x<800;x++) { show_buf[800*(479-y)+x]=lcd_buf[800*y+x]; } } //写入数据到LCD屏幕 ret=write(lcd,show_buf,800*480*4);//把整形数组show_buf写入lcd中 if(ret!=800*480*4) { printf("writelcderror!\n");//如果返回值出错,则显示写入错误 } //关闭LCD与图片 close(lcd);//关闭相应的文件描述符 close(pic);//关闭相应的文件描述符 return0;}charzuobiao(intx,inty)//键盘返回值{ //如果手指触碰到开发板屏幕的相应坐标位置,则返回相应的字母,下面的同理if(x<=155&&x>=130&&y<=455&&y>=425) return'q'; if(x<=237&&x>=155&&y<=455&&y>=425) return'w';if(x<=298&&x>=237&&y<=455&&y>=425) return'e'; if(x<=374&&x>=298&&y<=455&&y>=425) return'r';if(x<=449&&x>=374&&y<=455&&y>=425) return't';if(x<=518&&x>=449&&y<=455&&y>=425) return'y'; if(x<=596&&x>=518&&y<=455&&y>=425) return'u'; if(x<=676&&x>=596&&y<=455&&y>=425) return'i'; if(x<=730&&x>=676&&y<=455&&y>=425) return'o'; if(x<=793&&x>=730&&y<=455&&y>=425) return'p'; if(x<=180&&x>=140&&y<=515&&y>=455) return'a'; if(x<=247&&x>=180&&y<=515&&y>=455) return's'; if(x<=322&&x>=247&&y<=515&&y>=455) return'd'; if(x<=395&&x>=322&&y<=515&&y>=455) return'f'; if(x<=462&&x>=395&&y<=515&&y>=455) return'g'; if(x<=536&&x>=462&&y<=515&&y>=455) return'h'; if(x<=608&&x>=536&&y<=515&&y>=455) return'j'; if(x<=685&&x>=608&&y<=515&&y>=455) return'k'; if(x<=755&&x>=685&&y<=515&&y>=455) return'l'; if(x<=208&&x>=189&&y<=593&&y>=558) return'z'; if(x<=276&&x>=208&&y<=593&&y>=558) return'x'; if(x<=358&&x>=276&&y<=593&&y>=558) return'c';if(x<=424&&x>=358&&y<=593&&y>=558) return'v';if(x<=490&&x>=424&&y<=593&&y>=558) return'b';if(x<=573&&x>=490&&y<=593&&y>=558) return'n'; if(x<=638&&x>573&&y<=593&&y>=558) return'm'; if(x<=129&&x>=104&&y<=400&&y>=377) return'1'; if(x<=192&&x>=129&&y<=400&&y>=377) return'2'; if(x<=272&&x>=192&&y<=400&&y>=377) return'3'; if(x<=339&&x>=272&&y<=400&&y>=377) return'4'; if(x<=414&&x>=339&&y<=400&&y>=377) return'5'; if(x<=481&&x>=414&&y<=400&&y>=377) return'6'; if(x<=556&&x>=481&&y<=400&&y>=377) return'7'; if(x<=613&&x>=556&&y<=400&&y>=377) return'8'; if(x<=701&&x>=613&&y<=400&&y>=377) return'9'; if(x<=769&&x>=701&&y<=400&&y>=377) return'0';}charziku(chark[20])//创建一个ziku函数来设置第一行字体{//调用相应的字库模板文件font*f=fontLoad("/usr/share/fonts/DroidSansFallback.ttf"); fontSetSize(f,45);//设置字体的大小bitmap*bm=createBitmap(400,50,4);fontPrint(f,bm,0,0,k,getColor(0,255,0,0),0);//设置使用字体的颜色show_font_to_lcd(lcd->mp,270,20,bm);//映射}charziku2(chark[20])//创建ziku2函数来设置第二行的字体{font*f=fontLoad("/usr/share/fonts/DroidSansFallback.ttf"); fontSetSize(f,45);/设置字体的大小bitmap*bm=createBitmap(400,50,4);fontPrint(f,bm,0,0,k,getColor(0,255,0,0),0);//设置使用字体的颜色show_font_to_lcd(lcd->mp,270,100,bm);//映射}intlcd_touch(intfd1)//创建lcd_touch函数来获得触摸屏幕后的坐标{structinput_eventbuf;//创建一个结构体intx1;//定义所需变量inty1;while(1){bzero(&buf,sizeof(buf));//清空buf数组read(fd1,&buf,sizeof(buf));//从fd1文件描述符中读取信息并写入buf数组中if(buf.type==EV_ABS&&buf.code==ABS_X) x1=buf.value;//把读取到的X坐标值赋值给x1变量 if(buf.type==EV_ABS&&buf.code==ABS_Y) y1=buf.value;//把读取到的Y坐标值赋值给y1变量if(buf.type==EV_KEY&&buf.code==BTN_TOUCH&&buf.value==0){ lcd_x=x1; lcd_y=y1;break;}}return0;}intfd1=open("/dev/input/event0",O_RDONLY);//打开触屏文件//如果返回值不为0,则打开失败,显示“打开失败”if(fd1<0)printf("openerror!\n");while(1){lcd_touch(fd1);//调用lcd_touch函数printf("X=%d,Y=%d\n",lcd_x,lcd_y);//显示出当前触屏后的坐标if(lcd_y<=593&&lcd_y>=377&&lcd_x<=940&&oo==0){aaa=zuobiao(lcd_x,lcd_y);//调用zuobiao函数ttt+=sprintf(ttt+fff,"%c",aaa);//利用叠加的原理ziku(fff);//调用ziku函数} if(lcd_x<=1030&&lcd_x>=940&&lcd_y<=530&&lcd_y>=430) {strcpy(ccc,fff);//把fff变量的字符内容赋给cccstrcpy(ddd,fff);//把fff变量的字符内容赋给dddoo=1;//让标志位oo为1printf("nextline\n");}if(lcd_y<=593&&lcd_y>=377&&lcd_x<=940&&oo==1){bbb=zuobiao(lcd_x,lcd_y);//调用zuobiao函数yyy+=sprintf(yyy+ggg,"%c",bbb);//利用叠加的原理ziku2(ggg);//调用ziku2函数}if(lcd_x>700&&lcd_x<800&&lcd_y>250&&lcd_y<300)//点击了注册按钮{strcat(fff,".txt");//利用拼接函数进行拼接DIR*dx=opendir("./000");//创建文件描述符chdir("./000");//进入文件夹000FILE*fp=fopen(fff,"w+");//打开文件并设置读取格式printf("success\n");//显示“成功”chdir("./..");//返回到上一层closedir(dx);//关闭文件描述符fclose(fp);//关闭文件夹描述符DIR*dy=opendir("./000");//创建文件描述符chdir("./000");//进入文件夹000FILE*pp=fopen(fff,"w");//打开文件并设置读strcat(ccc,",");//利用拼接函数进行拼接strcat(ccc,ggg);//利用拼接函数进行拼接intp=fwrite(ccc,sizeof(ccc),1,pp);//写入到文件ccc中printf("successregister!!!\n");//显示“注册成功”fclose(pp);//关闭文件描述符chdir("./..");closedir(dy);}if(lcd_x>90&&lcd_x<260&&lcd_y>230&&lcd_y<300)//点击了登录位置按钮 {DIR*dx=opendir("./000");//创建文件描述符chdir("./000");//进入文件夹000structdirent*ep=NULL;//创建一个结构体指针while(1){ep=readdir(dx);//读取文件夹内的所有文件if(ep==NULL)break;if(ep->d_name[0]=='.')//只对文件夹内的文件进行一遍循环continue;FILE*dy=fopen(ep->d_name,"r");//创建文件描述符指针fread(str,10,2,dy);//读取相应文件内的信息,存储到str数组中 tep=strtok(str,seps);//进行字符切割strcpy(str1,tep);//把tep指针所指向的字符赋给str1if(strcmp(str1,ddd)==0)//如果ddd的字符与str1的字符相同{tep=strtok(NULL,seps);//利用切割函数进行切割strcpy(str1,tep);//把tep指针所指向的字符赋给str1printf("%s\n",str1);//显示出str1的字符内容if(strcmp(str1,ggg)==0)//如果ggg的字符与str1的字符相同{printf("successlogin!!!\n");//显示“注册成功”chdir("./..");//返回上一级closedir(dx);//关闭文件描述符begin_voice(sockfd);//调用begin_voice函数}} }}}close(lcd);//关闭lcd文件描述符 close(fd1);//关闭fd1文件描述符 fclose(fp);//关闭fp文件描述符 return0;}登录成功后进入主界面,会显示一张触碰进行录音的图像,这时设计相关代码来对该位置坐标进行条件限制,只有触碰到该位置的坐标范围内,才会开始启动录取声音功能,录音的相关代码是以科大讯飞的例程为参考进行开发,主要原理是服务器在接收到声音文件后进行分析,得到具体指令后会发送一个返回值给客户端,在客户端这边设置处理返回值的相关代码,根据具体返回值来做出相应功能调用,显示图片根据设置数组并填入像素值,从而显示到开发板屏幕上,播放音乐根据“system”指令来打开音乐文件进行播放,LED灯的打开关闭,下面是相关代码:intvoice_record()//设置一个函数来显示主界面的图片{charbmp_buf[800*480*3];//设置字符型数组 charlcd_buf[800*480*4];//设置字符型型数组 charshow_buf[800*480*4];//设置字符型型数组 intret,lcd;//定义所需使用的变量 inti,j,x,y;FILE*fp=fopen("begin.bmp","r");//打开主界面的图片作为背景 if(fp==NULL)//如果fp变量为空 printf("fopenerror!\n");//显示“打开文件失败!” ret=fseek(fp,54,SEEK_SET);//设置54位的偏移(因为开发板原因显示图片需要设置偏移54位) if(ret!=0)//如果ret变量不为0 printf("fseekerror!\n");//显示“偏移失败!” ret=fread(bmp_buf,sizeof(bmp_buf),1,fp);//读取fp文件描述符内的信息 if(ret!=1)//如果ret变量不为1 printf("freaderror!\n");//显示“读取失败!” lcd=open("/dev/fb0",O_WRONLY);//打开开发板的显示的相关文件 if(lcd<0)//如果lcd变量小于0 printf("openerror!\n");//显示“打开错误!” for(i=0,j=0;i<800*480*4;i+=4,j+=3) { //把数组的每一位值赋给lcd_buf数组中的每一位 lcd_buf[i]=bmp_buf[j]; lcd_buf[i+1]=bmp_buf[j+1]; lcd_buf[i+2]=bmp_buf[j+2]; lcd_buf[i+3]=0; } for(y=0;y<480;y++)//设置for循环 { for(x=0;x<800*4;x++) { //把lcd_buf数组内的值赋给show_buf数组show_buf[(479-y)*800*4+x]=lcd_buf[y*800*4+x]; } }//把show_buf数组的值写入到lcd文件描述符内ret=write(lcd,show_buf,sizeof(show_buf)); if(ret!=sizeof(show_buf))//如果ret返回值不等于show_buf数组大小 printf("writeerror!\n");//显示“写入失败!”}intjay_photo(intfd1)//定义一个函数来显示周杰伦图片{charbmp_buf[800*480*3];//设置字符型数组bmp_buf charlcd_buf[800*480*4];//设置字符型数组lcd_buf charshow_buf[800*480*4];//设置字符型数组show_buf intret,lcd;//定义所需要的变量 inti,j,x,y;//打开jay_img图片并设置文件描述符指针FILE*fp=fopen("jay_img.bmp","r"); if(fp==NULL)//如果fp指针指向内容为空 printf("fopenerror!\n");//显示“打开文件失败!” ret=fseek(fp,54,SEEK_SET);//设置偏移 if(ret!=0)//如果ret变量不等于0 printf("fseekerror!\n");//显示“偏移失败!” //读取fp文件描述符内的信息并赋给bmp_buf数组ret=fread(bmp_buf,sizeof(bmp_buf),1,fp); if(ret!=1)//如果ret变量不等于1 printf("freaderror!\n");//显示读取失败 lcd=open("/dev/fb0",O_WRONLY);//打开开发板中显示的相应文件 if(lcd<0)//如果返回值lcd小于0 printf("openerror!\n");//显示“打开错误” for(i=0,j=0;i<800*480*4;i+=4,j+=3)//设置for循环 { //把bmp_buf数组的每一位赋值给lcd_buflcd_buf[i]=bmp_buf[j]; lcd_buf[i+1]=bmp_buf[j+1]; lcd_buf[i+2]=bmp_buf[j+2]; lcd_buf[i+3]=0; } for(y=0;y<480;y++)//设置for循环 { for(x=0;x<800*4;x++)//设置for循环 { //把lcd_buf数组的值赋给show_buf数组show_buf[(479-y)*800*4+x]=lcd_buf[y*800*4+x]; } }//把show_buf数组的值写入到lcd文件描述符内ret=write(lcd,show_buf,sizeof(show_buf)); if(ret!=sizeof(show_buf))//如果ret的值不等于show数组的大小 printf("writeerror!\n");//显示“写入错误!”printf("jayjayjay\n");system("madplay1.mp3&");//利用system函数播放“jay.MP3”文件while(1)//利用while循环{lcd_touch(fd1);//调用lcd_touch函数printf("X=%d,Y=%d\n",lcd_x,lcd_y);//显示出相应坐标if(lcd_x>=857&&lcd_x<=900&&lcd_y>=82&&lcd_y<=100){ break;}}return0;}intdzq_photo(intfd1)//定义一个函数来显示邓紫棋图片{charbmp_buf[800*480*3];//创建字符型数组bmp_buf charlcd_buf[800*480*4];//创建字符型数组lcd_buf charshow_buf[800*480*4];//创建字符型数组show_buf intret,lcd;//定义相关变量 inti,j,x,y;FILE*fp=fopen("dzq.bmp","r");//打开主界面的图片作为背景 if(fp==NULL)//如果fp指针指向内容为空 printf("fopenerror!\n");//显示“打开文件错误!” ret=fseek(fp,54,SEEK_SET);//进行54位偏移 If(ret!=0)//如果返回值

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论