TinyOS操作系统开发技术及实践第6章TinyOS网络协议_第1页
TinyOS操作系统开发技术及实践第6章TinyOS网络协议_第2页
TinyOS操作系统开发技术及实践第6章TinyOS网络协议_第3页
TinyOS操作系统开发技术及实践第6章TinyOS网络协议_第4页
TinyOS操作系统开发技术及实践第6章TinyOS网络协议_第5页
已阅读5页,还剩150页未读 继续免费阅读

下载本文档

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

文档简介

1、AnT:一 ,第6章TinyOS网络协议第6章TinyOS网络协议6概述6.2分发路由协议6.3汇聚型路由协议第6章TinyOS网络协议6.4 CTP协议的实现小结第6章TinyOS网络协议第6章TinyOS网络协议6.1概述本章主要介绍这两种协议以及实现过程。BRCK路由协议一頁是无线传感器网络研究的一个重要力in嘴g I nivOS 2.x屮存两种展木的务跳路曲协议:分发路出协议 (I)isscmination Prolocol)和汇聚梨路山协议(Collection Protocol)! 分发协议能够可靠地传送小数据项到网络中的每-个节点;江= 聚型路山 > 议吋以把网第屮H个|

2、丫点的小故抑;j川M到扌斤定第6章TinyOS网络协议6.2分发路由协议ik; 出癒豳誣鈕幽国璨=踏那I!国霽婕輕适彌酒翹潮aiatg闌磁置鱷進a第6章TinyOS网络协议:的不冋濟 及具燃对于不同大小的数据项,分发协议的设计会有很丿 以下内容将讲解分发协议的一系列接口和组件,E 的实现过程。,©FMMMUMIMW步及至饨 f a gsBCSB >9 弱 M wA 匕 码如 jmmi 尿a第6章TinyOS网络协议inTrua第6章TinyOS网络协议【代码 6 -1 】 DisseminationValue.nc interface DisseminationValue<

3、;t>conmiand const t* get(); conmiand void set( const t* );a第6章TinyOS网络协议a第6章TinyOS网络协议a第6章TinyOS网络协议餡第6章TinyOS网络协议K1iffTruJl'l'.徐个的功能如下所述:DisseiiiiiiationValue.getO 命令获取const 类型的指针据区域。DisseminationValue.set()命令允许节点改变其当前的变量 值,并帮助节点给变量分配一个初始值。謫DisseminationValue.changedO触发节点改变变量值的事件。(2) Dis

4、seminationUpdate接 口。a第6章TinyOS网络协议DisseminationUpdate接口用于产生分发的数据,此函妆,I少命令仃-个#什尹'丿I'i'j V放,DisseminationUpdate接口的组件必须将数据赋值至U自己 内存中,Dissemination Value接口必须触发cliange()事件,以此 作为对change()调用的响应。其接口定义如代码6-2所示。a第6章TinyOS网络协议inTin【代码 62 】 DisseminationUpdate.nc interface DisseminationUpdate<t&g

5、t;conmiand void cliange(t* ONE newVal);a第6章TinyOS网络协议a第6章TinyOS网络协议II2. 分发协议的组件在分发协议中有较多的组件,本文将讲解比较重要 为DisseminatorC组件,该组件提供 了 DisseminationValuc 和DisseminationUpdate接口。该组件位于 utinyos-2.x /tos/lib/net/drip,其具体代码如代码6-3所示。【代码 6-3 】 DisseminatorC.nca第6章TinyOS网络协议a第6章TinyOS网络协议provides interface Dissemin

