寒假留校准备跟导师一起学习WSN,但说实话我的研究方向是图像处理与模式识别,所以这段学习机会我也不知道如何把握,只是抱着“呆家中睡觉,不如在学校鬼混”!由于在学习WSN之前要涉及到TinyOS和NesC,所以查阅了许多文章。以下是一篇师兄的学习笔记,藉此为自己鼓劲!
自己当初不知到为什么,导师让我选做图像(在硕士一年级下学期时开发了人脸与指纹融合识别系统),还是无线传感器网络(WSN)时,我从导师偏向的介绍中坚定做WSN,之后虽然还有别的与WSN无关的项目去做,但知道自己主要研究方向是WSN。
/********************************************************************
Copyright (C), 2006-2007, by Enoch.
FileName: Rssi.h
Description: Hardware specific definitions for the MTS300/310.
*********************************************************************/
enum
{
INITIAL_TIMER_RATE = 1000,
INITIAL_TIMER_REAE_STEP = 8,
INITIAL_TIMER_DELAY = 1500
};
enum
{
BASE_NODE = 0,
MOVE_NODE = 100,
};
/********************************************************************
Copyright (C), 2006-2007, by Enoch.
FileName: RssiMsg.h
Description: RSSI tracking system.
*********************************************************************/
enum
{
TOTAL_NODE = 16
};
typedef struct RssiMsg
{
uint8_t addr;
uint16_t seq;
}RssiMsg;
typedef struct NodeUARTMsg
{
uint8_t fromaddr;
uint8_t rssi;
uint16_t seq;
}NodeUARTMsg;
typedef struct UARTMsg
{
uint8_t rssi[TOTAL_NODE];
uint16_t seq;
}UARTMsg;
enum
{
RSSI = 44,
};
/********************************************************************
Copyright (C), 2006-2007, by Enoch.
FileName: RssiM.nc
Description: RSSI tracking system.
*********************************************************************/
includes RssiMsg;
includes Rssi;
module RssiM
{
provides interface StdControl;
uses
{
interface Timer as TimerSend;
interface SendMsg as Sendtest;
interface ReceiveMsg as Receivetest;
interface SendMsg as UARTSend;
interface Leds;
}
}
implementation
{
TOS_Msg MoveData, UARTSendData, MoteSendData;
uint8_t rssi_value[TOTAL_NODE];
uint16_t seq = 0;
uint32_t i = 0;
task void SendData()
{
call UARTSend.send(TOS_UART_ADDR, sizeof(UARTMsg), &UARTSendData);
}
task void SendNodeData()
{
call Sendtest.send(TOS_BCAST_ADDR, sizeof(RssiMsg), &MoveData);
}
command result_t StdControl.init()
{
call Leds.init();
call Leds.greenOn();
for (i = 0; i < TOTAL_NODE; i++)
{
rssi_value[i] = 255;
}
seq = 0;
return SUCCESS;
}
command result_t StdControl.start()
{
/* Moving node start the timer */
if (TOS_LOCAL_ADDRESS == MOVE_NODE)
{
call TimerSend.start(TIMER_REPEAT, INITIAL_TIMER_RATE);
call Leds.greenToggle();
call Leds.redToggle();
}
else if (TOS_LOCAL_ADDRESS == BASE_NODE)
{
seq = 1;
}
return SUCCESS;
}
command result_t StdControl.stop()
{
if (TOS_LOCAL_ADDRESS == MOVE_NODE)
{
call TimerSend.stop();
}
return SUCCESS;
}
event result_t TimerSend.fired()
{
/* Moving node send message */
if (TOS_LOCAL_ADDRESS == MOVE_NODE)
{
RssiMsg* snd_msg = (RssiMsg*)MoveData.data;
// Data
snd_msg->addr = TOS_LOCAL_ADDRESS;
snd_msg->seq = ++seq;
call Sendtest.send(TOS_BCAST_ADDR, sizeof(RssiMsg), &MoveData);
call Leds.yellowToggle();
}
return SUCCESS;
}
event result_t Sendtest.sendDone(TOS_MsgPtr msg, result_t success)
{
call Leds.yellowToggle();
return SUCCESS;
}
/* Motes Reciece Message */
event TOS_MsgPtr Receivetest.receive(TOS_MsgPtr msgptr)
{
/* BASE mote recieve message to UART */
if (TOS_LOCAL_ADDRESS == BASE_NODE)
{
NodeUARTMsg* node_uart_msg = (NodeUARTMsg*)msgptr->data;
UARTMsg* uart_msg = (UARTMsg*)UARTSendData.data;
RssiMsg* snd_msg = (RssiMsg*)MoveData.data;
uint8_t node_addr = node_uart_msg->fromaddr;
uint16_t node_seq = node_uart_msg->seq;
uint8_t max_rssi = 255;
uint16_t max_node = 0;
if (((RssiMsg*)msgptr->data)->addr == MOVE_NODE)
{
if (((RssiMsg*)msgptr->data)->seq > 0)
{
/* Select the max rssi value node */
for (i = 0; i < TOTAL_NODE; i++)
{
uart_msg->rssi[i] = rssi_value[i];
}
// Data
uart_msg->seq = node_seq;
/* Upstream the data */
//call UARTSend.send(TOS_UART_ADDR, sizeof(RssiMsg), &MoveData);
//call UARTSend.send(TOS_UART_ADDR, sizeof(UARTMsg), &UARTSendData);
post SendData();
//post SendNodeData();
//call Sendtest.send(TOS_BCAST_ADDR, sizeof(RssiMsg), &MoveData);
for (i = 0; i < TOTAL_NODE; i++)
{
rssi_value[i] = 255;
}
rssi_value[node_addr-1] = node_uart_msg->rssi;
//call Leds.redToggle();
}
return msgptr;
}
else
{
/* data is recieved for saving */
rssi_value[node_addr-1] = node_uart_msg->rssi;
//call Leds.greenToggle();
}
}
/* Node proccess */
else if (TOS_LOCAL_ADDRESS > BASE_NODE && TOS_LOCAL_ADDRESS != MOVE_NODE)
{
RssiMsg* recv_rssi_msg = (RssiMsg*)msgptr->data;
NodeUARTMsg* send_mote_msg = (NodeUARTMsg*)MoteSendData.data;
if (recv_rssi_msg->addr == MOVE_NODE)
{
send_mote_msg->fromaddr = TOS_LOCAL_ADDRESS;
send_mote_msg->rssi = (int8_t)msgptr->strength;
send_mote_msg->seq = recv_rssi_msg->seq;
/* Delay send to base mote */
for (i = 0; i < TOS_LOCAL_ADDRESS * INITIAL_TIMER_DELAY; i++)
call Sendtest.send(BASE_NODE, sizeof(NodeUARTMsg), &MoteSendData);
}
else if (recv_rssi_msg->addr == BASE_NODE)
{
if (recv_rssi_msg->seq == TOS_LOCAL_ADDRESS)
{
call Leds.redOn();
}
else
{
call Leds.redOff();
}
}
}
return msgptr;
}
// UART Send Message
event result_t UARTSend.sendDone(TOS_MsgPtr msg, result_t success)
{
//call Leds.yellowToggle();
return SUCCESS;
}
}
Copyright (C), 2006-2007, by Enoch.
FileName: Makefile
Description: RSSI tracking system.
COMPONENT = Rssi
XBOWROOT=%T/../contrib/xbow/tos
PFLAGS= -I$(XBOWROOT)/platform/micaz
# For MICA2 and MICA2DOT
#PFLAGS+= -I../../tos/platform/mica2 -I../../tos/CC1000RadioAck -I../../tos/lib/ReliableRoute -I%T/lib/Queue -I%T/lib/Broadcast -I%T/lib/Attributes
# For MICAZ
PFLAGS+= -I../../beta/tos/lib/CC2420Radio -I%T/lib/Broadcast -I%T/lib/Attributes
include ../MakeXbowlocal
include ${TOSROOT}/tools/make/Makerules