TinyOS08:在Avrora上運行Sentomist的三個實驗

實驗一: 單跳數據採集中的數據污染

  1. 程序實現的功能:傳感器節點監測溫度,並以單跳的方式將數據傳給數據接收器(data sink)
  2. 該程序是Oscilloscope實例中的程序,根據指定的時鐘延遲D週期性採集溫度數據,程序通過ADC中斷處理程序獲得採集的數據,當採集的數據達到3個時,以數據包的形式發給數據接收器。

兩個相關的傳感器實例簡單介紹1:Sense實例
Sense實例:週期性讀取傳感器數據,並顯示在LED上

  1. 採集傳感器數據的兩個基本步驟:
    1、配置並啓動傳感器:TinyOS2.x中只要獲取數據的接口具有平臺無關性,因此只要直接編譯將傳感程序下載到相應的平臺即可;
    2、讀取傳感器數據:該實現較爲簡單
  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圖形界面

  1. 傳感器結點:運行Oscilloscope應用程序(週期性讀取傳感數據,每10個打包成一個數據包,通過無線發送給基站結點)
    1、切換到Oscilloscope目錄:
    這裏寫圖片描述
    2、在mica2節點上編譯Oscilloscope程序,指定sensorboard的類型爲mts300(一種溫度傳感器),會在Oscilloscope\build\mica2目錄下生成main.exe二進制文件
    這裏寫圖片描述
    3、將main.exe移動並重命名爲os.elf文件
    這裏寫圖片描述
    4、通過Avrora運行os.elf
    這裏寫圖片描述
  2. 程序運行所涉及的命令解析:
    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中,不能分開)
  3. 將基站結點Basestation程序make到mica2節點上,並mv到Oscilloscope目錄下重命名爲bs.elf(通過無線接收的數據包轉發給PC的串口)
    測試結果爲(結果還是有很多不懂啊):
    這裏寫圖片描述
    nodecount=2,1表示os.elf程序實例化兩個節點,而bs.elf實例化一個節點。
    即沒有運行bs.elf之前的數據包的發送接收情況爲:
    這裏寫圖片描述
    os.elf和bs.elf一起運行之後數據報的發送接收情況爲:
    這裏寫圖片描述
    即基站結點2作爲接受數據包的功能。

  4. 切換到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結點即可成功收發數據。

實驗二:多跳數據轉發中的數據包丟失

程序介紹

  1. 源節點2——中間轉發節點1——接收節點0 + 涉及的TinyOS程序的BlinkToRadio
  2. 流程爲:當一個無線接口芯片通過天線收到一個數據包,接着觸發SPI中斷,再執行SPI中斷處理程序來處理接收到的數據包(Received.receive +AMSend.send實現packet的接收和轉發
  3. sentomist的實驗:輸入爲到達結點1的packet事件,即結點2隨機發給結點1的packet,對結點1的接收的packet的事件處理進行分區間然後進行sentomis
  4. bug爲:當結點1在處理一個數據包的過程中,標誌位置爲busy,此時如果在接收到一個數據包的時候,會把這個數據包給丟棄(由於WSNs採用了CSMA載波監聽多點接入協議來避免數據包的碰撞,在兩個數據包發送的事件間隔很短時會觸發這個bug)
  5. 解決方式對於接收到的packet用隊列存儲起來,並不馬上發送出去,而是在flag部位busy位的時候,才從隊列中去packet並且發送出去。

結點之間點對點的通信
傳感器節點上一般都配有無線射頻模塊,結點之間的通信主要是通過無線的方式來實現的

  1. AM(Active Message)通信
    1、TinyOS提供了AM層對無線射頻的模塊複用,每個數據報被定義成一個AM類型,並通過一個字節來辨別該數據包的類型,根據數據包的類型將接收到的數據包分發給適當的矗立着,就像信息可以主動尋找併到達目的地,因此取名爲AM。
    2、結點之間傳輸的消息可以理解成是一個個AM;
    3、不同鏈路層之間的傳輸是message_t。但是由於每一個數據鏈路層都會定義自己的message_t的頭、尾、元數據字段。()
    可以理解成數據鏈路層又對message_t中的各個字段又一部的封裝
    3、對鏈路層這些數據的訪問採用的是相應的get/set方法

BlinkToRadio程序介紹

  1. 實現的功能:實現計數的增加,將計數的三個最低有效位在三個LED燈上顯示,並通過無線方式將計算消息發出;
  2. BlinkToRadio程序運行的結果爲:
    這裏寫圖片描述
  3. 相關命令介紹
    1、-monitors=serial:指定一個節點的串行端口號,通過這個串行端口號可以輸入輸出模擬信息。
    2、serial的option:-port指定服務器端口號
    SerialForwarder:串口代理連接,通過這個可以實現節點上傳數據給PC或者PC向結點發送數據報
    UART(universal asynchronous receiver/transmitter):通用異步收發傳輸器,可以簡單理解成是串行通信和並行通信之間的傳輸轉換,並行輸入經過UART之後變成串行輸出;
    3、-ports=結點號:UART串口號:端口號
    指定一系列的服務器端口號(也就是節點的端口號,也就是模擬器程序指定的端口號),監聽SerialForwarder的連接,且Avrora只能指定一個端口號。
    之後老師筆記中的-devices-command、-terminal命令好像沒見到。
  4. 再啓動一個Cygwin,啓棟Listen程序連接到模擬器節點的指定端口:
    這裏寫圖片描述
    同時節點BlinkToRadio程序運行的結果變爲:
    這裏寫圖片描述
    (老師的結果裏面Listen程序也會打印接收到的數據包,我的不會;老師的-terminal=1:0命令會打印出接收到數據報的信息我的也不會)
  5. 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不一樣。

  1. Sentomist是上對該例子的簡單講解
    1、第一個協議CTP(集合數協議)實現:傳感器節點接收數據週期性發送給目標節點;
    2、第二個協議是傳感器節點的心跳信息交換協議(用於監測節點的生命週期),給相鄰節點發送,每個500ms發送一次;
    3、心跳協議和CTP協議都是由時鐘超時事件來驅動的
    3、錯誤特徵:CTP協議無法發送數據包
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章