6、ationValue<t> provides interface DisseminationUpdate<t>generic configuration DisseiiiinatorC(typedef t, dip_key_t儘第6章TinyOS网络协议iffTniv、fW在DisseiniiiafojrC组件中提供了两个参数:参数f和参如:数抑Si构U!人小必须能够包倉单彳 message_t 包。参数key:即键值key,允许创建不同的DisseminatorC实仮底 组件,类似于AM标识号可以虚拟化AM服务。该键值一般由 麴(疋义相 f 程:ii儘第6章TinyO

7、S网络协议iffTni1.创建myDissemination文件夹参照6.3.2节创建MultihopOscilloscop e文件夹的步咄 myDisseminationC件夹。创建完成后如图61所示。创建E 第6章TinyOS网络协议iiiTiiifViiw a图 6-1 myDissemiiiatioii 文件夹15儘第6章TinyOS网络协议iffTni2.编写程序(1) myDisseminationApp.nc o在myDisseminationApp.nc文件中列出了实现分发协要的一系列组件以及组件与组件的关系,具体代码如描述6.D.1 myDisseminatioiiAppC.

8、ncT。【描述 6.D. 1 】 myDisseniinationAppC.iic#define MYID 8configuration myDisseminatioiiAppC implementation彳7components myDisseniinationC;components MainC; myDisseminationC.Boot > MainC;components ActiveMessageC; myDisseminationC.RadioControl -> ActiveMessageC; Hmponents DisseminationC;B.yDissemi

9、iiationC.DisseminationControl -> DisseminationC;第6章TinyOS网络协议inTrucomponents new DisseminatorC(uint 16_t, 0x2345) as Object 1 myDisseminationC.Value 16 -> Objectl6C;myDisseminationC.Update 16 -> Object 16C; components LedsC;myDisseminationC.Leds > LedsC;components new TimerMilliC(); myDi

10、sseminationC.Timer > TimerMilliC; components new AMSenderC(MYID);myDisseminationC. AMSend->AMSenderC; myDisseminationC.Packet->AMSenderC; myDisseminationC. AMPacket->AMSenderC;inTru(2) myDisseminationC.nc o/l:.myl)isseiniiiation < (TJ I、'丿、:现小刃朴川勺介後 1;丿丿、L先分发者获得需要分发的数据,然后将数据发送到网纟

11、收者接收到数据后,按照接收到的数据不同点亮不同的LED, 具体代码如描述6.D.1 myDisseminationC.nc所示。【描述 6.D. 1 myDisseminationC.nc#include <Timer.h>#include "BlinkToRadio.h"module myDisseminationCusesinterface AMSend;interface Receive;interface Packet;interface AMPacket;interface Boot;interface SplitControl as RadioCon

12、trol;inTininterface StdControl as DisseminationControl;interface DisseminationValue<uint 16_t> as Value interface DisseminationUpdate<uint 16_t> as Up( interface Leds;interface Timer<TMilli>第6章TinyOS网络协议第6章TinyOS网络协议implementationuintl6_t counter;牆 6mTinyOS 罔lskamadd匚 DES n 0x0003

13、-3 沽羽LEDmgErsk void showcoullico(iKcoulltcn&oxl) call Lcds.lcdoono; iKcoun<&0x2)call Lcds.lcdlolo; iKcounicn&0x4) call Ledslcd2on(); i 仝 Coungn&ox8) call Ledscd3oll();第6章TinyOS网络协议event void Boot.booted()开启无线电服务call RadioControl.stait();event void RadioControl.startDone( error_t r

14、esult)if(result != SUCCESS)call RadioControl.stait();开启分发服务call DisseminationControl.startO; counter = 0;开启定时器event void RadioControl.stopDone( error_t result)ent void Timer.fired()message_t pkt;call Timer.stai*tPeriodic( 2000 );inTrucounter = counter+1;设定分发值call Update 16.change(&coi】i】2r); btr

