您的位置:首页 > 其它

TinyOS08:在Avrora上运行Sentomist的三个实验

2016-01-05 23:13 232 查看

实验一: 单跳数据采集中的数据污染

程序实现的功能:传感器节点监测温度,并以单跳的方式将数据传给数据接收器(data sink)

该程序是Oscilloscope实例中的程序,根据指定的时钟延迟D周期性采集温度数据,程序通过ADC中断处理程序获得采集的数据,当采集的数据达到3个时,以数据包的形式发给数据接收器。

两个相关的传感器实例简单介绍1:Sense实例

Sense实例:周期性读取传感器数据,并显示在LED上

采集传感器数据的两个基本步骤:

1、配置并启动传感器:TinyOS2.x中只要获取数据的接口具有平台无关性,因此只要直接编译将传感程序下载到相应的平台即可;

2、读取传感器数据:该实现较为简单

Sense实例代码

1、配件SenseAppC:

configuration SenseAppC
{
}
implementation {

components SenseC, MainC, LedsC, new TimerMilliC(), new DemoSensorC() as Sensor;

SenseC.Boot -> MainC;
SenseC.Leds -> LedsC;
SenseC.Timer -> TimerMilliC;
SenseC.Read -> Sensor;
}


2、模块组件:

odule SenseC
{
uses {
interface Boot;
interface Leds;
interface Timer<TMilli>;
interface Read<uint16_t>;
}
}
implementation
{
// sampling frequency in binary milliseconds
#define SAMPLING_FREQUENCY 100

event void Boot.booted() {
call Timer.startPeriodic(SAMPLING_FREQUENCY);
}

event void Timer.fired()
{
call Read.read();
}

event void Read.readDone(error_t result, uint16_t data)
{
if (result == SUCCESS){
if (data & 0x0004)
call Leds.led2On();
else
call Leds.led2Off();
if (data & 0x0002)
call Leds.led1On();
else
call Leds.led1Off();
if (data & 0x0001)
call Leds.led0On();
else
call Leds.led0Off();
}
}
}


3、SenseC的实现步骤:

Boot接口在系统初始化后启动了一个周期性的定时器 + 定时器触发之后,通过Read接口读取传感器数据(读取数据有read命令和readDone事件构成)

两个相关的传感器实例简单介绍2:Oscilloscope实例

节点周期性地启动传感器采集数据,当传感数据达到10个后将他们通过无线发送出去;另一个运行BaseStation应用的节点通过无线接收这些数据并通过串口转发给PC机。



Oscilloscope实例涉及的三个部分:传感器结点 + 基站结点 + Oscilloscope图形界面

传感器结点:运行Oscilloscope应用程序(周期性读取传感数据,每10个打包成一个数据包,通过无线发送给基站结点)

1、切换到Oscilloscope目录:



2、在mica2节点上编译Oscilloscope程序,指定sensorboard的类型为mts300(一种温度传感器),会在Oscilloscope\build\mica2目录下生成main.exe二进制文件



3、将main.exe移动并重命名为os.elf文件



4、通过Avrora运行os.elf



程序运行所涉及的命令解析:

1、-platform=mica2:指定模拟的平台(即节点的类型)

2、-monitors=led



3、-monitors=packet:记录传感网结点的数据包发送和接收



4、-seconds=10:在指定模拟秒的时间之后终止程序的执行,并不是真得模拟10s的时间,例如指定100s的模拟发送的数据报是10s数据包数量的10倍。

5、-simulation=sensor-network:能同时模拟多个节点,可以通过无线交换数据包 + 多跳网络间的数据传输(目前只有mica2节点支持传感网的模拟类型,即如果不指定mica2节点,就不会打印与packet相关的信息)

6、nodecount=list:用于指定要实例化的节点数。例如nodecount:2,3表示对第一个程序实例化两个节点,对第二个程序实例化3个结点。对于本例,如果nodecount改成2之后,就能模拟两个节点之间数据的收发情况:



7、-sensor-data:,格式为(),这个option应该有默认值,因为我删掉了这个option值变化不大

①、对每一个传感器结点的输入数据的描述。

②、格式:传感器设备(例如light):传感器ID号:数据(可以是一个文件类型,如果是“.”表示随机的数据,如果是文件,则该文件格式为③)

③、传感数据文件格式为:读入的初始数据(0-1023间的正数) + 空格 + 几秒后(浮点数) + 读入的数据

例如:如果指定的数据文件data.txt内如:



传感器获取的数据结果为(为啥有重复呢):



也可以为多个结点指定传感数据



8、-monitors=real-time:减缓模拟器的执行速度,使之与实时的情况接近,即会议指定seconds之后结束模拟。

注意(多个monitor命令要写在一个list中,不能分开)

将基站结点Basestation程序make到mica2节点上,并mv到Oscilloscope目录下重命名为bs.elf(通过无线接收的数据包转发给PC的串口)

测试结果为(结果还是有很多不懂啊):



nodecount=2,1表示os.elf程序实例化两个节点,而bs.elf实例化一个节点。

即没有运行bs.elf之前的数据包的发送接收情况为:



os.elf和bs.elf一起运行之后数据报的发送接收情况为:



即基站结点2作为接受数据包的功能。

切换到Oscilloscope/java目录,执行make命令

注意:

①、make命令执行的是makefile的内容,其中mig命令生成OscilloscopeMsg.java(用于将二进制数据打包成消息数据) + ncg命令生成Constants.java(用于定义常量),本应出现的结果为:



可是我的结果却是:





出现这个的原因是我的tinyos.sh文件出错,对比一下原来有错的tinyos.sh和修改后的tinyos.sh文件。



有了以上的准备工作之后,即可运行程序:

3. 在Oscilloscope图形界面上运行程序:

