




已阅读5页,还剩92页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章基于TinyOS的传感网应用开发,2,主要内容,6.1典型的无线传感网开发套件6.2nesC语言基础6.3TinyOS操作系统6.4TinyOS开发环境搭建6.5简单无线测试6.6简单数据分发6.7简单数据汇聚6.8TinyOS仿真平台TOSSIM6.9本章小结与进一步阅读的文献,3,6.1.1MICA系列节点,MICA系列节点是由美国加州大学伯克利分校研究,Crossbow公司生产的无线传感器节点,是目前无线传感器网络节点的典型代表之一。MICA系列节点包括WeC、Renee、MICA、MICA2、MICA2Dot、MICAz。WeC、Renee和MICA节点均采用TR1000射频芯片,MICA2和MICA2Dot采用CC1000射频芯片,MICAz节点采用CC2420的Zigbee芯片。,4,6.1.1MICA系列节点,图6-1MICA系列节点的组网示意图,5,6.1.1MICA系列节点,图6-3MICAz系列MPR2400的实物,图6-4(a)多传感器模块MTS300/31(b)MTS510的实物,图6-2MICA2系列MPR4x0(左上)和MICA2Dot系列MPR5x0(右下)的实物,6,6.1.1MICA系列节点,图6-5串行网关MIB510的实物,图6-6Stargate网关SPB400的实物,7,MICA系列节点均采用处理器外接射频芯片的硬件设计方案,与射频处理器IC(如TI公司CC2530)相比,MICA分立的硬件设计架构具有处理能力强、可扩展性好以及功能灵活等优点,不足为体积较大、可能会产生接口兼容等问题。,6.1.2MICA系列处理器/射频板,8,Atmega128L微处理器先进的RISC架构128KBFlash、4KBEEPROM、4KBSRAM53个可配置I/O引脚支持多种外部通信接口低功耗自带JTAG接口工作电压范围宽,6.1.2MICA系列处理器/射频板,9,MICA节点的无线通信射频芯片采用Chipcon公司的CCXXXX系列射频产品。该系列产品是专门为低功耗、低速率的无线传感器应用开发的。,6.1.2MICA系列处理器/射频板,10,CC2420射频板2.4GHzIEEE802.15.4标准16个可用信道数据速率250Kb/sO-QPSK调制方式超低电流消耗高接收灵敏度较强的抗邻频道干扰能力工作电压低输出功率可控硬件实现部分MAC层功能,6.1.2MICA系列处理器/射频板,11,MICA系列传感器板是较早实现商用的无线传感器节点部件,它的电路原理图设计是公开的。这里简要介绍部分主要的电路设计内容。传感器电源供电电路温湿度和照度检测电路磁性传感器电路,6.1.3MICA系列传感板,12,MICA系列节点在很大程度上是作为教学和研究试验使用的,人们通过在由多个MICA节点组成的实验床验证自己的算法和体验多跳自组网的特性。为了方便开发,Crossbow公司开发了一系列的编程调试工具,比较常见的是MIB510和MIB600接口板。,6.1.4MICA系列编程调试接口板,图6-8MIB510的连线和节点的装配,13,6.1.5国内外其他典型的无线传感网节点,图6-9SmartDust系列节点图6-10Tmote系列节点图6-11IntelMote系列节点,图6-12GAINS系列节点图6-13UbiCell系列节点图6-14NPUMOTE系列节点,14,6.1.5国内外其他典型的无线传感网节点,NPUMOTE系列传感器节点由西北工业大学计算机学院无线传感器网络实验室研发,目前已发展到第三个版本。该系列传感器节点采用了AVR8位单片机系列中较高端的Atmega128rfa1芯片作为处理器,该处理器采用先进的RISC架构,并且集成了符合IEEE802.15.4标准的射频收发器,性能与独立的射频芯片AT86RF230相当。该系列节点所设计的USB接口不仅可以与主机进行通信,还可以通过同一个USB接口进行程序的下载,大大方便了用户的使用。,15,6.2.1简介6.2.2术语6.2.3接口6.2.4组件6.2.5模块6.2.6配件,6.2nesC语言基础,16,nesC是对C语言的扩展,它是基于体现TinyOS的结构化模型和基于事件的执行模型而设计的。程序构造与程序组合相分离的机制组件的行为规范由一组接口来定义接口具有双向性组件通过接口彼此静态地相连,6.2.1nesC简介,17,6.2.1nesC简介,图6-15基于nesC语言的一般应用程序框架,18,6.2.1nesC简介,图6-16顶层配件、核心处理模块以及其它组件的关系,对于每一个具体的程序而言,通常由顶层配件(top-levelconfiguration)、核心处理模块和其他组件组成。,19,6.2.1nesC术语,图6-17配件中的概念,20,6.2.1nesC术语,图6-18模块中的概念,21,6.2.3nesC接口,nesC的接口实际上是一系列声明的有名函数集合,是连接不同组件的纽带。接口具有双向性,是提供者组件和使用者组件之间的多功能的交互通道。,接口提供者实现了接口的一组功能,称为命令;接口使用者同样需要实现一组功能函数,称为事件。,22,6.2.3nesC接口,事件回调机制能有效提高系统运行效率。,图6-19组件接口,23,6.2.3nesC接口,接口由interface类型定义,interface语法定义如下:,24,6.2.3nesC接口,接口示例带参数接口示例,带参数的接口在连接时注意类型匹配,25,6.2.4nesC组件,任何一个nesC应用程序都是由一个或多个组件连接起来的,从而形成一个完整的可执行程序。在nesC中有两种类型的组件模块(module)配件(configuration),26,6.2.4nesC组件,组件语法定义:,27,6.2.4nesC组件,组件规范语法定义:,28,6.2.4nesC组件,接口实例interfaceXasY参数化接口interfaceSendMsguint8_tid,29,6.2.4nesC组件,组件规范的示例:,30,6.2.4nesC组件,在组件K的规范中提供的命令(或事件)F称为K所提供的命令(或事件)F;同样地,组件K的规范中使用的命令(或事件)F称为K所使用的命令(或事件)F。组件K提供的接口实例X中的命令F称为K所提供的命令X.F;组件K使用的接口实例X中的命令F称为K所使用的命令X.F;组件K提供的接口实例X中的事件F称为K所使用的事件X.F;组件K使用的接口实例X中的事件F称为K所提供的事件X.F(注意由接口的双向性所引起的提供事件和使用事件的双向性)。,31,6.2.4nesC组件,通用组件关键字generic组件名后必须带有参数列表,32,6.2.4nesC模块,模块提供了接口代码的实现并且分配组件内部状态,是组件内部行为的具体实现。模块定义语法:,33,6.2.4nesC模块,命令是在接口中的一种函数,这种函数要求接口的提供者实现,而接口的使用者则会调用这种函数。形象的称为command,即为接口提供的可供调用的命令。语法结构类C语言,只是在最前面增加command关键字。,34,6.2.4nesC模块,命令的实现:,moduleM1providesinterfaceA1;implementationcommandintA1.cmd1(intarg),35,6.2.4nesC模块,命令的使用:,moduleM2usesinterfaceA1;implementationintret=callA1.cmd1(0 x11);,36,6.2.4nesC模块,事件是在接口中的一种函数,这种函数要求接口的提供者调用,而接口的使用者则会实现这种函数。形象的称为event,即为接口使用者所实现的事件处理函数。语法结构类C语言,只是在最前面增加event关键字。,37,6.2.4nesC模块,事件的实现:,moduleM1providesinterfaceA1;implementationpostA1.event1(0 x1,0 x2);/*发出对应的事件,实际上类同于调用事件处理函数*/,38,6.2.4nesC模块,事件的使用:,moduleM2usesinterfaceA1;implementationeventvoidA1.event1(intarg1,intarg2)接口使用者必须实现event的具体内容,如同事件处理函数一样。,39,6.2.4nesC模块,任务是TinyOS系统提供的一种特殊的机制,类同于线程。task一般为一个函数,无参数,无返回值。task可以在一般的TinyOS程序中发出,而task的执行是由TinyOS系统内核来实现的。并且task的执行是不影响调用者的,将会在发出task后的某一个时刻被调度运行,40,6.2.4nesC模块,task的特点:无参数、无返回值系统会按特定的顺序调度这些tasktask间不能抢占,但是可以被中断所抢占在task未执行时,发出多少个task,都将只运行一次这个task系统执行完一个task后才会去执行其它task,所以task一般要求短小,不至于影响其它task,41,6.2.4nesC模块,task的定义:一般也是放在module中moduleM1implementationtaskvoidtask1()voidf1()posttask1();,42,6.2.4nesC模块,通用模块typedef关键字的使用new关键字的使用,43,6.2.6nesC配件,配件用于实现不同组件的接口之间的连接的组件,它把多个组件连接在一起从而形成一个新的组件,而且它也可以导出接口(另一种形式的连接)。配件定义语法:,44,6.2.6nesC配件,配件的三个语法-=,45,6.2.6nesC配件,导通连接导通连接是一个配件将两个组件连接在一起,并且必须使用“=”操作符把使用者连接到提供者。注意区别“连接”与“导通连接”。扇入和扇出n-to-k关系参数化连接一个组件的多个不同实例,46,6.2.6nesC配件,通用配件可重用的用于构成高层次抽象的关系集使用方法与通用模块一样,47,6.3TinyOS操作系统,TinyOS是一个开源的嵌入式操作系统,它是由加州大学的伯利克分校开发出来的,主要应用于无线传感器网络方面。它是基于一种组件(ComponentBased)的架构方式,使得能够快速实现各种应用。因为与同样是他们设计的硬件平台珠联璧合而声名鹊起,目前已经成为无线传感器网络领域事实上的标准平台。支持的平台:eyesIFXv2、intelmote2、mica2、mica2dot、micaZ、telosb、tinynode。,48,6.3TinyOS操作系统,TinyOS技术特点组件化编程(Componented-Based):提供一系列可重用的组件,一个应用程序可以通过连接配置文件将各种组件连接起来,以完成它所需要的功能。事件驱动模式(Event-Driven):TinyOS的应用程序都是基于事件驱动模式的,采用事件触发去唤醒传感器工作。事件相当于不同组件之间传递状态信息的信号。当事件对应的硬件中断发生时,系统能够快速地调用相关的事件处理程序。,49,6.3TinyOS操作系统,TinyOS技术特点轻量级线程(lightweightthread):即任务。任务之间是平等的,不能相互抢占,按先入先出队列进行调度。轻线程是针对节点并发操作可能比较频繁,且线程比较短的问题提出的。两级调度方式(TasksAndEventsConcurrencyModel):任务一般用在对于时间要求不是很高的应用中;事件一般用在对于时间的要求很严格的应用中,且它可以占先优于任务和其他事件执行,在TinyOS中一般由硬件中断处理来驱动事件。,50,6.3TinyOS操作系统,TinyOS技术特点分阶段作业(Split-PhaseOperations):TinyOS没有提供任何阻塞操作,为了让一个耗时较长的操作尽快完成,一般来说都是将对这个操作的请求和这个操作的完成分开来实现,以便获得较高的执行效率。主动消息通信(ActiveMessage):每一个消息都维护一个应用层的处理程序。当节点收到消息后,就会把消息中的数据作为参数,传递给应用层的处理程序,由其完成消息数据的解析、计算处理或发送响应消息等工作。,51,6.4TinyOS开发环境搭建,TinyOS开发的软件环境:Linux操作系统环境各种Linux发行版或Cygwin均可TinyOS及nesC源代码目标板相关软件环境烧写工具其它必备软件工具、库,52,6.4TinyOS开发环境搭建,TinyOS开发的硬件环境:运行Linux操作系统的PC机或虚拟机目标板及烧写工具测试环境,53,6.4.1创建Ubuntu虚拟机,TinyOS的开发需要在Linux环境下进行。在Windows环境下可使用Cygwin来模拟Linux环境进行开发,但是安装配置较为繁琐,且性能较低。本书选用了基于VMware虚拟机和Ubuntu12.04Linux发行版的TinyOS软件开发环境。创建虚拟机的过程请参见课本6.4.1小节的介绍,或参考网络上的指南,此处不再赘述。,54,6.4.2安装Java编译运行环境,TinyOS的许多组件依赖Java环境,必须首先安装JDK1.6或更新版本。下载JDK1.6安装文件jdk-6u45-linux-i586.bin,放置于用户主目录“”下。从终端进入主目录,执行命令sudochmoda+xjdk-6u45-linux-i586.bin./jdk-6u45-linux-i586.bin,55,6.4.2安装Java编译运行环境,JDK自解压完成后在主目录下生成jdk1.6.0_45目录,其中包含JDK。添加JDK的环境变量,执行以下命令:exportJAVA_HOME=/jdk1.6.0_45exportPATH=$JAVA_HOME/bin:$PATHexportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar,56,6.4.2安装Java编译运行环境,将添加环境变量的命令放入用户主目录下的“.bashrc”隐藏文件中,可使其每次打开终端自动执行。使用以下命令测试JDK,若能输出版本信息,则证明JDK安装正确。javacversion,57,6.4.3安装其它必备工具,sudoapt-getinstallbuild-essentialbinutilsautomakeautoconf2.64gperfbisonflexgitpython-devemacsgraphviz,表6-1TinyOS开发必备工具,58,6.4.4下载并编译安装nesC编译器,从终端进入用户主目录,执行以下命令:mkdirtinyos#在主目录下创建tinyos目录cdtinyos#进入tinyos目录gitclonegit:/#进入nesc目录./Bootstrap#检测编译环境,生成configure./configure#生成Makefilemake#开始编译sudomakeinstall#安装nesC编译器,59,6.4.4下载并编译安装nesC编译器,验证nesC编译器安装成功,执行以下命令:nesccv若输出“nescc:version_number”,则说明安装成功。,60,6.4.5下载并编译安装TinyOS,从终端进入用户主目录,执行以下命令:cdtinyos#进入tinyos目录gitclonegit:/#进入tinyos源码目录cdtools#进入工具目录,编译安装TinyOS工具./Bootstrap#检测编译环境,生成configure./configure#生成Makefilemake#开始编译过程sudomakeinstall#安装TinyOS工具,61,6.4.5下载并编译安装TinyOS,添加TinyOS环境变量,将以下命令添加进主目录下的“.bashrc”文件,并重新打开终端。exportTOSROOT=/home/USER_NAME/tinyos/tinyos-mainexportTOSDIR=$TOSROOT/tosexportCLASSPATH=$CLASSPATH:$TOSROOT/support/sdk/javaexportMAKERULES=$TOSROOT/support/make/MakerulesexportPYTHONPATH=$PYTHONPATH:$TOSROOT/support/sdk/python,62,6.4.6下载并安装AVR工具链,AVR工具链包含AVR单片机的编译器与烧写器等。sudoapt-getinstallgcc-avrgdb-avrbinutils-avravr-libcavariceavrdude,表6-2AVR工具链,63,6.5简单无线传输,BlinkToRadio是TinyOS自带的一个例程,在Blink的基础上加入了网络通信。每个节点维护一个计数器,并在一个定时器的控制下递增。计数器每递增一次,就通过ActiveMessage将自身的ID号和计数值发送出去。每当节点接收到一个其他节点发来的数据包,就从其中把其他节点的计数值提取出来,并在LED上显示。所得到的运行效果就是节点A显示节点B的计数值,节点B显示节点A的计数值。,64,6.5.1BlinkToRadio的模块,BlinkToRadio使用了以下模块:MainC:TinyOS启动过程,触发应用初始化。LedC:提供板载LED的控制。BlinkToRadioC:包含BlinkToRadio的主逻辑。TimerMilliC:微秒级定时器。ActiveMessageC:平台级的ActiveMessage模块,管理网络传输。AMSenderC和AMReceiverC:ActiveMessage的收发接口。,65,6.5.1BlinkToRadio的模块,各模块间的连接在顶层配件BlinkToRadioAppC中。根据其中的连接信息,可得出模块关系图如下:,图6-20BlinkToRadio模块关系图,66,6.5.2BlinkToRadio的执行过程,TinyOS启动完成,触发Boot.booted()事件调用BlinkToRadioC的Boot.booted()事件处理函数调用AMControl.start()命令AM启动完成,触发AMControl.startDone()事件开启定时器,周期性触发定时周期到,触发Timer.fired()事件调用BlinkToRadioC的Timer.fired()事件处理函数计数器+1将当前计数器值和自身节点ID组包,通过AMSenderC的AMSend.send命令发送到广播地址AM层发送完成,触发AMSenderC的AMSend.sendDone()事件,67,6.5.2BlinkToRadio的执行过程,AM层从广播地址接收到指定类型的包,触发AMReceiverC的Receive.receive()事件调用BlinkToRadioC的Receive.receive()事件处理函数从接收到的数据包载荷中提取其他节点的计数值将计数值使用LedC显示到板载LED上,68,6.6简单数据分发,TinyOS自带了三种Trickle算法的实现,分别为Drip、DIP和DHV。它们的基本原理相同,但是实现上互有差异。在这一节中,我们将继续以Drip协议为例,学习数据分发的使用方法。,69,6.6.1数据分发依赖的组件,DisseminationC分发协议的最高层组件,实现分发协议。同时对应用提供一个StdControl接口,用以控制分发协议栈的工作。DisseminatorC通过key配对的一组实例共同代表一个在网络中需要同步的数据。应用通过操作它提供的DisseminationUpdate接口和DisseminationValue接口进行实际的分发操作。创建时需要提供两个参数:分发的数据类型和key。每个DisseminatorC实例只能接受来自与自己key相同的实例分发的数据。,70,6.6.1数据分发依赖的组件,DisseminatorC的接口DisseminatorC提供两个接口:DisseminationUpdate和DisseminationValue,71,6.6.2数据分发例程,例程的需求:整个网络包含一个数据源节点,N个接收节点。数据源节点运行一个定时器,定时更新一个计数器,并使用分发协议将最新的计数值分发出去。当其他节点接收到分发的值后,将值显示在自己的LED上。,72,6.6.2数据分发例程,为了实现需求规定的功能,需要用到以下模块:MainC:TinyOS自带SimpleDisseminationC:主逻辑模块,需要编写ActiveMessageC:TinyOS自带DisseminationC:TinyOS自带DisseminatiorC:TinyOS自带TimerMilliC:TinyOS自带LedsC:TinyOS自带,73,6.6.2数据分发例程,例程的模块关系图:,图6-21SimpleDissemination模块关系图,74,6.6.2数据分发例程,在TinyOS的apps目录下建立SimpleDissemination目录,并建立如下三个文件:SimpleDisseminationAppC.nc:顶层配件,包含要用到的组件声明及相互之间的连接关系SimpleDisseminationC.nc:主逻辑模块Makefile以上文件的内容详见课本,此处不再赘述。,75,6.6.2数据分发例程,SimpleDissemination例程的执行流程TinyOS启动完成,触发Boot.booted()事件调用SimpleDisseminationC的Boot.booted()事件处理函数将分发值初始化为0调用ActiveMessageC的SplitControl.start()命令ActiveMessage初始化完成,触发SplitControl.startDone事件调用SimpleDisseminationC的RadioControl.startDone()事件处理函数调用DisseminationC的StdControl.start()命令如果本节点是1号节点,则开启定时器,76,6.6.2数据分发例程,SimpleDissemination例程的执行流程当定时时间到时,触发Timer.fired()事件调用SimpleDissemination的Timer.fired()时间处理函数更新计数器值调用DisseminationValue.change命令,将新值分发出去当收到更新值时,触发DisseminatorC的DisseminationValue.changed事件调用SimpleDissemination的TargetValue.changed()事件处理函数调用TargetValue.get命令,取得更新的值将新值显示到LED上,77,6.6.2数据分发例程,例程的运行现象:取三个以上的任意传感器节点烧写此例程,并分别指定1-N为其节点ID。将所有节点按任意顺序上电,当编号为1的节点上电后,所有已经上电的节点的LED灯就会同步按二进制计数闪烁,证明Drip协议运行正常。,78,6.7简单数据汇聚,传感器网络最基本的功能就是采集各个监测点的监测数据并将其汇聚到根节点,以供处理分析。因此,汇聚协议可以说是一种非常重要的协议。CTP协议是一种常用的汇聚协议,并且已经由TinyOS内置。在这一节中我们将首先介绍TinyOS中CTP协议的使用方法及依赖的模块,再通过一个例子了解其简单的使用流程。,79,6.7.1数据汇聚依赖的组件,数据汇聚操作主要通过CollectionC模块进行CollectionC模块提供的接口StdControl:控制协议栈运行Senduint8_tclient:发送数据Receivecollection_id_tid:接收数据ReceiveasSnoopcollection_id_t:监听数据Interceptcollection_id_tid:被转发节点使用,判断是否继续转发该数据包RootControl:控制一个节点是否承担根节点角色Packet:提供了访问消息包数据域的命令CollectionPacket:提供了访问汇聚消息数据域的命令,包括源节点、类型、序列号,TinyOS规定不能直接使用CollectionC提供的Send接口,而必须通过一个代理模块CollectionSenderC进行。CollectionSenderC在实例化时必须提供一个collection_id作为参数,并对外提供一个Send接口供使用,80,6.7.2数据汇聚例程,例程的需求:编号为1的节点为根节点,其它每个节点都产生数据;消息格式由发送节点ID和数据组成;除根节点外每个节点间歇都产生随机数据,同时将数据低三位显示在自身LED上;根节点收到数据后,将其以某种形式显示出来。,81,6.7.2数据汇聚例程,在实际应用中,根节点在收到数据时往往将其通过串口等接口传到与其相连的PC机,由PC机对其进行后期处理。但是本例程为了关注汇聚协议本身,不涉及串口通信等方面。因此,根节点使用节点自带的三个LED灯进行显示。我们规定Led0和Led1显示数据的低两位,Led2显示节点ID的最低一位。,82,6.7.2数据汇聚例程,随机数的生成:RandomCTinyOS内置的伪随机数生成器Random接口:提供生成随机数的命令ParameterInit接口:提供初始化随机数种子的命令亦可通过ADC等生成真随机数,83,6.7.2数据汇聚例程,为了实现需求规定的功能,需要用到以下模块:MainC:TinyOS自带SimpleCollectionC:主逻辑模块,需要编写ActiveMessageC:TinyOS自带CollectionC:TinyOS自带CollectionSenderC:TinyOS自带RandomC:TinyOS自带TimerMilliC:TinyOS自带LedsC:TinyOS自带,84,6.7.2数据汇聚例程,在实际应用中,根节点在收到数据时往往将其通过串口等接口传到与其相连的PC机,由PC机对其进行后期处理。但是本例程为了关注汇聚协议本身,不涉及串口通信等方面。因此,根节点使用节点自带的三个LED灯进行显示。我们规定Led0和Led1显示数据的低两位,Led2显示节点ID的最低一位。,85,6.7.2数据汇聚例程,例程的模块关系图:,图6-22SimpleCollection模块关系图,86,6.7.2数据汇聚例程,在TinyOS的apps目录下建立SimpleCollection目录,并建立如下三个文件:SimpleCollectionAppC.nc:顶层配件,包含要用到的组件声明及相互之间的连接关系SimpleCollectionC.nc:主逻辑模块Makefile以上文件的内容详见课本,此处不再赘述。,87,6.7.2数据汇聚例程,SimpleCollection例程的执行流程:在SimpleCollectionC的Boot.booted()事件处理函数中调用RandomC的ParameterInit.init命令,以节点编号为种子初始化随机数调用ActiveMessageC的SplitControl.start()命令ActiveMessageC初始化完成,触发SplitControl.startDone()事件调用SimpleCollectionC的RadioControl.startDone()处理函数调用CollectionC的StdControl.start(),初始化分发协议栈如果节点ID为1,通过CollectionC的RootControl.setRoot()命令将自身设为根节点如果节点ID不为1,开启定时器当定时器触发时,调用SimpleCollectionC的Timer.fired()事件处理函数(非根节点)组建协议包,使用CollectionSenderC的Send.send命令发送出去,88,6.7.2数据汇聚例程,SimpleCollection例程的执行流程:当CollectionC收到数据,触发Receive.receive事件(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 药品采用周期管理制度
- 药库药品批次管理制度
- 药店培训档案管理制度
- 营业终端安全管理制度
- 设备修理量化管理制度
- 设备安装公司管理制度
- 设备搭建维护管理制度
- 设备清扫润滑管理制度
- 设备维修清场管理制度
- 设备设施维护管理制度
- 《事业单位人事管理条例》考试参考题库100题(含答案)
- 通用包装作业指导书SOP
- 浙江中考生物知识点大全
- 2023宿迁地生中考试卷
- 一人力资源转型和价值
- 国家公务员考试准考证模板
- 设备采购质量保证措施
- 《可见的学习与深度学习》读书笔记思维导图PPT模板下载
- GB/T 97.1-2002平垫圈A级
- GB/T 5121.27-2008铜及铜合金化学分析方法第27部分:电感耦合等离子体原子发射光谱法
- GB/T 4436-2012铝及铝合金管材外形尺寸及允许偏差
评论
0/150
提交评论