15、pkt=(BliiikToRadioMsg*)call Packet.getPayload( &pkt,sizeof(BlinkToRadioMsg);btipkt->nodeid = DES;btrpkt->num = counter;第6章TinyOS网络协议第6章TinyOS网络协议;call Leds.ledOToggle();/*发现分发值发生变化*/event void Value 16.changed() const uintl6_t* new Vai = call Valuel6.get(); counter = *newVal;如果数据发送成功,触发LED

16、1闪烁event void AMSend.sendDone(message_t* Pkt,error_t err)第6章TinyOS网络协议IIevent message_t* Receive.receive(message_t* msg, void* pa uint8_t len)if(len=sizeofBliiikToRadioMsg)获得接收信息的负载BlinkToRadioMsg* btrpkt = (BlinkToRadioMsg*)payload;取出发送的数值 counter = btrpkt->num;触发LED闪烁post ShowCounter();return m

17、sg;儘第6章TinyOS网络协议iffTni1; T1(3) BlinkToRadioMsg.h。在 BlinkToRadioMsg.h文件中定义了 myDisseiniiiatioT 文件中发送数据所使用的结构体。其具体代码如描述6.丁 B linkToRa dioMsg. h 所示。第6章TinyOS网络协议【描述 6.D. 1 BliiikToRadioMsg.h #ifiidef_BLINKTORADIO_H# define _BLINKTORADIO_H typedef iix_stmct BlinkToRadioMsg nx_uintl6_t nodeid; nx_uintl6_

18、t num;第6章TinyOS网络协议第6章TinyOS网络协议3编写Makefile文件在myDissemination文件夹下创建Makefile文件,并MMakefile文件中添加描述6.D.1 Makefile文件内容。【描述6.D. 1】Makefile文件COMPONENT=myDisseminatioiLAppCCFLAGS += -I$(TOSDIR)/lib/net -I%T/lib/net/drip include $(MAKERULES)14.分发协议可视化组件程序编译成功后,在Cygwin下输入“makecc2530 令生成可视化组件关系图,如图62所示。第6章Tiny

19、OS网络协议第6章TinyOS网络协议DiccenunationValue<umt 16 t>二 Timer TMil.嗨犷St-珍pVq轉疑'图6-2分发协议可视化组件餡第6章TinyOS网络协议蹲iffTruv5.实验现象将程序烧写至设备中(需要两个设备),可以观察有个现象:设备的LED1闪烁,说明数据发送成功。闊设备的LED1LED4逐个点亮,说明设备接收到不同的分餡第6章TinyOS网络协'议 iffTrn6.3汇聚型路由协议第6章TinyOS网络协议扌居发彳蠱13££F做3蛋朋冒|£爼!玄那51融痢跡謹啊|Sf|!|E罪縫腿E

20、HiiP癮据接收* I H第6章TinyOS网络协议irrrin图63汇聚型路由协议第6章TinyOS网络协议Mfe 节点。握第6章TinyOS网络协议戲覷豳is鲫豳脈“re趨縄蜩那血蠶irrrin(1) Send.nco6-4Send接口的主要功能是发送数据以及获得数据负载 此接口有4个命令函数,1个事件触发函数,其接口如代 所示。佩第6章TinyOS网络协议【代码6-4】Send.nc#include <TinyError.h>#include <message.h> interface Sendcommand error_t send(message_t* msg

21、, uint8_t len); command error_t cancel(message_t* msg);event void sendDone(message_t* msg, error_t error); command uint8_t maxPayloadLength();command void* getPayload(message_t* msg, uint8_t len);儘第6章TinyOS网络协议 iffTnit其中,各个函数功能描述如下:sendM数讥功能是发迖数据,它决定了发迖数大长度。caiicel()函数主要功能是取消当前要发送的数据力闊sendDone()函数为触

22、发发送事件函数,如果发送成功则返 回SUCCESS,失败则返回FAILo踊4/乂。痂 get評数据白liiaxPayloadLengthO函数主要功能是获得负载数据的最人ayload()函数主要功能是获得需要发送的数据以及发 勺长度。佩第6章TinyOS网络协议inTin(2) Receive.ncoReceive接口主要功能是接收生产者的数据,此接I 有一个函数,其具体代码如代码6-5所示。【代码 6-5 】Receive.ncinterface Receiveevent messagereceive(message_t* msg, void* payload, uint8_t len);i

23、nTru(3) Intercept.nco肖息,Intercept接口主要功能是共网络处理者接收并更新j 此接口只有一个事件函数,其具体代码如代码6-6所示。【代码 6-6 】Intercept.ncinterface InterceptIntercept.forward件的主要功能是当节点接收至U 发的消息包时,汇聚服务心触发这卜W如加刎屈磨谒 回值为FASLE,那么汇聚服务就不能转发这个包。此接口允许更高层的组件检查消息包的内部,女In息包多余,或者消息包可以汇聚到已有消息包内,此时可以龙 过此接口事件对消息进行相应处理。蠡1 Mgl?<i Ka s<Ib a B M J M

