第四章 基本操作_第1页
第四章 基本操作_第2页
第四章 基本操作_第3页
第四章 基本操作_第4页
第四章 基本操作_第5页
已阅读5页,还剩61页未读, 继续免费阅读

下载本文档

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

文档简介

第四章基本操作第四章基本操作点对点的无线通信节点与PC的串口通信传感存储1、点对点的无线通信介绍TinyOS系统的通信模块,熟悉TinyOS中支持通信的接口和组件。使用message_t类型数据(即TinyOS2.x的消息缓冲区)发送一条消息缓冲到无线电。从无线电接收一条消息缓冲。1.1主动消息概述主动消息模式是一个面向消息通信的高性能高性能通信模式主动消息的设计和实现主动消息的缓存管理机制保存一个固定尺寸且预先分配的缓存队列主动消息的显式确认机制每次消息发送后,接受方发送有一个同步的确认信息1.2通信接口和组件TinyOS提供了很多的接口来抽象底层的通信服务,以及提供或实现这些接口的组件。所有的接口和组件使用了一个共同的消息缓冲抽象,称为message_t.message_t可以通过nesC的结构体来实现(类似于C语言中的结构体struct)。message_t的成员是不透明的,因此不能直接访问。

基本通信接口Packet:提供了对message_t抽象数据类型的基本访问。这个接口的命令有:清空消息内容,获得消息的有效载荷区长度,获得消息有效载荷区的指针。Send:提供基本的自由地址的消息发送接口。这个接口提供的命令有:发送消息,取消未成功发出的消息。接口还提供了事件来指示一条消息是否成功发送。它也提供了一些便利的函数,来获得消息的最大有效载荷区长度以及消息有效载荷区的指针。Receive:提供最基本的消息接收接口。这个接口提供了接收消息后的事件。它也提供了些命令,可以方便地获得消息的有效载荷区长度以及消息有效载荷区的指针。PacketAcknowledgements:提供了一种机制来要求对每个信息包的确认。RadioTimeStamping:为无线电发射和接受提供时间标记信息。主动消息接口由于经常有多个服务需要使用相同的无线电来交流,TinyOS提供了活动消息(activemessage,缩写AM)来实现多渠道访问无线电。AMtype在功能上类似于以太网的数据帧、IP协议以及UDP端口,所有这些都是为了达到多路访问一个通信服务的目的。AMPacket:类似Packet,提供对message_t抽象数据类型的基本的AM访问。这个接口提供的命令有:获得节点的AM地址,AM信息包的目标地址以及AM信息包的类型。除此之外还有,设置AM信息包目标地址和类型,检查目标地址是否为本地节点。AMSend:类似Send,提供了基本的活动消息发送接口。AMSend与Send之间的关键区别是,AMSend在其发送命令里带有AM目标地址参数。组件AMReceiverC:Receive,Packet,andAMPacket.AMSenderC:AMSend,Packet,AMPacket,PacketAcknowledgementsasAcks.AMSnooperC:Receive,Packet,andAMPacket.AMSnoopingReceiverC:Receive,Packet,andAMPacket.ActiveMessageAddressC:提供了获得和设定节点活动消息地址的的命令。这个接口不能作为一般使用,修改活动消息地址可能破坏网络堆栈,所以尽量不要使用,除非程序员非常清楚自己在做什么。封装TinyOS支持多平台,每个平台都可以实现对无线电的驱动。所有平台的无线驱动统一封装为ActiveMessageC组件。ActiveMessageC组件可以实现接口与底层特定硬件的连接。提供了1.2节提到的大多数通信接口。ActiveMessageC(eyesIFX平台)由Tda5250ActiveMessageC组件实现;ActiveMessageC(intelmote2,micaz,telosa和telosb平台)由CC2420ActiveMessageC组件实现;ActiveMessageC(mica2平台)由CC1000ActiveMessageC组件实现。1.3tinyos2.x消息缓冲抽象Tinyos2.x用message_t代替了tinyos1.x的TOS_Msg,作为底层数据结构。tos/types/message.htypedefnx_structmessage_t{nx_uint8_theader[sizeof(message_header_t)];

nx_uint8_tdata[TOSH_DATA_LENGTH];//有效载荷区nx_uint8_tfooter[sizeof(message_footer_t)];

nx_uint8_tmetadata[sizeof(message_metadata_t)];}message_t;注意:header,footer,metadata都是不透明的,不能直接访问。值得注意的是,要访问message_t必须通过Packet,AMPacket和其他的一些接口,将会在下面的BlinkToRadio实例里演示。1.4通过无线电发送消息将编写一个简单的应用程序,一个定时器,一个计数值,用无线电发送这个计数值。另一个节点接收无线电显示计数值在LED上。修改Blink为BlinkToRadio。创建BlinkToRadio文件夹编写BlinkToRadioC.nc文件编写BlinkToRadio.h头文件编写BlinkToRadioAppC.Nc配件编写makefile文件定义消息结构不能直接用数据读写message_t的有效载荷区,而是使用一种结构体去操纵有效载荷区,结构如下:typedefnx_structBlinkToRadioMsg{nx_uint16_tnodeid;nx_uint16_tcounter;}BlinkToRadioMsg;在类型名字前的nx_前缀(如nx_uint16_t)指出将以大字端字节序的格式排序。相反,nxle_前缀则是小字端格式。无线电发送消息STEP1:首先需要认识一些接口和组件,它们能提供对无线电访问,并允许操作message_t数据类型。STEP2:接下来必须修改BlinkToRadioC.nc中的规范说明,增加uses所需接口的语句。moduleBlinkToRadioC{...usesinterfacePacket;usesinterfaceAMPacket;usesinterfaceAMSend;usesinterfaceSplitControlasAMControl;}STEP3:需要声明新的变量,增加这些接口和组件的初始化和开始/停止的代码。implementation{boolbusy=FALSE;message_tpkt;...}

