《最新tinyos操作系统开发技术及实践(西电版实践4tinyos应用开发(共47张ppt课件).pptx》由会员分享,可在线阅读,更多相关《最新tinyos操作系统开发技术及实践(西电版实践4tinyos应用开发(共47张ppt课件).pptx(47页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实践4 TinyOS应用开发 1 1实践(shjin)4 TinyOS应用开发 实践(shjin)指导 知识拓展 第一页,共四十七页。实践4 TinyOS应用开发 2 2实践指导实践指导 实践实践4.G.1实现CC2530光敏信息的采集传输(chun sh)及向PC机传送数据,需要完成以下工作:(1) 通过AD进行光敏信息的采集。(2) 通过射频将数据发送至接收者。(3) 接收者接收到数据之后,将接收的数据通过串口发送至PC机。第二页,共四十七页。实践4 TinyOS应用开发 3 3【分析】【分析】(1) 本实验使用两个CC2530节点,命名为节点1和节点2。 (2) 在“mytinyos/a
2、pps”目录下创建工程文件(wnjin)。其中,程序的编写分为两部分:数据的发送部分和接收部分;节点1负责信息的采集和发送,节点2负责信息的接收以及将数据通过串口传输至PC机。(3) 编写程序及Makefile文件(wnjin)。(4) 观察实验现象。第三页,共四十七页。实践4 TinyOS应用开发 4 4【参考解决方案】【参考解决方案】1创建工程目录创建工程目录由于本实验的节点1和节点2使用的程序不同,因此本实验的发送和接收分别在同一个工程文件的两个子目录下。(1) 创建传感器采集传输(chun sh)工程目录Sensor。打开cygwin,在“opt/mytinyos/apps目录下”输入
3、“mkdir Sensor”,创建目录,具体操作如图S4-1所示。第四页,共四十七页。实践4 TinyOS应用开发 5 5图S4-1 创建(chungjin)Sensor目录 第五页,共四十七页。实践4 TinyOS应用开发 6 6(2) 创建发送和接收文件(wnjin)子目录。以步骤(1)创建文件(wnjin)为例在Sensor文件(wnjin)夹下分别创建发送和接收工程文件(wnjin)夹:ADRadioSend和ADRadioReceive,如图S4-2所示。第六页,共四十七页。实践4 TinyOS应用开发 7 7图S4-2 创建(chungjin)发送和接收子目录 第七页,共四十七页。
4、实践4 TinyOS应用开发 8 8创建完成(wn chng)之后目录如图S4-3所示。图S4-3 创建完成(wn chng)后的目录 第八页,共四十七页。实践4 TinyOS应用开发 9 92发送发送(f sn)程序的编写程序的编写发送程序的编写需要完成以下几项工作:(1) 创建并编写ADSensorSendApp.nc文件。使用EditPlus程序在ADRadioSend目录下新建ADSensorSendApp.nc文件,并输入如下代码:第九页,共四十七页。实践4 TinyOS应用开发 10 10#include #include BlinkToRadio.hconfiguration A
5、DSensorSendAppCimplementationcomponents ADSensorSendC; components new AdcC() as ADSensor;components ActiveMessageC;components LedsC;第十页,共四十七页。实践4 TinyOS应用开发 11 11/ADC信息采集配置ADSensorSendC.ADSensorControl - ADSensor;/ADC读取ADSensorSendC.ADSensorRead - ADSensor;components MainC;/启动接口(ji ku)ADSensorSendC.
6、Boot - MainC.Boot;components new TimerMilliC() as SensorTimerC;/定时器ADSensorSendC.SensorTimer - SensorTimerC;components PlatformSerialC;/串口配置ADSensorSendC.StdControl - PlatformSerialC.StdControl;/串口传输第十一页,共四十七页。实践4 TinyOS应用开发 12 12ADSensorSendC.UartStream - PlatformSerialC.UartStream;/LED组件ADSensorSe
7、ndC.Leds-LedsC.Leds;/*射频(sh pn)发送组件*/ADSensorSendC.Packet-ActiveMessageC;ADSensorSendC.AMPacket-ActiveMessageC;ADSensorSendC.AMSend-ActiveMessageC.AMSenduniqueCount(ADRadioSend);ADSensorSendC.AMControl-ActiveMessageC;ADSensorSendC.PacketAcknowledgements-ActiveMessageC;第十二页,共四十七页。实践4 TinyOS应用开发 13 13
8、(2) 创建并编写ADSensorSendC.nc文件。使用EditPlus程序在ADRadioSend目录(ml)下新建ADSensorSendC.nc文件,并输入如下代码:#include “Adc.h”#include “BlinkToRadio.h”#include module ADSensorSendCuses 第十三页,共四十七页。实践4 TinyOS应用开发 14 14interface Boot;interface AdcControl as ADSensorControl;interface Read as ADSensorRead;interface Timer as S
9、ensorTimer;interface Leds;interface Packet;interface AMPacket;interface AMSend;interface SplitControl as AMControl;interface PacketAcknowledgements;第十四页,共四十七页。实践4 TinyOS应用开发 15 15interface StdControl;interface UartStream;implementationuint8_t m_len;uint8_t m_send_buf2;uint16_t counter;message_t pkt;
10、第十五页,共四十七页。实践4 TinyOS应用开发 16 16/*传感器采集任务*/task void sensorTask()/选择P0.7为AD采集通道,call ADSensorControl.enable(ADC_REF_AVDD, ADC_14_BIT, ADC_AIN7);/开始采集AD信息(xnx)call ADSensorRead.read();/*系统启动*/event void Boot.booted()/开启定时器任务第十六页,共四十七页。实践4 TinyOS应用开发 17 17call SensorTimer.startPeriodic(1000);/开启(kiq)ad
11、采集call StdControl.start();/开启(kiq)无线传输call AMControl.start();/*当无线开启(kiq)之后会触发AMControl.startDone事件*/event void AMControl.startDone(error_t err)if(err=SUCCESS)第十七页,共四十七页。实践4 TinyOS应用开发 18 18 /如果开启成功(chnggng),将点亮LED1call Leds.led0On();/call Timer0.startPeriodic(TIMER_PERIOD_MILLI);else/否则重新启动无线call A
12、MControl.start(); 第十八页,共四十七页。实践4 TinyOS应用开发 19 19/定时事件event void SensorTimer.fired()/开启传感器采集(cij)任务post sensorTask();/*ADC读取完毕之后将会触发readDone事件*/event void ADSensorRead.readDone(error_t result, int16_t val)BlinkToRadioMsg *btrpkt;第十九页,共四十七页。实践4 TinyOS应用开发 2020/获得(hud)要发送的信息包btrpkt = (BlinkToRadioMsg*
13、)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)=SUCCESS)call Leds.led1Toggle(); /busy=TRUE; 第二十页,共四十七页。实践4 TinyOS应用开
14、发 21 21async event void UartStream.sendDone(uint8_t *buf, uint16_t len, error_t error)async event void UartStream.receivedByte(uint8_t byte);/* 在接收完receive命令(mng lng)欲接收的长度后会调用此事件 */async event void UartStream.receiveDone(uint8_t *buf, uint16_t len, error_t error)第二十一页,共四十七页。实践4 TinyOS应用开发 2222/*如果发
15、送成功(chnggng),接收者将发送确认帧给发送者*/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文件,并输入如下代码(di m):#ifn
16、def _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程序(chngx)在ADRadioSend目录下创建Mak
17、efile文件,并输入以下内容:COMPONENT=ADSensorSendAppCinclude $(MAKERULES)(5) 编译程序。在Cygwin下,保证工作目录为ADRadioSend,输入“$ make cc2530”命令进行编译,编译完成后如图S4-4所示。第二十五页,共四十七页。实践4 TinyOS应用开发 2626图S4-4 编译(biny)ADRadioSend程序 第二十六页,共四十七页。实践4 TinyOS应用开发 27273接收程序编写接收程序编写接收程序的编写需要完成以下几项工作(gngzu):(1) 创建并编写ADSensorReceiveApp.nc文件。使用
18、EditPlus程序在ADRadioReceive目录下新建ADSensorReceiveApp.nc文件,并输入如下代码:#include #include “BlinkToRadio.h”configuration ADSensorReceiveAppC第二十七页,共四十七页。实践4 TinyOS应用开发 2828implementationcomponents ADSensorReceiveC; components ActiveMessageC;components new AMReceiverC(AM_BLINKTORADIO);components LedsC;components
19、 MainC;ADSensorReceiveC.Boot - MainC.Boot;components new TimerMilliC() as SensorTimerC;ADSensorReceiveC.SensorTimer - SensorTimerC;components PlatformSerialC;ADSensorReceiveC.StdControl - PlatformSerialC.StdControl;ADSensorReceiveC.UartStream - PlatformSerialC.UartStream;ADSensorReceiveC.Leds-LedsC.
20、Leds;ADSensorReceiveC.AMControl-ActiveMessageC;ADSensorReceiveC.Receive-ActiveMessageC.ReceiveuniqueCount(ADRadioReceive);第二十八页,共四十七页。实践4 TinyOS应用开发 2929(2) 创建并编写ADSensorReceiveC.nc文件。使用EditPlus程序在ADRadioReceive目录(ml)下新建ADSensorReceiveC.nc文件,并输入如下代码:#include “BlinkToRadio.h”#include module ADSensorR
21、eceiveCuses interface Boot;第二十九页,共四十七页。实践4 TinyOS应用开发 3030interface Timer as SensorTimer;interface Leds;interface Packet;interface AMPacket;interface SplitControl as AMControl;interface Receive;interface StdControl;interface UartStream;implementation第三十页,共四十七页。实践4 TinyOS应用开发 31 31uint8_t m_len;uint8
22、_t m_send_buf2;uint16_t counter;message_t pkt;event void Boot.booted()/开启定时器任务(rn wu)call SensorTimer.startPeriodic(1000);/开启无线传输call AMControl.start();第三十一页,共四十七页。实践4 TinyOS应用开发 3232/*当无线开启之后会触发(chf)AMControl.startDone事件*/event void AMControl.startDone(error_t err)if(err=SUCCESS) /如果开启成功,将点亮LED1cal
23、l Leds.led0On();else/否则重新启动无线call AMControl.start(); 第三十二页,共四十七页。实践4 TinyOS应用开发 3333/定时(dn sh)事件event void SensorTimer.fired()async event void UartStream.sendDone(uint8_t *buf, uint16_t len, error_t error)第三十三页,共四十七页。实践4 TinyOS应用开发 3434async event void UartStream.receivedByte(uint8_t byte);/* 在接收完re
24、ceive命令欲接收的长度后会调用(dioyng)此事件 */async event void UartStream.receiveDone(uint8_t *buf, uint16_t len, error_t error)第三十四页,共四十七页。实践4 TinyOS应用开发 3535/*数据接收事件(shjin),接收者接收到发送者发送的信息后,将数据发送通过串口发送至上位机*/event message_t* Receive.receive(message_t* msg,void *payload,uint8_t len)/判断接收到数据的帧长度if(len=sizeof(BlinkTo
25、RadioMsg)/将负载取出来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;/通过(tnggu)串口发送至PC机call UartStream.send(m_send_buf, 2);/LED3闪烁call Leds.led2Toggle();ret
26、urn 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/定时事件(shjin)TIMER_PERIOD_MILLI = 2000;/*接收数据结构体*/typedef n
27、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,然后(rnhu)输入“$ make cc2530”
28、命令进行编译,编译完成后如图S4-5所示。第三十九页,共四十七页。实践4 TinyOS应用开发 4040图S4-5 编译(biny)ADRadioReceive程序 第四十页,共四十七页。实践4 TinyOS应用开发 41 414实验现象实验现象程序编译完成之后,将发送程序和接收程序分别下载至节点1和节点2,按下复位按键,开始数据(shj)的传输,并通过串口传输到PC机,通过PC机可以观察到采集的光照信息值,如图S4-6所示。第四十一页,共四十七页。实践4 TinyOS应用开发 4242图S4-6 采集的光照(gungzho)信息 第四十二页,共四十七页。实践4 TinyOS应用开发 4343
29、使用ZigbeeSniffer捕获(bhu)的数据如图S4-7所示。图S4-7 收发(shuf)的数据 第四十三页,共四十七页。实践4 TinyOS应用开发 4444知识拓展知识拓展 HDLC帧格式帧格式高级数据链路控制(High-Level Data Link Control或简称(jinchng)HDLC),是一个在同步网上传输数据、面向比特的数据链路层协议,它是由国际标准化组织(ISO)根据IBM公司的SDLC(Synchronous Data Link Control)协议扩展开发而成的。HDLC数据帧格式由以下三部分组成:起始标志:采用固定的帧间隔符“01111110”,即0 x7e
30、。要传输的数据模块:即要传输的数据帧载荷。结束标志:采用和起始标志一样的帧间隔符。第四十四页,共四十七页。实践4 TinyOS应用开发 4545因此在HDLC规程中,帧与帧之间用0 x7e分隔,数据帧构成了通信双方交换的最小单位,并且在数据帧的载荷(zi h)部分还使用了转义字符,即如果数据帧的载荷(zi h)部分中出现了0 x7e将会被转义为0 x7d 0 x5e;如果数据帧中出现了0 x7d将会被转义为0 x7d 0 x5d。HDLC作为面向比特的数据链路控制协议的典型,具有如下特点:协议不依赖于任何一种字符编码集。数据报文可透明传输,用于实现透明传输的“0比特插入法”易于硬件实现。第四十
31、五页,共四十七页。实践4 TinyOS应用开发 4646全双工通信,不必等待确认便可连续发送数据,有较高的数据链路传输效率。所有帧均采用CRC校验,对信息帧进行编号,可防止漏收或重份,传输可靠性高。传输控制功能与处理功能分离,具有较大的灵活性和较完善的控制功能。由于以上特点,目前网络设计普遍使用(shyng)HDLC作为数据链路协议。第四十六页,共四十七页。内容(nirng)总结实践4 TinyOS应用(yngyng)开发。components new TimerMilliC() as SensorTimerC。interface AdcControl as ADSensorControl。interface Timer as SensorTimer。interface SplitControl as AMControl第四十七页,共四十七页。