24、B Mu .fSialFj g>JuM|J»i MSI a M B m.Hb ;轡6一7所:II【代码 67 】RootControl.nc interface RootControlconmiand error_t setRoot(); conmiand error_t unsetRoot(); conmiand bool isRootQ;如果-个节点已经是根节点,并调用sefRoot命令,园虜騒 冋 SUCCESS o如果sefRoot命令返回SUCCESS,那么isRoot命令禎IB® 须返回TRUE。如果unsetRoot命令的调用返回SUCCESS,那么is

25、Root命令 必须返回FALSE o叫儘第6章TinyOS网络协议iffTni, t|2.汇聚服务组件汇聚服务主要通过CollecfioiiC组件、CollectionSeiK件和CollectionSenderP组件来进行汇聚服务的,具体介葛(1) CollectionC.nCo汇聚服务必须提供CollectionC组件,并且大多数的汇聚协. 议的接口是由Collection组件来提供的,CollectionC组件的具 实现如代码68所示。佩第6章TinyOS网络协议【代码 68 】CollectionC.ncconfiguration CollectionC provides interf

26、ace StdControl;interface Senduint8_t client;interface Receivecollection_id_t id;interface Receive as Snoopcollection_id_t;interface Interceptcollection_id_t id;interface Packet;iterface CollectionPacket; iterface CtpPacket;inTruinterface Ctplnfb;interface CtpCongestion;interface RootControl;uses int

27、erface Collectionlduint8_t client;interface CollectioiiDebug;佩第6章TinyOS网络协议佩第6章TinyOS网络协议StdControl = CtpP;Send = CtpP;Receive = CtpP. Receive;Snoop = CtpP. Snoop;Intercept = CtpP;Packet = CtpP;CollectionPacket = CtpP;佩第6章TinyOS网络协议irr|7uCtplnfo 二 CtpP;CtpCongestion = CtpP;RootControl = CtpP;Collect