eventvoidBoot.booted(){callAMControl.start();}

eventvoidAMControl.startDone(error_terr){if(err==SUCCESS){callTimer0.startPeriodic(TIMER_PERIOD_MILLI);}else{callAMControl.start();}}eventvoidAMControl.stopDone(error_terr){}STEP4:增加针对这些接口的所需命令。eventvoidTimer0.fired(){...if(!busy){BlinkToRadioMsg*btrpkt=(BlinkToRadioMsg*)(callPacket.getPayload(&pkt,NULL));

btrpkt->nodeid=TOS_NODE_ID;

btrpkt->counter=counter;if(callAMSend.send(AM_BROADCAST_ADDR,&pkt,sizeof(BlinkToRadioMsg))==SUCCESS){busy=TRUE;}}}STEP5:实现这些使用到的接口的事件。

STEP6:对配件BlinkToRadioAppC.nc里的实现部分进行修改,增加相关组件的声明。

eventvoidAMSend.sendDone(message_t*msg,error_terror){

if(&pkt==msg){busy=FALSE;}}implementation{...componentsActiveMessageC;componentsnewAMSenderC(AM_BLINKTORADIO);...}STEP7,在配件里连接从使用者到提供者的所有接口。implementation{...componentsBlinkToRadioCasApp;...App.Packet->AMSenderC;App.AMPacket->AMSenderC;App.AMSend->AMSenderC;App.AMControl->ActiveMessageC;}1.5通过无线电接收消息STEP1:认识相关的组件与接口。STEP2:更新BlinkoRadioC.nc里的module区,增加所需接口的uses陈述。moduleBlinkToRadioC{...usesinterfaceReceive;}STEP3:声明新变量,增加所需初始化代码。STEP4:增加相关程序逻辑和命令。消息的接收是一个事件驱动的过程,故不需要调用命令。STEP5:实现相关的事件处理程序(非初始化)。eventmessage_t*Receive.receive(message_t*msg,void*payload,uint8_tlen){if(len==sizeof(BlinkToRadioMsg)){BlinkToRadioMsg*btrpkt=(BlinkToRadioMsg*)payload;callLeds.set(btrpkt->counter);}returnmsg;}