步骤1:运行两个节点程序,等待串口连接到特定的端口



相关的命令解析:

1、-monitors=serial:让结点中的串行端口连接到一个socket,使得在模拟中运行的程序数据能够输出,并且外部数据能够输入到结点的串行端口。(简单理解就是为结点的串行端口指定一个socket实现数据的输入输出) + -port选项指定一个服务端端口用于接收串行端口的连接(没能理解,而且老师指定的-port值是指定了3个端口的意思吗)

2、-stagger-start:在每一个节点启动之前插入逐渐变长的延迟来避免节点之间的人工周期级别的同步。例如一开始指定延迟为X,之后第二个节点启动的时间延迟是2*X。

步骤二:启动一个新的Cygwin程序,启动SerialForwarder(串口转发程序),连接到特定的端口号



得到SerialForwarder串口转发程序GUI:



第一个Cygwin结点即可成功收发数据。

实验二:多跳数据转发中的数据包丢失

程序介绍

源节点2——中间转发节点1——接收节点0 + 涉及的TinyOS程序的BlinkToRadio

流程为:当一个无线接口芯片通过天线收到一个数据包,接着触发SPI中断,再执行SPI中断处理程序来处理接收到的数据包(Received.receive +AMSend.send实现packet的接收和转发

sentomist的实验:输入为到达结点1的packet事件,即结点2随机发给结点1的packet,对结点1的接收的packet的事件处理进行分区间然后进行sentomis

bug为:当结点1在处理一个数据包的过程中,标志位置为busy,此时如果在接收到一个数据包的时候,会把这个数据包给丢弃(由于WSNs采用了CSMA载波监听多点接入协议来避免数据包的碰撞,在两个数据包发送的事件间隔很短时会触发这个bug)

解决方式对于接收到的packet用队列存储起来,并不马上发送出去,而是在flag部位busy位的时候,才从队列中去packet并且发送出去。

结点之间点对点的通信

传感器节点上一般都配有无线射频模块,结点之间的通信主要是通过无线的方式来实现的

AM(Active Message)通信

1、TinyOS提供了AM层对无线射频的模块复用,每个数据报被定义成一个AM类型,并通过一个字节来辨别该数据包的类型,根据数据包的类型将接收到的数据包分发给适当的矗立着,就像信息可以主动寻找并到达目的地,因此取名为AM。

2、结点之间传输的消息可以理解成是一个个AM;

3、不同链路层之间的传输是message_t。但是由于每一个数据链路层都会定义自己的message_t的头、尾、元数据字段。()

可以理解成数据链路层又对message_t中的各个字段又一部的封装

3、对链路层这些数据的访问采用的是相应的get/set方法

BlinkToRadio程序介绍

实现的功能:实现计数的增加,将计数的三个最低有效位在三个LED灯上显示,并通过无线方式将计算消息发出;

BlinkToRadio程序运行的结果为:



相关命令介绍

1、-monitors=serial:指定一个节点的串行端口号,通过这个串行端口号可以输入输出模拟信息。

2、serial的option:-port指定服务器端口号

SerialForwarder:串口代理连接,通过这个可以实现节点上传数据给PC或者PC向结点发送数据报

UART(universal asynchronous receiver/transmitter):通用异步收发传输器,可以简单理解成是串行通信和并行通信之间的传输转换,并行输入经过UART之后变成串行输出;

3、-ports=结点号:UART串口号:端口号

指定一系列的服务器端口号(也就是节点的端口号,也就是模拟器程序指定的端口号),监听SerialForwarder的连接,且Avrora只能指定一个端口号。

之后老师笔记中的-devices-command、-terminal命令好像没见到。

再启动一个Cygwin,启栋Listen程序连接到模拟器节点的指定端口:



同时节点BlinkToRadio程序运行的结果变为:



(老师的结果里面Listen程序也会打印接收到的数据包,我的不会;老师的-terminal=1:0命令会打印出接收到数据报的信息我的也不会)

net.tinyos.tools. Listen 的功能

1、功能:监听PC的端口(由-comm参数指定)和BaseStation 的端口(由-ports指定)之间的通信,打印从BaseStation发送到PC的包信息。

2、PC 上运行Listen命令 + BaseStation上运行avrora –monitors=serial 命令,可见avrora可以在mica2下 模拟mote串口和PC以太口的通信。( 127.0.0.1就是 localhost本机)

3、BaseStation上

–monitors=serial –ports=1:0:2390  … -nodecount=2 blinkToRadio.elf  baseStation.elf


则指定的是baseStation(结点node1),所以可以监听到包

–monitors=serial –ports=0:0:2390  … -nodecount=2 blinkToRadio.elf  baseStation.elf


则指定的 不是baseStation,是结点node0,所以 不能监听到包

c.–monitors=serial –ports=1:0:2390  … -nodecount=2 ,1 blinkToRadio.elf  baseStation.elf


则指定的 不是baseStation(node2),而是结点node1,所以不能监听到包。

6. 在Listen(即PC端)接收到数据包的格式分析:



这是c的运行结果: 绿色表示包长 + 黄色表示包的源节点的node号 + 蓝色表示 是来自该节点的第几个包

注:这些包从 源节点发送到BaseStation, 然后送往PC

实验三 :由两个共存的协议导致的未处理故障

涉及的程序还是BlinkToRadio,但是配置模块BlinkToRadioAppC不一样。

Sentomist是上对该例子的简单讲解

1、第一个协议CTP(集合数协议)实现:传感器节点接收数据周期性发送给目标节点;

2、第二个协议是传感器节点的心跳信息交换协议(用于监测节点的生命周期),给相邻节点发送,每个500ms发送一次;

3、心跳协议和CTP协议都是由时钟超时事件来驱动的

3、错误特征:CTP协议无法发送数据包
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: