BlinkToRadio分析

开始学习BlinkToRadio

  1. 功能分析(变现在BlinkToRadioC.nc中):1) 在Boot时启动无线控制:AMControl即SpiltControl;

                               代码:event void Boot.booted()
   {
      //开启 splitcontrol
      call AMControl.start();
   }

                  2)确认无线控制是否开启成功:如果成功,触发定时器功能;否则,重新开启无线控制。开启完毕会触发stopDone事件:

                           event void AMControl.startDone(error_t err)
   { 
      if(err==SUCCESS)
         call Timer0.startPeriodic(TIMER_PERIOD_TMILLI);
       else
         call AMControl.start();
   }

                           event void AMControl.stopDone(error_t err) {  }

                  3) 定时器被触发时:首先,记录包数,如果没有正在发送数据包(!busy),那么,利用Packet接口的getPayload命令将btrpkt指向数据包的有效载荷区;然后,初始化btrpkt,最后通过AMSend.send发送消息包,地址为AM_BROADCAST_ADDR,如果发送成功,则busy=TRUE;

                         event void Timer0.fired()
   {
       count++;
       if(!busy){
          RadioToBlinkMsg* btrpkt=(RadioToBlinkMsg*)(call Packet.getPayload(&pkt,sizeof(RadioToBlinkMsg)));
          if(btrpkt==NULL)
              return;
       btrpkt->nodeid=TOS_NODE_ID;
       btrpkt->counter=count;
       if(call AMSend.send(AM_BROADCAST_ADDR,&pkt,sizeof(RadioToBlinkMsg))==SUCCESS)
             busy=TRUE;
     }
   }

                  4)发送完毕之后:触发AMSend.sendDone事件(处理时,需要判断消息是否一致,否则,例如当两个组件连接到同一个AMSend时,任一组件在调用send命令后,这两个组件都会接收到SendDone事件句柄。)

                 event void AMSend.sendDone(message_t *msg,error_t err){
      if(msg==&pkt)
         busy=FALSE;
  }

                  5)收到消息时,触发Receive.receive事件: 如果消息长度符合,那么就可以直接用btrpkt指向有效载荷区,通过btrpkt读出消息中的内容(counter)来设置灯。

                event message_t* Receive.receive(message_t *msg,void *payload,uint8_t len){
                   if(len==sizeof(RadioToBlinkMsg *)){
                   RadioToBlinkMsg *btrpkt=(RadioToBlinkMsg *)payload;
                  setLeds(btrpkt->counter);
               }  
                      return msg;     
              }

  2. 文件创建:消息格式需要在头文件BlinkToRadio.h中来定义;BlinkToRadioC.nc来实现所有功能;BlinkToRadioAppC.nc顶层配件来连接;最后还需要Makefile文件。


  3. 需要的组件:Boot,LedsC, TimerTMilli, AMSenderC(提供AMSend,Packet,AMPacket),ActiveMessageC(对应SpiltControl), AMReceiverC(Receive)

      故,BlinkToRadioAppC.nc中连接为:

           implementation {
  components MainC;
  components LedsC;
  components BlinkToRadioC as App;
  components new TimerMilliC() as Timer0;
  components ActiveMessageC;
  components new AMSenderC(AM_BLINKTORADIOMSG);
  components new AMReceiverC(AM_BLINKTORADIOMSG);    //首先声明这些要用到的组件


  App.Boot -> MainC;
  App.Leds -> LedsC;
  App.Timer0 -> Timer0;
  App.Packet -> AMSenderC;
  App.AMPacket -> AMSenderC;
  App.AMControl -> ActiveMessageC;
  App.AMSend -> AMSenderC;
  App.Receive -> AMReceiverC;                                    //对应的连接起来
}

  4. 头文件的编辑:

        #ifndef BLINKTORADIO_H
#define BLINKTORADIO_H
     //枚举全局变量
enum {
  AM_BLINKTORADIOMSG = 6,    //指明AMSenderC组件的AM标识号
  TIMER_PERIOD_MILLI = 250     //时间定时
};

     //定义数据包结构
typedef nx_struct BlinkToRadioMsg {
  nx_uint16_t nodeid;
  nx_uint16_t counter;
} BlinkToRadioMsg;
     #endif

  5. Makefile文件:为了可以在电脑上显示出packet信息(利用mig工具来侦听数据包内容)。

     COMPONENT=BlinkToRadioAppC
BUILD_EXTRA_DEPS += BlinkToRadioMsg.class
BlinkToRadioMsg.class: BlinkToRadioMsg.java
javac BlinkToRadioMsg.java


BlinkToRadioMsg.java:
mig java -target=null -java-classname=BlinkToRadioMsg BlinkToRadio.h BlinkToRadioMsg -o $@


include $(MAKERULES)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值