STEP6:修改配件里的implementation区,增加相应的组件说明。STEP7:连接接口,从使用者到提供者。implementation{...componentsnewAMReceiverC(AM_BLINKTORADIO);...}implementation{...App.Receive->AMReceiverC;}

STEP8:应用程序的实际测试。2、节点与PC的串口通信介绍信息包源的概念如何测试串口,监听工具Listen如何使用PC和节点通信MIG消息接口生成工具SerialForwarder工具TinyOS打印库常见的串口通信故障2.1信息源和端口测试节点与电脑(mote-PC)通信的基本抽象就是信息源(packetsource)。信息源的确切定义是:信息包源是一种通信媒介,应用程序可以通过它接收来自节点的信息包,也可以发送信息包到节点。大多数的TinyOS通信工具带有–comm的选项参数,可以允许用一个字符串指明信息包源。例如:

javanet.tinyos.tools.Listen-commserial@COM1:micaz串口测试先下载apps/tests/TestSerial应用程序到节点上。每秒发送信息包到电脑的串口,当节点通过串口接收到来自电脑的信息包时,则把信息包的顺序号显示在LED灯上。下载之后,运行Java程序TestSerial,可以用它来和串行口通信,它会显示电脑从串口接收到的信息包,并把接收到的信息包原样的发送回去。这时节点接收到信息包并在LED上显示。$javaTestSerial–commserial@COM7:micaz串口的语法如果没有指明正确的端口,可能无法连接。串口设置的语法如下:serial@<PORT>:<SPEED>PORT取决于平台,如果是Windows/Cygwin平台,则使用COMN,

而如果是Linux/Unix平台,则使用/dev/ttyS

N。速度SPEED既可以是数字值,也可以是节点平台的名字。

PlatformSpeed(baud)telos115200telosb115200tmote115200micaz57600mica257600iris57600mica2dot19200eyes115200intelmote2115200这些特定平台速率的映射关系的定义在:support/sdk/java/net/TinyOS/packet/BaudRate.java2.2基站BaseStation与监听工具基站是TinyOS中一个基本的应用程序。它在串行口和无线电网络之间扮演了桥梁的角色。准备两个micaz节点:BlinkToRadio:定时触发把计数值发到无线电。BaseStation:接收无线电,发送到串口。PC端java工具Listen:把监听得的信息二进制打印。javanet.TinyOS.tools.Listen–comm+端口信息包格式每个来自节点的信息包包含了很多数据区域。第1个字节(00)指明这个信息包是AM类型。接下去就是一般的活动消息区,剩下的就是消息的有效载荷区域,在BlinkToRadio.h文件里定义:typedefnx_structBlinkToRadioMsg{nx_uint16_tnodeid;

nx_uint16_tcounter;

}BlinkToRadioMsg;destaddr

linksourceaddr

msglen

groupID

handlerID

Nodeid

counter

ffff000404000600040001目标地址(2bytes)链路层源地址(2bytes)消息包长度(1byte)网络组号(1byte)AM层类型(1byte)有效载荷区(默认最大28bytes)00FFFFFFFF040006000400012.3MIG消息接口生成工具Listen工具是与节点通信最基本的方式,它仅仅打印出二进制数据包到屏幕。显然,该工具不易使传感器的数据可视化。使用mig工具去构建一个针对消息结构的java,python或者C接口,会自动地分解信息包中的每一个域。详见BlinkToRadio下的makefile文件。javanet.tinyos.tools.MsgReaderBlinkToRadioMsg–comm+端口javanet.tinyos.tools.MsgReaderBlinkToRadioMsg–comm+端口2.4SerialForwarder工具直接使用串行口的问题是:只有一个PC程序可以与节点交互。必须在真正与节点有物理连接的PC上运行应用程序。SerialForwarder工具可去除这些局限性。它打开信息包源,让众多应用程序通过TCP/IP流连接到信息源并使用它。例如,运行SerialForwarder,它的信息包源是串行口;而应用程序连接到SerialForwarder,而不是直接连接的串行口,SerialForwarder扮演了一个代理读写信息包的角色。SerialForwarder源语法:sf@HOST:PORT //默认是本地localhost和9002

