版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章第六章 基于基于TinyOS的的传感网应用开发传感网应用开发主要内容主要内容n6.1 典型的无线传感网开发套件典型的无线传感网开发套件n6.2 nesC语言基础语言基础n6.3 TinyOS操作系统操作系统n6.4 TinyOS开发环境搭建开发环境搭建n6.5 简单无线测试简单无线测试n6.6 简单数据分发简单数据分发n6.7 简单数据汇聚简单数据汇聚n6.8 TinyOS仿真平台仿真平台TOSSIMn6.9 本章小结与进一步阅读的文献本章小结与进一步阅读的文献6.1.1 MICA系列节点系列节点nMICA系列节点是由美国加州大学伯克利分校研系列节点是由美国加州大学伯克利分校研究,究,C
2、rossbow公司生产的无线传感器节点,是目公司生产的无线传感器节点,是目前无线传感器网络节点的典型代表之一。前无线传感器网络节点的典型代表之一。nMICA系列节点包括系列节点包括WeC、Renee、MICA、MICA2、MICA2Dot、MICAz。WeC、Renee和和MICA节点均采用节点均采用TR1000射频芯片,射频芯片,MICA2和和MICA2Dot采用采用CC1000射频芯片,射频芯片,MICAz节点采节点采用用CC2420的的Zigbee芯片。芯片。6.1.1 MICA系列节点系列节点图6-1 MICA系列节点的组网示意图6.1.1 MICA系列节点系列节点图6-3 MICAz
3、系列MPR2400的实物图6-4(a)多传感器模块MTS300/31(b)MTS510的实物图6-2 MICA2系列MPR4x0(左上)和MICA2Dot系列MPR5x0(右下)的实物6.1.1 MICA系列节点系列节点图6-5 串行网关MIB510的实物图6-6 Stargate网关SPB400的实物n MICA系列节点均采用处理器外接射频系列节点均采用处理器外接射频芯片的硬件设计方案,与射频处理器芯片的硬件设计方案,与射频处理器IC(如(如TI公司公司CC2530)相比,)相比,MICA分立分立的硬件设计架构具有处理能力强、可扩的硬件设计架构具有处理能力强、可扩展性好以及功能灵活等优点,不
4、足为体展性好以及功能灵活等优点,不足为体积较大、可能会产生接口兼容等问题。积较大、可能会产生接口兼容等问题。6.1.2 MICA系列处理器系列处理器/射频板射频板n Atmega128L微处理器微处理器先进的先进的RISCRISC架构架构128KB Flash128KB Flash、4KB EEPROM4KB EEPROM、4KB SRAM4KB SRAM5353个可配置个可配置I/OI/O引脚引脚支持多种外部通信接口支持多种外部通信接口低功耗低功耗自带自带JTAGJTAG接口接口工作电压范围宽工作电压范围宽6.1.2 MICA系列处理器系列处理器/射频板射频板n MICA节点的无线通信射频芯
5、片采用节点的无线通信射频芯片采用Chipcon公司的公司的CCXXXX系列射频产品系列射频产品。该系列产品是专门为低功耗、低速率。该系列产品是专门为低功耗、低速率的无线传感器应用开发的。的无线传感器应用开发的。6.1.2 MICA系列处理器系列处理器/射频板射频板n CC2420射频板射频板2.4GHz IEEE 802.15.42.4GHz IEEE 802.15.4标准标准1616个可用信道个可用信道数据速率数据速率250Kb/s250Kb/sO-QPSKO-QPSK调制方式调制方式超低电流消耗超低电流消耗高接收灵敏度高接收灵敏度较强的抗邻频道干扰能力较强的抗邻频道干扰能力工作电压低工作电
6、压低输出功率可控输出功率可控硬件实现部分硬件实现部分MACMAC层功能层功能6.1.2 MICA系列处理器系列处理器/射频板射频板nMICA系列传感器板是较早实现商用的无线传感系列传感器板是较早实现商用的无线传感器节点部件,它的电路原理图设计是公开的。这器节点部件,它的电路原理图设计是公开的。这里简要介绍部分主要的电路设计内容。里简要介绍部分主要的电路设计内容。 传感器电源供电电路传感器电源供电电路 温湿度和照度检测电路温湿度和照度检测电路 磁性传感器电路磁性传感器电路6.1.3 MICA系列传感板系列传感板nMICA系列节点在很大程度上是作为教学和研究试验使用系列节点在很大程度上是作为教学和
7、研究试验使用的,人们通过在由多个的,人们通过在由多个MICA节点组成的实验床验证自己节点组成的实验床验证自己的算法和体验多跳自组网的特性。为了方便开发,的算法和体验多跳自组网的特性。为了方便开发,Crossbow公司开发了一系列的编程调试工具,比较常见公司开发了一系列的编程调试工具,比较常见的是的是MIB510和和MIB600接口板。接口板。6.1.4 MICA系列编程调试接口板系列编程调试接口板图6-8 MIB510的连线和节点的装配6.1.5 国内外其他典型的无线传感网节点国内外其他典型的无线传感网节点图6-9 Smart Dust系列节点 图6-10 Tmote系列节点 图6-11 In
8、tel Mote系列节点图6-12 GAINS系列节点 图6-13 UbiCell系列节点图6-14 NPUMOTE系列节点6.1.5 国内外其他典型的无线传感网节点国内外其他典型的无线传感网节点nNPUMOTE系列传感器节点由西北工业大学计算机学院无系列传感器节点由西北工业大学计算机学院无线传感器网络实验室研发,目前已发展到第三个版本。该线传感器网络实验室研发,目前已发展到第三个版本。该系列传感器节点采用了系列传感器节点采用了AVR 8位单片机系列中较高端的位单片机系列中较高端的Atmega128rfa1芯片作为处理器,芯片作为处理器,该处理器该处理器采用先进的采用先进的RISC架构,并且集
9、成了符合架构,并且集成了符合IEEE 802.15.4标准的射频收标准的射频收发器,性能与独立的射频芯片发器,性能与独立的射频芯片AT86RF230相当。该系列节相当。该系列节点所设计的点所设计的USB接口不仅可以与主机进行通信,还可以通接口不仅可以与主机进行通信,还可以通过同一个过同一个USB接口进行程序的下载,大大方便了用户的使接口进行程序的下载,大大方便了用户的使用用。n6.2.1 简介简介n6.2.2 术语术语n6.2.3 接口接口n6.2.4 组件组件n6.2.5 模块模块n6.2.6 配件配件6.2 nesC语言基础语言基础nnesC是对是对C语言的扩展,它是基于体现语言的扩展,它
10、是基于体现TinyOS的的结构化模型和基于事件的执行模型而设计的结构化模型和基于事件的执行模型而设计的。程序构造与程序组合相分离的机制程序构造与程序组合相分离的机制组件的行为规范由一组接口来定义组件的行为规范由一组接口来定义接口具有双向性接口具有双向性组件通过接口彼此静态地相连组件通过接口彼此静态地相连6.2.1 nesC简介简介6.2.1 nesC简介简介图6-15基于nesC语言的一般应用程序框架6.2.1 nesC简介简介图6-16顶层配件、核心处理模块以及其它组件的关系n对于每一个具体的程序而言,通常由顶层配件(对于每一个具体的程序而言,通常由顶层配件(top-level config
11、uration)、核心处理模块和其他)、核心处理模块和其他组件组成。组件组成。6.2.1 nesC术语术语图6-17 配件中的概念6.2.1 nesC术语术语图6-18 模块中的概念6.2.3 nesC接口接口n nesC的接口实际上是一系列声明的有名函的接口实际上是一系列声明的有名函数集合,是连接不同组件的纽带。接口具数集合,是连接不同组件的纽带。接口具有双向性,是提供者组件和使用者组件之有双向性,是提供者组件和使用者组件之间的多功能的交互通道。间的多功能的交互通道。接口提供者实现了接口的一组功能,称接口提供者实现了接口的一组功能,称为为命令命令;接口使用者同样需要实现一组功能函数,接口使用
12、者同样需要实现一组功能函数,称为称为事件事件。6.2.3 nesC接口接口n 事件回调机制能有效提高系统运行效率。事件回调机制能有效提高系统运行效率。图6-19 组件接口6.2.3 nesC接口接口n接口由接口由interface类型定义,类型定义,interface语法定义如下:语法定义如下:nesC-file:nesC-file: includes-listopt interface includes-listopt interface interface:interface: interface identifier declaration-list interface identifi
13、er declaration-list storage-class-specifier: also one of command event async storage-class-specifier: also one of command event async6.2.3 nesC接口接口n 接口示例接口示例n 带参数接口示例带参数接口示例interface AMSend interface AMSend command error_t send(am_addr_t addr, message_t command error_t send(am_addr_t addr, message_t
14、* * msg, uint8_t len); msg, uint8_t len); command error_t cancel(message_t command error_t cancel(message_t* * msg); msg); event void sendDone(message_t event void sendDone(message_t* * msg, error_t error); msg, error_t error); command uint8_t maxPayloadLength(); command uint8_t maxPayloadLength();
15、command void command void* * getPayload(message_t getPayload(message_t* * msg, uint8_t len); msg, uint8_t len); interface Readinterface Readcommand error_t read();command error_t read();event void readDone( error_t result,val_t val );event void readDone( error_t result,val_t val ); 带参数的接口在连接时注意类型匹配带
16、参数的接口在连接时注意类型匹配6.2.4 nesC组件组件n任何一个任何一个nesC应用程序都是应用程序都是由由一个或多一个或多个组件连接起来的,从而形成一个完整个组件连接起来的,从而形成一个完整的可执行程序。的可执行程序。n在在nesC中有两种类型的组件中有两种类型的组件模块模块(modulemodule)配件配件(configurationconfiguration)6.2.4 nesC组件组件n 组件语法定义:组件语法定义:nesC-file:nesC-file:includes-listopt moduleincludes-listopt moduleincludes-listopt
17、configurationincludes-listopt configurationmodule:module:module identifier specification module-implementationmodule identifier specification module-implementationconfiguration:configuration:configuration identifier specification configuration-implementationconfiguration identifier specification con
18、figuration-implementation6.2.4 nesC组件组件n 组件规范语法定义:组件规范语法定义:specification:specification: uses-provides-list uses-provides-list uses-provides-list:uses-provides-list:uses-providesuses-providesuses-provides-list uses-providesuses-provides-list uses-providesuses-provides:uses-provides:uses specification
19、-element-listuses specification-element-listprovides specification-element-listprovides specification-element-listspecification-element-list:specification-element-list:specification-elementspecification-element specification-elements specification-elements specification-elements:specification-elemen
20、ts:specification-elementspecification-elementspecification-elements specification-elementspecification-elements specification-element6.2.4 nesC组件组件n 接口实例接口实例 interface X as Yinterface X as Yn 参数化接口参数化接口 interface SendMsguint8_t idinterface SendMsguint8_t id6.2.4 nesC组件组件n 组件规范的示例:组件规范的示例:configurati
21、on GenericCommconfiguration GenericCommprovidesprovidesinterface StdControl as Control;interface StdControl as Control;interface SendVarLenPacket;interface SendVarLenPacket;/该接口以当前消息序号作参数该接口以当前消息序号作参数interface SendMsguint8_t id;interface SendMsguint8_t id;interface ReceiveMsguint8_t id;interface Rec
22、eiveMsguint8_t id; usesusesevent result_t sendDone(); /event result_t sendDone(); /发送完成之后为组件作标记发送完成之后为组件作标记 6.2.4 nesC组件组件n在组件在组件K的规范中提供的命令(或事件)的规范中提供的命令(或事件)F称为称为K所提供所提供的命令(或事件)的命令(或事件)F;同样地,组件;同样地,组件K的规范中使用的命的规范中使用的命令(或事件)令(或事件)F称为称为K所使用的命令(或事件)所使用的命令(或事件)F。n组件组件K提供的接口实例提供的接口实例X中的命令中的命令F称为称为K所提供的命
23、令所提供的命令X.F;组件;组件K使用的接口实例使用的接口实例X中的命令中的命令F称为称为K所使用的所使用的命令命令X.F;组件;组件K提供提供的接口实例的接口实例X中的事件中的事件F称为称为K所所使使用用的事件的事件X.F;组件;组件K使用使用的接口实例的接口实例X中的事件中的事件F称为称为K所所提供提供的事件的事件X.F(注意由接口的双向性所引起的提供事(注意由接口的双向性所引起的提供事件和使用事件的双向性)。件和使用事件的双向性)。6.2.4 nesC组件组件n 通用组件通用组件 关键字关键字genericgeneric 组件名后必须带有参数列表组件名后必须带有参数列表6.2.4 nes
24、C模块模块n模块提供了接口代码的实现并且分配组件模块提供了接口代码的实现并且分配组件内部状态,是组件内部行为的具体实现。内部状态,是组件内部行为的具体实现。n模块定义语法:模块定义语法:module-implementation:module-implementation:implementation translation-unit implementation translation-unit 6.2.4 nesC模块模块n 命令是在接口中的一种函数,这种函数要命令是在接口中的一种函数,这种函数要求接口的提供者实现,而接口的使用者则求接口的提供者实现,而接口的使用者则会调用这种函数。形象的
25、称为会调用这种函数。形象的称为command,即为接口提供的可供调用的命令。即为接口提供的可供调用的命令。n 语法结构类语法结构类C语言,只是在最前面增加语言,只是在最前面增加command关键字。关键字。6.2.4 nesC模块模块n 命令的实现:命令的实现:module M1provides interface A1;implementationcommand int A1.cmd1(int arg)6.2.4 nesC模块模块n 命令的使用:命令的使用:module M2uses interface A1;implementationint ret = call A1.cmd1(0 x1
26、1);6.2.4 nesC模块模块n 事件是在接口中的一种函数,这种函数要事件是在接口中的一种函数,这种函数要求接口的提供者调用,而接口的使用者则求接口的提供者调用,而接口的使用者则会实现这种函数。形象的称为会实现这种函数。形象的称为event,即为,即为接口使用者所实现的事件处理函数。接口使用者所实现的事件处理函数。n 语法结构类语法结构类C语言,只是在最前面增加语言,只是在最前面增加event关键字。关键字。6.2.4 nesC模块模块n 事件的实现:事件的实现:module M1provides interface A1;implementationpost A1.event1(0 x1
27、, 0 x2); /* 发出对应的事件,实际上类同于调用事件处理函数发出对应的事件,实际上类同于调用事件处理函数 */6.2.4 nesC模块模块n 事件的使用:事件的使用:module M2uses interface A1;implementationevent void A1.event1(int arg1, int arg2)接口使用者必须实现接口使用者必须实现event的具体内容,如同事件处理函数一的具体内容,如同事件处理函数一样。样。6.2.4 nesC模块模块n 任务是任务是TinyOS系统提供的一种特殊的机制,系统提供的一种特殊的机制,类同于线程。类同于线程。n task一般为
28、一个函数,无参数,无返回值。一般为一个函数,无参数,无返回值。n task可以在一般的可以在一般的TinyOS程序中发出,而程序中发出,而task的执行是由的执行是由TinyOS系统内核来实现的。系统内核来实现的。并且并且task的执行是不影响调用者的,将会的执行是不影响调用者的,将会在发出在发出task后的某一个时刻被调度运行后的某一个时刻被调度运行6.2.4 nesC模块模块n task的特点:的特点: 无参数、无返回值无参数、无返回值 系统会按特定的顺序调度这些系统会按特定的顺序调度这些tasktask tasktask间不能抢占,但是可以被中断所抢占间不能抢占,但是可以被中断所抢占 在
29、在tasktask未执行时,发出多少个未执行时,发出多少个tasktask,都将只运,都将只运行一次这个行一次这个tasktask 系统执行完一个系统执行完一个tasktask后才会去执行其它后才会去执行其它tasktask,所以所以tasktask一般要求短小,不至于影响其它一般要求短小,不至于影响其它tasktask6.2.4 nesC模块模块n task的定义:一般也是放在的定义:一般也是放在module中中module M1implementationtask void task1()void f1()post task1();6.2.4 nesC模块模块n 通用模块通用模块 type
30、deftypedef关键字的使用关键字的使用 newnew关键字的使用关键字的使用6.2.6 nesC配件配件n 配件用于实现不同组件的接口之间的连接配件用于实现不同组件的接口之间的连接的组件,它把多个组件连接在一起从而形的组件,它把多个组件连接在一起从而形成一个新的组件,而且它也可以导出接口成一个新的组件,而且它也可以导出接口(另一种形式的连接)。(另一种形式的连接)。n 配件定义语法:配件定义语法:configuration:configuration:configuration identifier specification configuration-implementationco
31、nfiguration identifier specification configuration-implementationconfiguration-implementationconfiguration-implementation:implementation component-list connection-list implementation component-list connection-list 6.2.6 nesC配件配件n 配件的三个语法配件的三个语法 - - = =6.2.6 nesC配件配件n 导通连接导通连接导通连接是一个配件将两个组件连接在一起,并且必导
32、通连接是一个配件将两个组件连接在一起,并且必须使用须使用“=”“=”操作符把使用者连接到提供者操作符把使用者连接到提供者。注意区别注意区别“连接连接”与与“导通连接导通连接”。n 扇入和扇出扇入和扇出 n-to-kn-to-k关系关系n 参数化连接参数化连接 一个组件的多个不同实例一个组件的多个不同实例6.2.6 nesC配件配件n 通用配件通用配件 可重用的用于构成高层次抽象的关系集可重用的用于构成高层次抽象的关系集 使用方法与通用模块一样使用方法与通用模块一样6.3 TinyOS操作系统操作系统nTinyOS是一个开源的嵌入式操作系统,它是由加州大是一个开源的嵌入式操作系统,它是由加州大学
33、的伯利克分校开发出来的,主要应用于无线传感器学的伯利克分校开发出来的,主要应用于无线传感器网络方面。它是网络方面。它是基于一种组件(基于一种组件(ComponentBased)的架构方式的架构方式,使得能够快速实现各种应用。,使得能够快速实现各种应用。n因为与同样是他们设计的硬件平台珠联璧合而声名鹊因为与同样是他们设计的硬件平台珠联璧合而声名鹊起,目前已经成为无线传感器网络领域事实上的标准起,目前已经成为无线传感器网络领域事实上的标准平台。平台。 n支持的平台:支持的平台:eyesIFXv2、intelmote2、mica2、 mica2dot、micaZ、telosb、tinynode。6.
34、3 TinyOS操作系统操作系统n TinyOS技术特点技术特点 组件化编程(组件化编程(Componented-BasedComponented-Based):提供一系列可重用):提供一系列可重用的组件,一个应用程序可以通过连接配置文件将各种组的组件,一个应用程序可以通过连接配置文件将各种组件连接起来,以完成它所需要的功能。件连接起来,以完成它所需要的功能。 事件驱动模式(事件驱动模式(Event-DrivenEvent-Driven):):TinyOSTinyOS的应用程序都的应用程序都是基于事件驱动模式的,采用事件触发去唤醒传感器工是基于事件驱动模式的,采用事件触发去唤醒传感器工作。事件
35、相当于不同组件之间传递状态信息的信号。当作。事件相当于不同组件之间传递状态信息的信号。当事件对应的硬件中断发生时,系统能够快速地调用相关事件对应的硬件中断发生时,系统能够快速地调用相关的事件处理程序。的事件处理程序。6.3 TinyOS操作系统操作系统n TinyOS技术特点技术特点 轻量级线程(轻量级线程(lightweight threadlightweight thread):即任务。任务之):即任务。任务之间是平等的,不能相互抢占,按先入先出队列进行调度间是平等的,不能相互抢占,按先入先出队列进行调度。轻线程是针对节点并发操作可能比较频繁,且线程比。轻线程是针对节点并发操作可能比较频繁
36、,且线程比较短的问题提出的。较短的问题提出的。 两级调度方式(两级调度方式(Tasks And Events Concurrency ModelTasks And Events Concurrency Model):): 任务一般用在对于时间要求不是很高的应用中;事任务一般用在对于时间要求不是很高的应用中;事件一般用在对于时间的要求很严格的应用中,且它可以件一般用在对于时间的要求很严格的应用中,且它可以占先优于任务和其他事件执行,在占先优于任务和其他事件执行,在TinyOSTinyOS中一般由硬件中一般由硬件中断处理来驱动事件。中断处理来驱动事件。6.3 TinyOS操作系统操作系统n Tin
37、yOS技术特点技术特点 分阶段作业(分阶段作业(Split-Phase OperationsSplit-Phase Operations):):TinyOSTinyOS没有提没有提供任何阻塞操作,为了让一个耗时较长的操作尽快完成,供任何阻塞操作,为了让一个耗时较长的操作尽快完成,一般来说都是将对这个操作的请求和这个操作的完成分开一般来说都是将对这个操作的请求和这个操作的完成分开来实现,以便获得较高的执行效率。来实现,以便获得较高的执行效率。 主动消息通信(主动消息通信(Active MessageActive Message):每一个消息都维护一):每一个消息都维护一个应用层的处理程序。当节点
38、收到消息后,就会把消息中个应用层的处理程序。当节点收到消息后,就会把消息中的数据作为参数,传递给应用层的处理程序,由其完成消的数据作为参数,传递给应用层的处理程序,由其完成消息数据的解析、计算处理或发送响应消息等工作。息数据的解析、计算处理或发送响应消息等工作。6.4 TinyOS开发环境搭建开发环境搭建TinyOS开发的软件环境:开发的软件环境: Linux操作系统环境操作系统环境 各种各种LinuxLinux发行版或发行版或CygwinCygwin均可均可 TinyOS及及nesC源代码源代码 目标板相关软件环境目标板相关软件环境 烧写工具烧写工具 其它必备软件工具、库其它必备软件工具、库
39、6.4 TinyOS开发环境搭建开发环境搭建TinyOS开发的硬件环境:开发的硬件环境: 运行运行Linux操作系统的操作系统的PC机机 或虚拟机或虚拟机 目标板及烧写工具目标板及烧写工具 测试环境测试环境6.4.1 创建创建Ubuntu虚拟机虚拟机TinyOS的开发需要在的开发需要在Linux环境下进行。在环境下进行。在Windows环境下可使用环境下可使用Cygwin来模拟来模拟Linux环境进行开发,但是安装配置较为繁琐,且环境进行开发,但是安装配置较为繁琐,且性能较低。性能较低。本书选用了基于本书选用了基于VMware虚拟机虚拟机和和Ubuntu 12.04 Linux发行版的发行版的
40、TinyOS软件软件开发环境。开发环境。创建虚拟机的过程请参见课本创建虚拟机的过程请参见课本6.4.1小节的介小节的介绍,或参考网络上的指南,此处不再赘述。绍,或参考网络上的指南,此处不再赘述。6.4.2 安装安装Java编译运行环境编译运行环境TinyOS的许多组件依赖的许多组件依赖Java环境,必须首环境,必须首先安装先安装JDK 1.6或更新版本。或更新版本。 下载下载JDK 1.6安装文件安装文件jdk-6u45-linux-i586.bin,放置于用户主目录,放置于用户主目录“”下。下。 从终端进入主目录,执行命令从终端进入主目录,执行命令nsudo chmod a+x jdk-6u
41、45-linux-i586.binn./ jdk-6u45-linux-i586.bin6.4.2 安装安装Java编译运行环境编译运行环境JDK自解压完成后在主目录下生成自解压完成后在主目录下生成jdk1.6.0_45目录,其中包含目录,其中包含JDK。添加添加JDK的环境变量,执行以下命令:的环境变量,执行以下命令:nexport JAVA_HOME=/jdk1.6.0_45 nexport PATH=$JAVA_HOME/bin:$PATH nexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar6.4.2 安装
42、安装Java编译运行环境编译运行环境将添加环境变量的命令放入用户主目录下的将添加环境变量的命令放入用户主目录下的“.bashrc”隐藏文件中,可使其每次打隐藏文件中,可使其每次打开终端自动执行。开终端自动执行。 使用以下命令测试使用以下命令测试JDK,若能输出版本,若能输出版本信息,则证明信息,则证明JDK安装正确。安装正确。njavac version6.4.3 安装其它必备工具安装其它必备工具nsudo apt-get install build-essential binutils automake autoconf2.64 gperf bison flex git python-dev
43、 emacs graphviz名称名称说明说明build-essentialbuild-essential在在UbuntuUbuntu下编译下编译C/C+C/C+程序所需的一些必备工具程序所需的一些必备工具binutilsbinutilsGNUGNU的二进制文件工具集的二进制文件工具集automakeautomake用来生成符合用来生成符合GNUGNU规范的规范的MakefileMakefile的工具的工具autoconf2.64autoconf2.64用来制作供编译、安装和打包软件的配置脚本的工具用来制作供编译、安装和打包软件的配置脚本的工具gperfgperfGNUGNU完美哈希函数生成器
44、,用以快速处理命令行参数完美哈希函数生成器,用以快速处理命令行参数bisonbisonGNU bisonGNU bison,用于自动化生成语法分析器,用于,用于自动化生成语法分析器,用于nesCnesC编译器编译器flexflex自动化生成词法分析器,用于自动化生成词法分析器,用于nesCnesC编译器编译器gitgit一个著名的版本控制工具一个著名的版本控制工具python-devpython-devPythonPython和和C C结合开发结合开发所所需要的一些头文件和库需要的一些头文件和库emacsemacs一款著名的多用途文本编辑器一款著名的多用途文本编辑器graphvizgraphv
45、iz贝尔实验室推出的一款绘图工具,用于生成文档贝尔实验室推出的一款绘图工具,用于生成文档表6-1 TinyOS开发必备工具6.4.4 下载并编译安装下载并编译安装nesC编译器编译器从终端进入用户主目录,执行以下命令:从终端进入用户主目录,执行以下命令:nmkdir tinyos#在主目录下创建在主目录下创建tinyos目录目录ncd tinyos#进入进入tinyos目录目录ngit clone git:/ #使用使用Git下载下载nesC源码源码ncd nesc #进入进入nesc目录目录n./Bootstrap#检测编译环境,生成检测编译环境,生成configuren./configur
46、e#生成生成Makefilenmake #开始编译开始编译nsudo make install#安装安装nesC编译器编译器6.4.4 下载并编译安装下载并编译安装nesC编译器编译器验证验证nesC编译器安装成功,执行以下命令编译器安装成功,执行以下命令:nnescc vn若输出若输出“nescc: version_number”,则说明安装成,则说明安装成功。功。6.4.5 下载并编译安装下载并编译安装TinyOS从终端进入用户主目录,执行以下命令:从终端进入用户主目录,执行以下命令:ncd tinyos#进入进入tinyos目录目录ngit clone git:/ #下载下载TinyOS
47、源码源码ncd tinyos-main#进入进入tinyos源码目录源码目录ncd tools#进入工具目录,编译安装进入工具目录,编译安装TinyOS工具工具n./Bootstrap#检测编译环境,生成检测编译环境,生成configuren./configure#生成生成Makefilenmake #开始编译过程开始编译过程nsudo make install#安装安装TinyOS工具工具6.4.5 下载并编译安装下载并编译安装TinyOS添加添加TinyOS环境变量,将以下命令添加进主目录下的环境变量,将以下命令添加进主目录下的“.bashrc”文件,并重新打开终端。文件,并重新打开终端。
48、nexport TOSROOT=/home/USER_NAME/tinyos/tinyos-mainnexport TOSDIR=$TOSROOT/tosnexport CLASSPATH=$CLASSPATH:$TOSROOT/support/sdk/javanexport MAKERULES=$TOSROOT/support/make/Makerulesnexport PYTHONPATH=$PYTHONPATH:$TOSROOT/support/sdk/python6.4.6 下载并下载并安装安装AVR工具链工具链AVR工具链包含工具链包含AVR单片机的编译器与烧写器等。单片机的编译器与
49、烧写器等。nsudo apt-get install gcc-avr gdb-avr binutils-avr avr-libc avarice avrdude名称名称说明说明gcc-avrgcc-avrAVR平台的交叉编译器gdb-avrgdb-avrAVR平台的GDB调试器binutils-avrbinutils-avrAVR平台的二进制文件工具avr-libcavr-libcAVR平台的C标准库avariceavariceAVR的JTag在线调试工具avrdudeavrdudeAVR的编程工具表6-2 AVR工具链6.5 简单无线传输简单无线传输BlinkToRadio是是TinyOS自
50、带的一个例程,在自带的一个例程,在Blink的基的基础上加入了网络通信。础上加入了网络通信。每个节点维护一个计数器,并每个节点维护一个计数器,并在一个定时器的控制下递增。计数器每递增一次,就在一个定时器的控制下递增。计数器每递增一次,就通过通过ActiveMessage将自身的将自身的ID号和计数值发送出去。号和计数值发送出去。每当节点接收到一个其他节点发来的数据包,就从其每当节点接收到一个其他节点发来的数据包,就从其中把其他节点的计数值提取出来,并在中把其他节点的计数值提取出来,并在LED上显示。上显示。所得到的运行效果就是节点所得到的运行效果就是节点A显示节点显示节点B的计数值,节的计数值
51、,节点点B显示节点显示节点A的计数值。的计数值。6.5.1 BlinkToRadio的模块的模块BlinkToRadio使用了以下模块:使用了以下模块:nMainC:TinyOS启动过程,触发应用初始化。启动过程,触发应用初始化。nLedC:提供板载:提供板载LED的控制。的控制。nBlinkToRadioC: 包含包含BlinkToRadio的主逻辑。的主逻辑。nTimerMilliC:微秒级定时器。:微秒级定时器。nActiveMessageC:平台级的:平台级的ActiveMessage模块,模块,管理网络传输。管理网络传输。nAMSenderC和和AMReceiverC:ActiveM
52、essage的收的收发接口。发接口。6.5.1 BlinkToRadio的模块的模块各模块间的连接在顶层配件各模块间的连接在顶层配件BlinkToRadioAppC中。根中。根据其中的连接信息,可得出模块关系图如下:据其中的连接信息,可得出模块关系图如下:BlinkToRadioCLedsCActiveMessageCAMSenderCAMReceiverCTimerMilliCMainC图6-20 BlinkToRadio模块关系图6.5.2 BlinkToRadio的执行过程的执行过程 TinyOSTinyOS启动完成,触发启动完成,触发Boot.booted()Boot.booted()
53、事件事件 调用调用BlinkToRadioCBlinkToRadioC的的Boot.booted()Boot.booted()事件处理函数事件处理函数调用调用AMControl.start()AMControl.start()命令命令 AMAM启动完成,触发启动完成,触发AMControl.startDone()AMControl.startDone()事件事件开启定时器,周期性触发开启定时器,周期性触发 定时周期到,触发定时周期到,触发Timer.fired()Timer.fired()事件事件 调用调用BlinkToRadioCBlinkToRadioC的的Timer.fired()Tim
54、er.fired()事件处理函数事件处理函数计数器计数器+1+1将当前计数器值和自身节点将当前计数器值和自身节点IDID组包,通过组包,通过AMSenderCAMSenderC的的AMSend.sendAMSend.send命令发送到广播地址命令发送到广播地址 AMAM层发送完成,触发层发送完成,触发AMSenderCAMSenderC的的AMSend.sendDone()AMSend.sendDone()事事件件6.5.2 BlinkToRadio的执行过程的执行过程 AMAM层从广播地址接收到指定类型的包,触发层从广播地址接收到指定类型的包,触发AMReceiverCAMReceiverC
55、的的Receive.receive()Receive.receive()事件事件 调用调用BlinkToRadioCBlinkToRadioC的的Receive.receive()Receive.receive()事件处理函数事件处理函数从接收到的数据包载荷中提取其他节点的计数值从接收到的数据包载荷中提取其他节点的计数值将计数值使用将计数值使用LedCLedC显示到板载显示到板载LEDLED上上6.6 简单数据分发简单数据分发TinyOS自带了三种自带了三种Trickle算法的实现,分别为算法的实现,分别为Drip、DIP和和DHV。它们的基本原理相同,但是实现上互有。它们的基本原理相同,但是
56、实现上互有差异。差异。在这一节中,我们将继续以在这一节中,我们将继续以Drip协议为例,学协议为例,学习数据分发的使用方法。习数据分发的使用方法。6.6.1 数据分发依赖的组件数据分发依赖的组件nDisseminationC分发协议的最高层组件,实现分发协议。同时对应用提分发协议的最高层组件,实现分发协议。同时对应用提供一个供一个StdControlStdControl接口,用以控制分发协议栈的工作。接口,用以控制分发协议栈的工作。nDisseminatorC 通过通过keykey配对的一组配对的一组实例实例共同共同代表一个代表一个在网络中需要同步在网络中需要同步的数据。的数据。应用通过操作它
57、提供的应用通过操作它提供的DisseminationUpdateDisseminationUpdate接接口和口和DisseminationValueDisseminationValue接口进行实际的分发操作接口进行实际的分发操作。创建时需要提供两个参数:分发的数据类型和创建时需要提供两个参数:分发的数据类型和keykey。每个。每个DisseminatorCDisseminatorC实例只能接受来自与自己实例只能接受来自与自己keykey相同的实例分发的相同的实例分发的数据。数据。6.6.1 数据分发依赖的组件数据分发依赖的组件nDisseminatorC的接口的接口Disseminator
58、CDisseminatorC提供两个接口提供两个接口: DisseminationUpdate: DisseminationUpdate和和DisseminationValueDisseminationValueinterface DisseminationUpdate command void change(t* newVal); /用来主动改变被同步的值 interface DisseminationValue command const t* get(); /用来取得网络中当前的值 event void changed(); /当网络中的值被其他节点改变时触发6.6.2 数据分发例程数据
59、分发例程例程的需求:例程的需求:整个网络包含一个数据源节点,整个网络包含一个数据源节点,N个接收节点。个接收节点。数据源节点运行一个定时器,定时更新一个计数器,数据源节点运行一个定时器,定时更新一个计数器,并使用分发协议将最新的计数值分发出去。并使用分发协议将最新的计数值分发出去。当其他节点接收到分发的值后,将值显示在自己当其他节点接收到分发的值后,将值显示在自己的的LED上。上。6.6.2 数据分发例程数据分发例程为了实现需求规定的功能,需要用到以下模块:为了实现需求规定的功能,需要用到以下模块:nMainC:TinyOS自带自带nSimpleDisseminationC:主逻辑模块,需要编
60、写:主逻辑模块,需要编写nActiveMessageC:TinyOS自带自带nDisseminationC:TinyOS自带自带nDisseminatiorC:TinyOS自带自带nTimerMilliC:TinyOS自带自带nLedsC:TinyOS自带自带6.6.2 数据分发例程数据分发例程例程的模块关系图:例程的模块关系图:SimpleDisseminationCMainCLedsCActiveMessageCDisseminationCDisseminatorCTimerMilliC图6-21 SimpleDissemination模块关系图6.6.2 数据分发例程数据分发例程n在在T
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 煤层气液化工安全生产意识水平考核试卷含答案
- 制材工岗前岗位知识考核试卷含答案
- 软木烘焙工岗前核心考核试卷含答案
- 电线电缆绞制工风险评估测试考核试卷含答案
- 液体洗涤剂制造工岗前客户服务考核试卷含答案
- 有机硅生产工岗前工作考核试卷含答案
- 推土犁司机岗位理论综合技能考核试卷含答案
- 罐头原料处理工标准化知识考核试卷含答案
- 液体二氧化碳生产工岗前应急响应预案考考核试卷含答案
- 典当业务员基础综合水平考核试卷含答案
- 2024年技改革新方法与实践理论知识考试题库(附答案)
- 抛丸机安全操作规程(2篇)
- 《无人机法律法规知识》课件-第1章 民用航空法概述
- 2023年济南市平阴县教体事业单位招聘教师考试真题
- 成人社区获得性肺炎基层诊疗指南
- (正式版)HGT 20593-2024 钢制化工设备焊接与检验工程技术规范
- 医疗机构高警示药品风险管理规范(2023版)
- 打木垛施工安全技术措施
- 中广核研究院热室设施建设项目 环境影响报告书(建造阶段)
- 正常人体解剖学:绪论
- 行政事业单位资产移交调拨表
评论
0/150
提交评论