无线传感器网络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
#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;
}
}
#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;
}
#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的通信方式有初步认识, 继续中。