| 
 | 
 
简单发送接收数据 
本节为对BlinkToRadio的分析,从而了解简单的收发过程。 
我们读BlinkToRadio修改如下:发送本节点的id给其他的节点 
BlinkToRadio.h 
 
#ifndef BLINKTORADIO_H 
#define BLINKTORADIO_H 
 
enum { 
  AM_BLINKTORADIO = 6,     //AM数据包的类型 
  TIMER_PERIOD_MILLI = 250 //发送的时间间隔为250ms 
}; 
 
//定义发送数据包的负载部分 
typedef nx_struct BlinkToRadioMsg { 
  nx_uint16_t nodeid;  //本节点的id 
  nx_uint16_t counter; //计数 
} BlinkToRadioMsg; 
 
#endif 
 
BlinkToRadioC.nc 文件分析 
 
#include <Timer.h> 
#include "BlinkToRadio.h" 
 
module BlinkToRadioC { 
//定义使用的接口 
  uses interface Boot;                   //从Boot开始启动 
  uses interface Leds;                   //led灯 
  uses interface Timer<TMilli> as Timer0;//时间 
  uses interface Packet;                 //数据包,在获取负载处用到 
  uses interface AMPacket;               //AM数据包,需要实现SendDone() 
  uses interface AMSend;                 //AM发送数据 
  uses interface Receive;                //接收数据包 
  uses interface SplitControl as AMControl; //Split操作 
} 
implementation { 
 
  uint16_t counter; //发送的次数 
  message_t pkt;    //数据包 
  bool busy = FALSE; //节点是否忙,开始为不忙 
 
  //从此处启动,开始程序 
  event void Boot.booted() { 
    call AMControl.start();  //调用Split操作的开始,是否成功在startDone()处判断 
  } 
 
  //判断开始是否完成 
  event void AMControl.startDone(error_t err) { 
    if (err == SUCCESS) { 
      //成功调用时间周期执行 
      call Timer0.startPeriodic(TIMER_PERIOD_MILLI); 
    } 
    else { 
      //未成功重新开始 
      call AMControl.start(); 
    } 
  } 
 
  //停止判断 
  event void AMControl.stopDone(error_t err) { 
  } 
 
  //时间的每次周期执行的内容,发送数据 
  event void Timer0.fired() { 
    counter++;//发送数据个数加1 
    if (!busy) {//节点不忙,则开始发送数据 
      //设置数据包的负载,btr指向数据包的负载部分 
      BlinkToRadioMsg* btrpkt = 
    (BlinkToRadioMsg*)(call Packet.getPayload(&pkt, sizeof(BlinkToRadioMsg))); 
      if (btrpkt == NULL) {//没有数据就不发送 
    return; 
      } 
      btrpkt->nodeid = TOS_NODE_ID; //发送节点的ID,TOS_NODE_ID为在make telosb install,1时设置的 
      btrpkt->counter = counter;    //发送数据包的个数 
      //开始发送数据,AMSend.send(广播地址,负载数据,负载数据的大小) 
      if (call AMSend.send(AM_BROADCAST_ADDR, //修改AM_BROADCAST_ADDR为2,则节点只向2号节点发,其他节点不响应 
          &pkt, sizeof(BlinkToRadioMsg)) == SUCCESS) { 
        busy = TRUE;//调用发送数据成功,节点正在发送数据,变为忙的状态,是否发送完成在sendDone里判断 
      } 
    } 
  } 
 
  event void AMSend.sendDone(message_t* msg, error_t err) { 
    if (&pkt == msg) {//如果发送的数据是所设置的数据,发送成功,节点变为不忙 
      busy = FALSE; 
    } 
  } 
  
  //接收数据部分 
  event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len){ 
    if (len == sizeof(BlinkToRadioMsg)) {//判断接受的数据的长度,是否为所需要的 
      BlinkToRadioMsg* btrpkt = (BlinkToRadioMsg*)payload; //获取数据 
      call Leds.set(btrpkt->nodeid); //设置led为获取节点的id 
    } 
    return msg;  //返回数据 
  } 
} 
 
 
BlinkToRadioAppC.nc文件,实现连线 
 
#include <Timer.h> 
#include "BlinkToRadio.h" 
 
configuration BlinkToRadioAppC { 
} 
implementation { 
  components MainC; 
  components LedsC; 
  components BlinkToRadioC as App; 
  components new TimerMilliC() as Timer0; 
  components ActiveMessageC; 
  components new AMSenderC(AM_BLINKTORADIO); 
  components new AMReceiverC(AM_BLINKTORADIO); 
 
  App.Boot -> MainC; 
  App.Leds -> LedsC; 
  App.Timer0 -> Timer0; 
  App.Packet -> AMSenderC; 
  App.AMPacket -> AMSenderC; 
  App.AMControl -> ActiveMessageC; 
  App.AMSend -> AMSenderC; 
  App.Receive -> AMReceiverC; 
} 
 |   
 
 
 
 |