开始学习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)