sf@:1948连接到运行在名为dark.cs.berkeley的计算机上的SerialForwarder,其端口为1948。例子:第1步是先运行SerialForwarder,以串行口作为信息包来源,并作为sf源输出。javanet.tinyos.sf.SerialForwarder–commserial@COM7:micaz打开了第2个SerialForwarder应用,它的信息源是第1个SerialForwarderjavanet.TinyOS.sf.SerialForwarder-port9003-commsf@localhost:9002关闭第2个SerialForwarder(那个服务器端口9003的SerialForwarder)。再次运行MsgReader,但这回让它连接SerialForwarder:javanet.TinyOS.tools.MsgReaderBlinkToRadioMsg-commsf@localhost:9002这时,会看到SerialForwarder的客户数增加了,并且MsgReader开始打印信息包,代码如下:2.5在TinyOS中发送信息包到串口

在TinyOS中发送AM信息包到串行口与发送到无线电非常相似。一个组件使用AMSend接口,调用命令AMSend.send,还有事件句柄AMSend.sendDone。串行堆栈(serialstack)将发送信息到串口,不必去理会指明的AM地址。Serial

Radio

SerialActiveMessageCActiveMessageCSerialAMSenderCAMSenderCSerialAMReceiverCAMReceiverC由于串口AM通信和无线电AM通信有一样的接口,在大多数情况下只要稍作修改就可以使用了。例如,修改BlinkToRadio发送信息包到串口而不是无线电,需要对BlinkToRadioAppC配件做如下修改:

RadioSerialcomponentsActiveMessageC;componentsnewAMSenderC(AM_BLINKTORADIOMSG);BlinkToRadioC.AMSend->AMSenderC;BlinkToRadioC.AMControl->ActiveMessageC;componentsSerialActiveMessageC;componentsnewSerialAMSenderC(AM_BLINKTORADIOMSG);BlinkToRadioC.AMSend->SerialAMSenderC;BlinkToRadioC.AMControl->SerialActiveMessageC;2.6TinyOS打印库TinyOS打印库(printflibrary):把调试信息从运行在节点上的TinyOS应用程序发送到PC显示屏上。TinyOS应用程序的调试工作非常不便。TOSSIM仿真只能在PC上确认程序的逻辑功能。一旦运行在真实硬件上,不可预知的问题非常之多且难以避免。仅仅依靠节点上的三位LED灯来跟踪程序的运行,显然是不够的。最佳的解决方法就是在屏幕终端打印调试信息。简介printf库提供了一种终端打印功能。把节点连接到PC机的串口,调用打印命令(其语法风格同C语言),就可以在屏幕终端打印出调试信息。开发者只需:包含PrintfC组件到顶层配件。在任何调用printf()命令的组件里包含“printf.h”头文件。当前,TinyOS的printf库只支持MSP430平台和Atmega128平台,比如Mica2、MicaZ、Telos及EyesIFX等。打印库的组成整个打印库由4个位于tos/lib/printf中的文件组成:一个模块、一个配件、一个接口以及一个头文件。MainC.nc:系统组件MainC的副本,可以自动地链接打印系统;PrintfC.nc:为TinyOS程序提供打印功能的配件;PrintfP.nc:实现打印功能的模块;printf.h:头文件,指明打印消息的格式和刷新缓冲的大小。请注意:在任何TinyOS应用程序里,只需简单地包含printf.h头文件,就可以调用printf命令和printfflush命令实现打印功能。MainC组件PrintfC组件相关命令函数开发者以分布的方式在TinyOS应用程序的组件里提供字符串到printf()命令。这些字符串缓冲在PrintfP组件的一个中心位置,然后通过printfflush()命令以TinyOS串口消息的形式刷新到PC上。printf()和printfflush()命令可以用C的形式调用,只需简单地包含“printf.h”头文件。刷新命令printfflush()默认的缓冲大小是250个字节(可通过makefile修改)。当已缓冲达一半以上就会自动地刷新,也可以直接通过printfflush()命令实现刷新。自动刷新可以满足大多数应用程序的要求,但当那些程序的

温馨提示

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

评论

0/150

提交评论