新手入门

  无线传感器网络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的通信方式有初步认识, 继续中。

你可能感兴趣的:(入门)