|  | 
 
| 简单发送接收数据 本节为对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;
 }
 
 | 
 |