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的通信方式有初步认识, 继续中。

  • 相关阅读:
    Java实现 蓝桥杯 算法提高 特等奖学金(暴力)
    Java实现 蓝桥杯 算法提高 特等奖学金(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    第一届云原生应用大赛火热报名中! helm install “一键安装”应用触手可及!
    云原生时代,2个方案轻松加速百万级镜像
    Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler
  • 原文地址:https://www.cnblogs.com/xfiver/p/1987997.html
Copyright © 2011-2022 走看看