《【精品】tinyos操作系统开发技术及实践(西电版实践5tinyos网络协议精品ppt课件.ppt》由会员分享,可在线阅读,更多相关《【精品】tinyos操作系统开发技术及实践(西电版实践5tinyos网络协议精品ppt课件.ppt(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、TinyOS操作系统开发技术及实践(西电版)实践5 TinyOS网络协议实践5 TinyOS网络协议 2 2实践指导实践指导 实践实践5.G.1基于分发协议的烟雾信息采集及传输。【分析】(1)本例程要实现信息的采集和传输,程序实现部分需要分为两部分编写,即发送部分和接收部分。(2)发送部分程序要实现烟雾信息的采集和传输。(3)接收部分程序要实现信息的接收以及将数据传输至PC机。(4)下载调试,观察现象。实践5 TinyOS网络协议 3 3【参考解决方案】【参考解决方案】1建立工程文件夹建立工程文件夹在“/mytinyos/apps”目录下新建一个SmokeTest的文件夹(其操作步骤参照实践5
2、.G.1),在SmokeTest文件夹下新建Sender和Receive文件夹。其中,Sender文件夹实现数据的发送部分程序;Receive文件夹实现数据的接收部分程序。实践5 TinyOS网络协议 4 42发送部分程序发送部分程序在“mytinyos/apps/SmokeTest/Sender”目录下新建三个文件:SmokeTestSApp.nc、SmokeTestSC.nc和Makefile文件。其中SmokeTestSC.nc文件实现了数据的采集和发送,SmokeTestSApp.nc文件为SmokeTestSC.nc文件的顶层配件。实践5 TinyOS网络协议 5 5(1)在Smok
3、eTestSApp.nc中的主要代码如下:#include BlinkToRadio.hconfiguration SmokeTestSAppC implementation components SmokeTestSC;components MainC;SmokeTestSC.Boot-MainC;components ActiveMessageC;SmokeTestSC.RadioControl-ActiveMessageC;实践5 TinyOS网络协议 6 6实践5 TinyOS网络协议 7 7实践5 TinyOS网络协议 8 8(2)SmokeTestSC.nc文件中的主要代码实现如下
4、:#include#include Adc.h#include BlinkToRadio.hmodule SmokeTestSC usesinterface AMSend;interface Packet;interface AMPacket;interface Read as ADSensorRead;interface AdcControl as ADSensorControl;interface Boot;实践5 TinyOS网络协议 9 9interface SplitControl as RadioControl;interface StdControl as Disseminati
5、onControl;interface DisseminationValue as Value16;interface DisseminationUpdate as Update16;interface Leds;interface Timer;implementation uint16_t counter;am_addr_t DES=0 x0003;实践5 TinyOS网络协议 10 10/*传感器采集任务*/task void sensorTask()/选择P0.7为AD采集通道,call ADSensorControl.enable(ADC_REF_AVDD,ADC_14_BIT,ADC
6、_AIN3);/开始采集AD信息call ADSensorRead.read();event void Boot.booted()call RadioControl.start();实践5 TinyOS网络协议 11 11event void RadioControl.startDone(error_t result)if(result!=SUCCESS)call RadioControl.start();elsecall DisseminationControl.start();counter=0;call Timer.startPeriodic(2000);实践5 TinyOS网络协议 1
7、2 12event void RadioControl.stopDone(error_t result)event void Timer.fired()post sensorTask();实践5 TinyOS网络协议 13 13event void Value16.changed()const uint16_t*newVal=call Value16.get();call Leds.led2Toggle();counter=*newVal;event void AMSend.sendDone(message_t*msg,error_t err)call Leds.led1Toggle();实践
8、5 TinyOS网络协议 14 14/*ADC读取完毕之后将会触发readDone事件*/event void ADSensorRead.readDone(error_t result,int16_t val)message_t pkt;BlinkToRadioMsg*btrpkt;counter=val;call Update16.change(&counter);btrpkt=(BlinkToRadioMsg*)call Packet.getPayload(&pkt,sizeof(BlinkToRadioMsg);btrpkt-nodeid=DES;btrpkt-num=counter;实
9、践5 TinyOS网络协议 15 15if(call AMSend.send(AM_BROADCAST_ADDR,&pkt,sizeof(BlinkToRadioMsg)=SUCCESS);实践5 TinyOS网络协议 16 16(3)在BlinkRadio.h文件中定义了发送数据的结构体,具体代码如下:#ifndef _BLINKTORADIO_H#define _BLINKTORADIO_Htypedef nx_struct BlinkToRadioMsgnx_uint16_t nodeid;nx_uint16_t num;BlinkToRadioMsg;#endif实践5 TinyOS网
10、络协议 17 17(4)在Makefile文件中注明程序的顶层配件,其代码如下:COMPONENT=SmokeTestSAppCCFLAGS+=-I$(TOSDIR)/lib/net-I%T/lib/net/dripinclude$(MAKERULES)实践5 TinyOS网络协议 18 183接收部分程序接收部分程序在“mytinyos/apps/SmokeTest/Sender”目录下新建三个文件:SmokeTestRApp.nc、SmokeTestRC.nc和Makefile文件。其中SmokeTestRC.nc文件实现了数据的接收以及通过串口将数据传输至PC机,SmokeTestRAp
11、p.nc文件为SmokeTestRC.nc文件的顶层配件。实践5 TinyOS网络协议 19 19(1)在SmokeTestRApp.nc中的主要代码如下:#include BlinkToRadio.hconfiguration SmokeTestRAppC implementation components SmokeTestRC,MainC;SmokeTestRC.Boot-MainC;components ActiveMessageC;SmokeTestRC.RadioControl-ActiveMessageC;实践5 TinyOS网络协议 2020components Dissemi
12、nationC;SmokeTestRC.DisseminationControl-DisseminationC;components new DisseminatorC(uint16_t,0 x2345)as Object16C;SmokeTestRC.Update16-Object16C;components LedsC;SmokeTestRC.Leds-LedsC;components new TimerMilliC();SmokeTestRC.Timer-TimerMilliC;实践5 TinyOS网络协议 21 21SmokeTestRC.Packet-ActiveMessageC;S
13、mokeTestRC.AMPacket-ActiveMessageC;SmokeTestRC.Receive-ActiveMessageC.ReceiveuniqueCount(SmokeApp);components PlatformSerialC;SmokeTestRC.StdControl-PlatformSerialC.StdControl;SmokeTestRC.UartStream-PlatformSerialC.UartStream;实践5 TinyOS网络协议 2222(2)SmokeTestRC.nc文件中的主要代码实现如下:#include#include BlinkToR
14、adio.hmodule SmokeTestRC usesinterface Receive;interface Packet;interface AMPacket;interface StdControl;interface UartStream;interface Boot;实践5 TinyOS网络协议 2323interface SplitControl as RadioControl;interface StdControl as DisseminationControl;interface DisseminationUpdate as Update16;interface Leds;
15、interface Timer;implementation uint16_t counter;uint8_t m_send_buf2;实践5 TinyOS网络协议 2424event void Boot.booted()call RadioControl.start();/开启串口传输call StdControl.start();实践5 TinyOS网络协议 2525event void RadioControl.startDone(error_t result)if(result!=SUCCESS)call RadioControl.start();elsecall Disseminat
16、ionControl.start();counter=0;call Timer.startPeriodic(2000);实践5 TinyOS网络协议 2626event void RadioControl.stopDone(error_t result)event void Timer.fired()实践5 TinyOS网络协议 2727/*接收信息,并通过串口输出至PC机*/event message_t*Receive.receive(message_t*msg,void*payload,uint8_t len)call Leds.led0Toggle();if(len=sizeof(Bl
17、inkToRadioMsg)BlinkToRadioMsg*btrpkt=(BlinkToRadioMsg*)payload;counter=btrpkt-num;if(btrpkt-nodeid=0 x0003)m_send_buf0=counter8;m_send_buf1=counter&0 x00ff;实践5 TinyOS网络协议 2828call UartStream.send(m_send_buf,2);return msg;async event void UartStream.sendDone(uint8_t*buf,uint16_t len,error_t error)实践5
18、 TinyOS网络协议 2929async event void UartStream.receivedByte(uint8_t byte);/*在接收完receive命令欲接收的长度后会调用此事件*/async event void UartStream.receiveDone(uint8_t*buf,uint16_t len,error_t error)实践5 TinyOS网络协议 3030(3)在BlinkRadio.h文件中定义了发送数据的结构体,具体代码如下:#ifndef _BLINKTORADIO_H#define _BLINKTORADIO_Htypedef nx_struct
19、 BlinkToRadioMsgnx_uint16_t nodeid;nx_uint16_t num;BlinkToRadioMsg;#endif实践5 TinyOS网络协议 31 31(4)在Makefile文件中注明程序的顶层配件,其代码如下:COMPONENT=SmokeTestSAppCCFLAGS+=-I$(TOSDIR)/lib/net-I%T/lib/net/dripinclude$(MAKERULES)实践5 TinyOS网络协议 32324实验结果实验结果分别将发送和接收的程序下载至两个不同的CC2530开发板中(接收程序所用的开发板需要有串口,因此建议接收程序的开发板用Zi
20、gbee协调器),程序下载完毕后,将串口与PC机连接,通过串口可以观察采集的数据,如图S5-1所示。实践5 TinyOS网络协议 3333图S5-1 采集的烟雾信息 实践5 TinyOS网络协议 3434知识拓展知识拓展 AODV路由协议路由协议AODV路由协议是一种采用逐条分组的路由协议。此协议用于特定网络中的可移动节点。它能在动态变化的点对点网络中确定一条到目的地的路由,并且具有接入速度快、计算量小、内存占用低、网络负荷轻等特点。AODV路由协议采用目的序列号来确保在任何时候都不会出现回环(甚至在路由控制信息出现异常的时候也是如此),避免了传统的距离数组协议中会出现的很多问题(比如无穷计数
21、问题)。实践5 TinyOS网络协议 3535AODV算法旨在在多个移动节点中建立和维护一个动态、自启动、多跳路由的专属网络。AODV使得移动节点能快速获得通向新的目的节点的路由,并且节点仅需要维护通向它信号所及范围内的节点的路由,更远的节点路由信息则不需要维护。网络中连接的断开和异动会使得网络拓扑结构发生变化,AODV使得移动节点能适时对这种变化做出响应。AODV的操作是无自环的,使得该算法在网络拓扑变化时(比如一个节点在网络中移动)能够快速收敛。当一个连接断开时,AODV会告知所有受到影响的节点,这些节点会让用到这个连接的路由失效。实践5 TinyOS网络协议 3636AODV的一个显著特
22、点是它在每个路由表项上使用了目的序列号。目的序列号由目的节点创建,并且被包含在路由信息中,这些路由信息将被回发到所有向它发起请求的节点。目的序列号的使用确保了无回环,并且易于编程。如果到一个目的有两条路由可供选择,那么收到请求的节点将会选择序列号最大的那一条(由于目的节点每次收到新的请求都会将目的序列号加一,所以序列号最大表明该路由最新)。AODV定义了三种消息种类:路由请求(RREQ)、路由回复(RREP)和路由错误(RERR)。在TinyOS中可以根据需求实现路由协议的三种消息种类。AODV路由协议的具体实现读者可以自行编写。实践5 TinyOS网络协议 3737 分发协议的分发协议的Dr
23、ip库和库和DIP库库在TinyOS 2.x中,小数据的分发协议具有两种分发库:Drip库和DIP库。Drip把每个数据项都当作分发的单独实体,并提供了很好的粒子性控制,控制如何快速地将数据项分发出去。DIP把分发的所有的数据项当作一个群体,即分发控制和参数配置可以适用于所有的数据项集体。两者的实现代码可以在tos/lib/net目录下找到,其中Drip库位于tos/lib/net/drip目录下,DIP库位于tos/lib/net/dip目录下。两者简要的对比如表S5-1所示。实践5 TinyOS网络协议 3838实践5 TinyOS网络协议 3939总体来说,当只有少量数据项,且不确定各个节点的数据结构时,建议使用Drip分发库,其分发数据的类型可以灵活定义。如果所有节点具有统一的数据类型,且需要高效率的消息机制时,可以使用DIP分发库(本书中的实例及实验使用Drip分发库)。