28、ionld = CtpP; CollectionDebug = CtpP;佩第6章TinyOS网络协议491 I &TAVbj Lfl /J 予EfKnBmnfisEfl s £31 issi bc an n=包你?eih?£?mkMWMMHHiiHiiifi$砂点。j;. <理节二、第6章TinyOS网络协议 CollectionSenderC.ncoCollectioiiSeiid(?iW/fT-;u -个迪川 W W; T SeMM和Packet接口、并且两个接口是通过CollectioiiSeiideiP来实现的,CollectionSenderC组件

29、具体代码如代码6-9所示。【代码 69 】CollectionSenderC.ncgeneric configuration CollectionSenderC(collection_id_t collectid) provides interface Send;interface Packet;implementation components new CollectionSenderP(collectid, unique(UQ_CTP_CLIENT);Send = CollectionSenderP;第6章TinyOS网络协议儘第6章TinyOS网络协'议 iffTni(3) Co

30、llectionSenderP.nc o()llccli()iiScii(lcfP;z| (. ->_ (I1-冋个拦Seiul-j V iPacket® o CollecfioiiSeiideiP组件通过绑定Send接口 木IBM 接口到CollectionC组件上实现,CollectionSenderP组件的具体 代码如代码610所示。,第6章TinyOS网络协议第6章TinyOS网络协议第6章TinyOS网络协议【代码 6-10 CollectionSenderP.ncgeneric configurationCollectionSenderP(collection_id

31、_t collectid, uint8_t clientiprovides第6章TinyOS网络协议第6章TinyOS网络协议interface Send; interface Packet;CollectoiCollectionIdclientid> CollectionldP;implementation components CollectionC as Collector; components new CollectionldP(collectid);Send = Collector. Send clientid;Packet = Collector.Packet;0餡第6章T

32、inyOS网络协、议 iffTru:.W:BX.0 r/:*» 以及彳wmMMMMMBMHM路由引.0inTin转发引擎路由引擎链路估计器图6-4 CTP总体架构0儘第6章TinyOS网络协议iffTni其中,各个部分的功能如下:链路估计器:位于最底层,负责估计节点与邻居的单跳链路质量,并维护-个邻居表。路由引擎:位于中间层,使用链路估计器提供F'輸择到根节点传输代价最小的节点作为父节点,并维护一个路I, 表。RSI儘第6章TinyOS网络协议iffTni儘第6章TinyOS网络协议iffTni>(Liiik 礙.妻;“ mytirr團- /儘第6章TinyOS网络协议

33、麟後邂iffTniv、yWLE估计器和4BITLE估计器的实现在结构上大体相同的是4BITM讣器捉取的物理以、链路以以及网络丿馈信息能够提高链路估计的精确值。因此本书中采用4的估计器。该组件的具体代码如代码6 -11所示。第6章TinyOS网络协议inTru【代码 6-11 】L inkE s tima torP. lie module LiiikEstimatorPprovidesinterface StdControl;第6章TinyOS网络协议第6章TinyOS网络协议interface AMSend as Send;interface Receive;第6章TinyOS网络协议uses

34、interface AMSend;interface AMPacket as SubAMPacket;interface Packet as SubPacket;interface Receive as SubReceive;interface LinkPacketMetadata;interface Random;和删除鬼热码如代II【代码 6-12 】LiiikE st ima torP. lieconmiand error_t LiiikEstimator.txAck(am_addr_t neighboJ neighbor_table_entiy_t *iie;uint8_t nidx

35、= findldx(neighbor);if (nidx = INVALID_RVAL)return FAIL;3->data_total+;2 = &NeighborTablenidx; ->data_success+;第6章TinyOS网络协议inTruif(ne->data_total >= DLQ_PKT_WINDOW) updateDETX(ne);return SUCCESS;第6章TinyOS网络协议txNoAck:当节点没有接收到数据的确认帧时,同样也更新发 送节点与接收节点的链路估计值。具体源码如代码6-13所示。楼第6章TinyOS网络协议i

36、nTin【代码 6-13 】LiiikE st ima torP. nc conmiand error_t LiiikEstimator.txNoAck(am_addr_t neigh neighbor_table_entiy_t *iie;uint8_t nidx = findldx(neighbor);第6章TinyOS网络协议第6章TinyOS网络协议第6章TinyOS网络协议iriTrnlie = &NeighborTablenidx; ne->data_total+;if(ne->data_total >= DLQ_PKT_WINDOW)儘第6章TinyOS

37、网络协议iffTni(2)邻居节点的添加。邻居节点的添加是通过LiiikPacketMetadata接口来”通过此接口判断信道是否具有较高的链路质量,并把/風加入到邻居表中,便于以后在选择路径时考虑该邻启羁路。其实现代码如代码6-15所示。裁儘第6章TinyOS网络协议iffTni儘第6章TinyOS网络协议iffTni第6章TinyOS网络协议【代码6-15】LiiikEstimatorP.ncif (call LinkPacketMetadatahighChannelQuality(nisg)if (signal CompareBit.shouldlnseit(msg,call Packe

38、t.getPayload(msg, call Packet.payloadLength(msg)J|call Packet.payloadLength(msg)-nidx = findRandoniNeighborIdx();if (nidx != INVALID_RVAL)71第6章TinyOS网络协议signalLinkEstiniatorcvictGd(NGighborTablenidxll_addjr);initNeighborIdx(nidx, ll_addr);第6章TinyOS网络协议第6章TinyOS网络协议儘第6章TinyOS网络协议iffTniT; T,2.路由引擎路由引擎

39、负责计算到汇聚树根节点的路由,即选扌输的下-跳。它记录了由链路估计表维护的-组节点望传输值 ETX(Expected Transmissions)。CTP是使用ETX作为路由梯度来表示双向链路质量的估计 值。ETX值越小表示链路质量越好。其中,根节点的路径ET 为0,普通节点的路径ETX为其下一跳节点的路径酯路的连接ETX,因此节点的路径ETX是该节点到根曲 条路由的每跳连接ETX之和o第6章TinyOS网络协议inTru计重臓路由引擎每隔一定事件就会根据更新的链路质量冲 进行路由选择,主要是计算路径ETX和重选父节点,然 一个路由帧,包括当前的父节点地址和路径ETX。在TinyOS 2.x中

40、CTP路由引擎的实现是通过 CtpRoutingEngineP组件来实现的,其组件在 “mytinyos/lib/net ctp/ CtpRoutingEngineP?5目录下,具体实现代码如代码6-16所zj O第6章TinyOS网络协议第6章TinyOS网络协议第6章TinyOS网络协议>esII【代码 6-16 CtpRoutingEngineP.ncgeneric module CtpRoutingEngineP(uint8_t routingTableSize,uint32_t niinlnt erva 1 ,n int 3 2_t maxlnteival)providesin

41、terface UnicastNameFreeRouting as Routing;interface RootControl;interface Ctplnfb;interface StdControl;interface CtpRoutingPacket; interface Init;inTruinterface AMSend as BeaconSend;interface Receive as BeaconReceive;interface LinkEstimator;interface AMPacket;interface SplitControl as RadioControl;

42、interface Timer<TMilli> as BeaconTimer;interface Timer<TMilli> as RonteTimer; interface Random;interface CollectionDebug;interface CtpCongestion;interface CompareBit;第6章TinyOS网络协议在CtpRoutingEngineP组件中,通过LiiikEstimator接获辭链路估计器和路由引擎之间的交流是通过LinkEsti晶Lgg 口和CompareBit接口来进行的。在这两个接口中,其命令函娄翻 返回的

43、链路质量值都是标准形式。其中,LiiikEstimator.getQualityO的返回值越小,表示该通信链路的力 量越好。邻居表中的节点以及与该邻居节点的双向链路质量。I3. 转发引擎转发引擎主要负责以下5种功能:传递消息包到下一跳,在必要时重传以及向链路召 递应答信号。决定何时向下一跳节点传输。IM遴外寫 J厂检测路由中的不一致,并通知路由引擎。【代码6-17】 CtpF oi*wardingEngineP.nc generic module CtpForwajrdiiigEiigiiwPO providesinterface Init;interface StdControl;inter

44、face Senduint8_t client;interface Receivecollection_id_t id;interface Receive as Snoopcollection_id_t id;interface Interceptcollection_id_t id;interface Packet;interface CollectionPacket;interface CtpPacket;usesinterface AM Send as SubSend; interface Receive as SubReceive;interface Receive as SubSno

45、op;interface Packet as SubPacket;interface UnicastNameFreeRouting;interface SplitControl as RadioControl;interface Queue<fe_queue_entiy_t*> as SendQueue; interface Pool<fe_queue_entiy_t> as QEntiyPool; interface Pool<message_t> as MessagePool;interface Timer<TMilli> as Retxii

46、iitTimer;interface LinkEstimator;interface Timer<TMilli> as Congesti011Timer;interface Cache<message_t*> as SentCache;interiface Ctplnfb;interface PacketAckiiowledgements;interface Random;interface RootControl;interface Collectionlduint8_t client;interface AMPacket;interface CollectionDe

47、bug;interface Leds;第6章TinyOS网络协议第6章TinyOS网络协议数、喙、护1 Yf /第6章TinyOS网络协议II【代码6-18 CtpF oi*wardingEngineP.ncevent message_t*SubReceive.receive(message_t* msg, void* payload, uint8_t len) collection_id_t collectid;bool duplicate = FALSE;fe_queue_entiy_t* qe;uint8_t i, till;collectid = call CtpPacket.getT

48、ype(msg);1 = call CtpPacket.getThl(msg);call CtpPacket.setThl(msg, till);call CollectionDebug.logEventMsg(NET_C_FE_RCV_MSG,callCollectionPacket.getSequenceNumber(msg),callCollectionPacket.getOngin(msg),return msg;till-); if (len > call SubSend.maxPayloadLength()inTruif (call SentCache.lookup(msg)callCollectionDebug.logEvent(NET_C_FE_DUPLICATE_CACHE); return msg;if (call SendQueue.size() > 0)duplicate = TRUE; break:qe

温馨提示

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

评论

0/150

提交评论