zoukankan      html  css  js  c++  java
  • 新手入门

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

  • 相关阅读:
    【Postgresql】set up
    【LSTM】Understanding-LSTMs
    【CTR】各公司方法
    【DL】stanford--cs20si--tensorflow
    Redis数据库入门教程
    用.htaccess文件实现URL重写
    php中urldecode()和urlencode()
    php中序列化与反序列化
    网站整合Ucenter详细流程
    ucenter 整合外部网站,实现登录等操作
  • 原文地址:https://www.cnblogs.com/xfiver/p/1987997.html
Copyright © 2011-2022 走看看