《【精品】tinyos操作系统开发技术及实践(西电版实践4tinyos应用开发(可编辑.ppt》由会员分享,可在线阅读,更多相关《【精品】tinyos操作系统开发技术及实践(西电版实践4tinyos应用开发(可编辑.ppt(46页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、TinyOS操作系统开发技术及实践(西电版)实践4 TinyOS应用开发实践4 TinyOS应用开发 2 2实践指导实践指导 实践实践4.G.1实现CC2530光敏信息的采集传输及向PC机传送数据,需要完成以下工作:(1)通过AD进行光敏信息的采集。(2)通过射频将数据发送至接收者。(3)接收者接收到数据之后,将接收的数据通过串口发送至PC机。实践4 TinyOS应用开发 3 3【分析】【分析】(1)本实验使用两个CC2530节点,命名为节点1和节点2。(2)在“mytinyos/apps”目录下创建工程文件。其中,程序的编写分为两部分:数据的发送部分和接收部分;节点1负责信息的采集和发送,节
2、点2负责信息的接收以及将数据通过串口传输至PC机。(3)编写程序及Makefile文件。(4)观察实验现象。实践4 TinyOS应用开发 4 4【参考解决方案】【参考解决方案】1创建工程目录创建工程目录由于本实验的节点1和节点2使用的程序不同,因此本实验的发送和接收分别在同一个工程文件的两个子目录下。(1)创建传感器采集传输工程目录Sensor。打开cygwin,在“opt/mytinyos/apps目录下”输入“mkdir Sensor”,创建目录,具体操作如图S4-1所示。实践4 TinyOS应用开发 5 5图S4-1 创建Sensor目录 实践4 TinyOS应用开发 6 6实践4 Ti
3、nyOS应用开发 7 7实践4 TinyOS应用开发 8 8创建完成之后目录如图S4-3所示。图S4-3 创建完成后的目录 实践4 TinyOS应用开发 9 92发送程序的编写发送程序的编写发送程序的编写需要完成以下几项工作:(1)创建并编写ADSensorSendApp.nc文件。使用EditPlus程序在ADRadioSend目录下新建ADSensorSendApp.nc文件,并输入如下代码:实践4 TinyOS应用开发 10 10#include#include BlinkToRadio.hconfiguration ADSensorSendAppCimplementationcompo
4、nents ADSensorSendC;components new AdcC()as ADSensor;components ActiveMessageC;components LedsC;实践4 TinyOS应用开发 11 11/ADC信息采集配置ADSensorSendC.ADSensorControl-ADSensor;/ADC读取ADSensorSendC.ADSensorRead-ADSensor;components MainC;/启动接口ADSensorSendC.Boot-MainC.Boot;components new TimerMilliC()as SensorTime
5、rC;/定时器ADSensorSendC.SensorTimer-SensorTimerC;components PlatformSerialC;/串口配置ADSensorSendC.StdControl-PlatformSerialC.StdControl;/串口传输实践4 TinyOS应用开发 12 12ADSensorSendC.UartStream-PlatformSerialC.UartStream;/LED组件ADSensorSendC.Leds-LedsC.Leds;/*射频发送组件*/ADSensorSendC.Packet-ActiveMessageC;ADSensorSen
6、dC.AMPacket-ActiveMessageC;ADSensorSendC.AMSend-ActiveMessageC.AMSenduniqueCount(ADRadioSend);ADSensorSendC.AMControl-ActiveMessageC;ADSensorSendC.PacketAcknowledgements-ActiveMessageC;实践4 TinyOS应用开发 13 13(2)创建并编写ADSensorSendC.nc文件。使用EditPlus程序在ADRadioSend目录下新建ADSensorSendC.nc文件,并输入如下代码:#include“Adc
7、.h”#include“BlinkToRadio.h”#include module ADSensorSendCuses 实践4 TinyOS应用开发 14 14interface Boot;interface AdcControl as ADSensorControl;interface Read as ADSensorRead;interface Timer as SensorTimer;interface Leds;interface Packet;interface AMPacket;interface AMSend;interface SplitControl as AMContro
8、l;interface PacketAcknowledgements;实践4 TinyOS应用开发 15 15interface StdControl;interface UartStream;implementationuint8_t m_len;uint8_t m_send_buf2;uint16_t counter;message_t pkt;实践4 TinyOS应用开发 16 16/*传感器采集任务*/task void sensorTask()/选择P0.7为AD采集通道,call ADSensorControl.enable(ADC_REF_AVDD,ADC_14_BIT,ADC_
9、AIN7);/开始采集AD信息call ADSensorRead.read();/*系统启动*/event void Boot.booted()/开启定时器任务实践4 TinyOS应用开发 17 17call SensorTimer.startPeriodic(1000);/开启ad采集call StdControl.start();/开启无线传输call AMControl.start();/*当无线开启之后会触发AMControl.startDone事件*/event void AMControl.startDone(error_t err)if(err=SUCCESS)实践4 TinyO
10、S应用开发 18 18/如果开启成功,将点亮LED1call Leds.led0On();/call Timer0.startPeriodic(TIMER_PERIOD_MILLI);else/否则重新启动无线call AMControl.start();实践4 TinyOS应用开发 19 19/定时事件event void SensorTimer.fired()/开启传感器采集任务post sensorTask();/*ADC读取完毕之后将会触发readDone事件*/event void ADSensorRead.readDone(error_t result,int16_t val)Bl
11、inkToRadioMsg*btrpkt;实践4 TinyOS应用开发 2020/获得要发送的信息包btrpkt=(BlinkToRadioMsg*)call Packet.getPayload(&pkt,sizeof(BlinkToRadioMsg);/*要发送的数据,TOS_NODE_ID为节点号,val为采集的光照信息*/btrpkt-nodeid=TOS_NODE_ID;btrpkt-counter=val;/*将数据发送出去,如果发送成功LED2将闪烁*/if(call AMSend.send(AM_BROADCAST_ADDR,&pkt,sizeof(BlinkToRadioMsg
12、)=SUCCESS)call Leds.led1Toggle();/busy=TRUE;实践4 TinyOS应用开发 21 21async event void UartStream.sendDone(uint8_t*buf,uint16_t len,error_t error)async event void UartStream.receivedByte(uint8_t byte);/*在接收完receive命令欲接收的长度后会调用此事件*/async event void UartStream.receiveDone(uint8_t*buf,uint16_t len,error_t er
13、ror)实践4 TinyOS应用开发 2222/*如果发送成功,接收者将发送确认帧给发送者*/event void AMSend.sendDone(message_t*msg,error_t error)if(&pkt=msg)call PacketAcknowledgements.requestAck(msg);event void AMControl.stopDone(error_t err)实践4 TinyOS应用开发 2323(3)创建BlinkToRadio.h文件。使用EditPlus程序在ADRadioSend目录下新建BlinkToRadio.h文件,并输入如下代码:#ifnd
14、ef _BLINKTORADIO_H#define _BLINKTORADIO_Henum/定时事件TIMER_PERIOD_MILLI=2000;/*发送数据结构体*/typedef nx_struct BlinkToRadioMsg实践4 TinyOS应用开发 2424nx_uint16_t nodeid;nx_uint16_t counter;BlinkToRadioMsg;#endif实践4 TinyOS应用开发 2525(4)编写Makefile文件。使用EditPlus程序在ADRadioSend目录下创建Makefile文件,并输入以下内容:COMPONENT=ADSensorS
15、endAppCinclude$(MAKERULES)(5)编译程序。在Cygwin下,保证工作目录为ADRadioSend,输入“$make cc2530”命令进行编译,编译完成后如图S4-4所示。实践4 TinyOS应用开发 2626图S4-4 编译ADRadioSend程序 实践4 TinyOS应用开发 27273接收程序编写接收程序编写接收程序的编写需要完成以下几项工作:(1)创建并编写ADSensorReceiveApp.nc文件。使用EditPlus程序在ADRadioReceive目录下新建ADSensorReceiveApp.nc文件,并输入如下代码:#include#inclu
16、de“BlinkToRadio.h”configuration ADSensorReceiveAppC实践4 TinyOS应用开发 2828implementationcomponents ADSensorReceiveC;components ActiveMessageC;components new AMReceiverC(AM_BLINKTORADIO);components LedsC;components MainC;ADSensorReceiveC.Boot-MainC.Boot;components new TimerMilliC()as SensorTimerC;ADSenso
17、rReceiveC.SensorTimer-SensorTimerC;components PlatformSerialC;ADSensorReceiveC.StdControl-PlatformSerialC.StdControl;ADSensorReceiveC.UartStream-PlatformSerialC.UartStream;ADSensorReceiveC.Leds-LedsC.Leds;ADSensorReceiveC.AMControl-ActiveMessageC;ADSensorReceiveC.Receive-ActiveMessageC.Receiveunique
18、Count(ADRadioReceive);实践4 TinyOS应用开发 2929(2)创建并编写ADSensorReceiveC.nc文件。使用EditPlus程序在ADRadioReceive目录下新建ADSensorReceiveC.nc文件,并输入如下代码:#include“BlinkToRadio.h”#include module ADSensorReceiveCuses interface Boot;实践4 TinyOS应用开发 3030interface Timer as SensorTimer;interface Leds;interface Packet;interface
19、 AMPacket;interface SplitControl as AMControl;interface Receive;interface StdControl;interface UartStream;implementation实践4 TinyOS应用开发 31 31uint8_t m_len;uint8_t m_send_buf2;uint16_t counter;message_t pkt;event void Boot.booted()/开启定时器任务call SensorTimer.startPeriodic(1000);/开启无线传输call AMControl.star
20、t();实践4 TinyOS应用开发 3232/*当无线开启之后会触发AMControl.startDone事件*/event void AMControl.startDone(error_t err)if(err=SUCCESS)/如果开启成功,将点亮LED1call Leds.led0On();else/否则重新启动无线call AMControl.start();实践4 TinyOS应用开发 3333/定时事件event void SensorTimer.fired()async event void UartStream.sendDone(uint8_t*buf,uint16_t le
21、n,error_t error)实践4 TinyOS应用开发 3434async event void UartStream.receivedByte(uint8_t byte);/*在接收完receive命令欲接收的长度后会调用此事件*/async event void UartStream.receiveDone(uint8_t*buf,uint16_t len,error_t error)实践4 TinyOS应用开发 3535/*数据接收事件,接收者接收到发送者发送的信息后,将数据发送通过串口发送至上位机*/event message_t*Receive.receive(message_
22、t*msg,void*payload,uint8_t len)/判断接收到数据的帧长度if(len=sizeof(BlinkToRadioMsg)/将负载取出来BlinkToRadioMsg*btrpkt=(BlinkToRadioMsg*)payload;if(btrpkt-nodeid=TOS_NODE_ID)/*采集的光敏信息*/实践4 TinyOS应用开发 3636m_send_buf0=(btrpkt-counter)8;m_send_buf1=(btrpkt-counter)&0 x00ff;/通过串口发送至PC机call UartStream.send(m_send_buf,2)
23、;/LED3闪烁call Leds.led2Toggle();return msg;实践4 TinyOS应用开发 3737event void AMControl.stopDone(error_t err)实践4 TinyOS应用开发 3838(3)创建BlinkToRadio.h文件。使用EditPlus程序在ADRadioReceive目录下新建BlinkToRadio.h文件,并输入如下代码:#ifndef _BLINKTORADIO_H#define _BLINKTORADIO_Henum/定时事件TIMER_PERIOD_MILLI=2000;/*接收数据结构体*/typedef n
24、x_struct BlinkToRadioMsg实践4 TinyOS应用开发 3939nx_uint16_t nodeid;nx_uint16_t counter;BlinkToRadioMsg;#endif(4)编写Makefile文件。使用EditPlus程序在ADRadioReceive目录下创建Makefile文件,并输入以下内容:COMPONENT=ADSensorReceiveAppCinclude$(MAKERULES)(5)编译程序。在Cygwin下,保证当前工作目录为ADRadioReceive,然后输入“$make cc2530”命令进行编译,编译完成后如图S4-5所示。实
25、践4 TinyOS应用开发 4040图S4-5 编译ADRadioReceive程序 实践4 TinyOS应用开发 41 414实验现象实验现象程序编译完成之后,将发送程序和接收程序分别下载至节点1和节点2,按下复位按键,开始数据的传输,并通过串口传输到PC机,通过PC机可以观察到采集的光照信息值,如图S4-6所示。实践4 TinyOS应用开发 4242图S4-6 采集的光照信息 实践4 TinyOS应用开发 4343使用ZigbeeSniffer捕获的数据如图S4-7所示。图S4-7 收发的数据 实践4 TinyOS应用开发 4444知识拓展知识拓展 HDLC帧格式帧格式高级数据链路控制(H
26、igh-Level Data Link Control或简称HDLC),是一个在同步网上传输数据、面向比特的数据链路层协议,它是由国际标准化组织(ISO)根据IBM公司的SDLC(Synchronous Data Link Control)协议扩展开发而成的。HDLC数据帧格式由以下三部分组成:起始标志:采用固定的帧间隔符“01111110”,即0 x7e。要传输的数据模块:即要传输的数据帧载荷。结束标志:采用和起始标志一样的帧间隔符。实践4 TinyOS应用开发 4545因此在HDLC规程中,帧与帧之间用0 x7e分隔,数据帧构成了通信双方交换的最小单位,并且在数据帧的载荷部分还使用了转义字
27、符,即如果数据帧的载荷部分中出现了0 x7e将会被转义为0 x7d 0 x5e;如果数据帧中出现了0 x7d将会被转义为0 x7d 0 x5d。HDLC作为面向比特的数据链路控制协议的典型,具有如下特点:协议不依赖于任何一种字符编码集。数据报文可透明传输,用于实现透明传输的“0比特插入法”易于硬件实现。实践4 TinyOS应用开发 4646全双工通信,不必等待确认便可连续发送数据,有较高的数据链路传输效率。所有帧均采用CRC校验,对信息帧进行编号,可防止漏收或重份,传输可靠性高。传输控制功能与处理功能分离,具有较大的灵活性和较完善的控制功能。由于以上特点,目前网络设计普遍使用HDLC作为数据链路协议。