新手入门

  无线传感器网络WSN,TinyOS,NesC,Cygwin

硬件:MIB510,iris

程序功能:

节点1向节点2发送数据包,2通过接受包中数据显示指示灯,同时将数据增1后转发给3

节点3接受来自2的数据后,读取数据并将此值显示为指示灯效果;

如下为节点LEDs灯显示效果:

节点1:001 010 011 100 101 110 111 000

节点2:010 011 100 101 110 111 000 111

节点3:010 011 100 101 110 111 000 111

文件目录结构:

 

程序代码:

BlinkAndBlink.h
#ifndef BLINKTORADIO_H
#define BLINKTORADIO_H
enum {
    LEDS_DEFALUT_VALUE
=1,//初始为001
    AM_BLINKTORADIO=6,
    TIMER_PERIOD_MILLI 
= 2000
    
};

typedef nx_struct BlinkAndBlinkMsg{
    nx_uint16_t nodeid;
    nx_uint16_t value;
}BlinkAndBlinkMsg;

#endif
BlinkAndBlinkM.nc
#include <Timer.h>
#include 
"BlinkAndBlink.h"
module BlinkAndBlinkM{
    uses 
interface Boot;
    uses 
interface Leds;
    uses 
interface Timer<TMilli> as Timer101;
    
    
//send
    uses interface Packet;
    
//uses interface AMPacket;
    uses interface AMSend;
    uses 
interface SplitControl as AMControl;
    
    
//receive
    uses interface Receive;
}
implementation {
    
bool busy=FALSE;
    message_t pkt;
    uint16_t value
=LEDS_DEFALUT_VALUE;
    
    
event void Boot.booted(){
        call AMControl.start();
    }
    
event void AMControl.startDone(error_t err){
        
if(err==SUCCESS){
            
//开启发送模块成功
            
            call Timer101.startPeriodic(TIMER_PERIOD_MILLI); 
            
/*//移至Timer.fired()
            //增加发送数据部分
            if(!busy&&TOS_NODE_ID==1){//节点1的发送部分
                BlinkAndBlinkMsg* babpkt=(BlinkAndBlinkMsg*)(call Packet.getPayload(&pkt,NULL));
                if(babpkt==NULL){
                    return;
                }
                babpkt->nodeid=TOS_NODE_ID;
                babpkt->value=value;
                //if(call AMSend.send(AM_BROADCAST_ADDR,&pkt,sizeof(BlinkAndBlinkMsg))==SUCCESS){
                if(call AMSend.send(2,&pkt,sizeof(BlinkAndBlinkMsg))==SUCCESS){
                    busy=TRUE;
                }
            }
*/
            
/////////////////////////////////
        }
        
else{
            call AMControl.start();
        }
    }
    
event void Timer101.fired(){
        
//value++;//为什么放在这里会报错的?//难道说babpkt这句必须在第一句么?
        BlinkAndBlinkMsg* babpkt=(BlinkAndBlinkMsg*)(call Packet.getPayload(&pkt,NULL));
        
//value++;//放在这里就没问题?
        if(!busy&&TOS_NODE_ID==1){//节点1的发送部分
            value++;//放在这里就没问题?
            if(babpkt==NULL){
                
return;
            }
            babpkt
->nodeid=TOS_NODE_ID;
            babpkt
->value=value;
            
//if(call AMSend.send(AM_BROADCAST_ADDR,&pkt,sizeof(BlinkAndBlinkMsg))==SUCCESS){
            if(call AMSend.send(2,&pkt,sizeof(BlinkAndBlinkMsg))==SUCCESS){
                busy
=TRUE;
            }
        }
    
    }
    
event void AMControl.stopDone(error_t err){
        
//错误处理
    }
    
event void AMSend.sendDone(message_t* msg, error_t error){
        
if(&pkt==msg){//数据发送完成将busy置为FALSE
            busy=FALSE;
        }
    }
    
    
event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len){
        
if(len==sizeof(BlinkAndBlinkMsg)){
            BlinkAndBlinkMsg
* babkpt_trans=(BlinkAndBlinkMsg*)payload;
            BlinkAndBlinkMsg
* babpkt=(BlinkAndBlinkMsg*)(call Packet.getPayload(&pkt,NULL));
            uint16_t tempValue
=babkpt_trans->value;
            call Leds.
set(tempValue);
            
            
if(!busy&&TOS_NODE_ID==2){//节点2的发至节点3 //问题解决/////////
                babpkt->nodeid=TOS_NODE_ID;
                babpkt
->value=tempValue+1;
                
//if(call AMSend.send(AM_BROADCAST_ADDR,&pkt_trans,sizeof(BlinkAndBlinkMsg))==SUCCESS){ //AM_BROADCAST_ADDR为广播
                if(call AMSend.send(3,&pkt,sizeof(BlinkAndBlinkMsg))==SUCCESS){//仅向节点3单播
                    busy=TRUE;
                }
            }
            
            
if(!busy&&TOS_NODE_ID==3){//节点3的发至节点1 //问题解决/////////
                babpkt->nodeid=TOS_NODE_ID;
                babpkt
->value=tempValue;
                
if(call AMSend.send(1,&pkt,sizeof(BlinkAndBlinkMsg))==SUCCESS){//仅向节点1单播
                    busy=TRUE;
                }
            }
            
//以上几步中代码可以继续优化
        }
        
return msg;
    }
}
BlinkAndBlinkC.nc
#include <Timer.h>
#include 
"BlinkAndBlink.h"
configuration BlinkAndBlinkC{

}
implementation {
    components MainC;
    components LedsC;
    components BlinkAndBlinkM 
as MyApp;
    
//timer
    components new TimerMilliC() as Timer1; //为什么这里要加()呢
    
    
//send
    components ActiveMessageC;
    components 
new AMSenderC(AM_BLINKTORADIO);
    
    
//receive
    components new AMReceiverC(AM_BLINKTORADIO);
    
    MyApp.Boot
->MainC;
    MyApp.Leds
->LedsC;
    MyApp.Timer101
->Timer1;//自定义计时器
    
    MyApp.Packet
->AMSenderC;
    
//MyApp.AMPacket->AMSenderC;
    MyApp.AMSend->AMSenderC;
    MyApp.AMControl
->ActiveMessageC;
    
    MyApp.Receive
->AMReceiverC;
}

编译并灌入节点:

make iris install,node_id mib510,com_n

感受:

完成整个程序的预期功能,对WSN中TinyOs的通信方式有初步认识, 继续中。

原文地址:https://www.cnblogs.com/xfiver/p/1987997.html