2010년 2월 16일 화요일

여러 개의 센서를 이용한 패킷 전송 방법

센서 노드에 탑재된 여러 개의 센서를 제어하고 이를 통해 무선으로 패킷을 전송하는 방법을 살펴보자.

1. 센서의 갯수 만큼 타이머를 할당하여 타이머 이벤트에 따라 제어 및 전송하는 방식
 - 센서로부터 센싱하는 시간이 대체적으로 길거나 신뢰성 있는 패킷 전송을 필요로 할 때 사용
 - 전송시간이 길며 배터리 소모면에서 불리하다.
 - 예시
event void Temperature.readDone(error_t result, uint16_t data){
//inject data to payload//
}
event void Humidity.readDone(error_t result, uint16_t data){
//inject data to payload//
}
event error_t AnalTemperature.dataReady(uint16_t data, uint8_t status){
//inject data to payload//
}
event error_t Light.dataReady(uint16_t data, uint8_t status){
//inject data to payload//
}
event error_t Microphone.dataReady(uint16_t data, uint8_t status){

//inject data to payload//
}
event error_t Gyro.dataReady(uint16_t data, uint8_t status){
//inject data to payload//
call Send.sendPacket(transmitPacketPtr);
}
event void Timer.fired(){
if(count % 6 == 1) call Temperature.read();
else if(count % 6 == 2) call Humidity.read();
else if(count % 6 == 3) call AnalTemperature.getData();
else if(count % 6 == 4) call Light.getData();
else if(count % 6 == 5) call Microphone.getData();
else call Gyro.getData();
count++;
}

2. 순차적으로 센서를 제어하는 방식으로 마지막으로 센싱된 후 패킷을 전송하는 방식
 - 센싱이 빠르며 패킷 전송 또한 빠르다.
 - 적절한 타이머를 사용하지 않으며 패킷 손실 및 전송 실패가 발생할 수도 있다.
 - 예시
event void Temperature.readDone(error_t result, uint16_t data){

//inject data to payload//
call Humidity.getData();
}
event void Humidity.readDone(error_t result, uint16_t data){
//inject data to payload//
call AnalTemperature.getData();
}
event error_t AnalTemperature.dataReady(uint16_t data, uint8_t status){
//inject data to payload//
call Light.getData();
}
event error_t Light.dataReady(uint16_t data, uint8_t status){
//inject data to payload//
call Microphone.getData();
}
event error_t Microphone.dataReady(uint16_t data, uint8_t status){
//inject data to payload//
call Gyro.getData();
}
event error_t Gyro.dataReady(uint16_t data, uint8_t status){
//inject data to payload//
call Send.sendPacket(transmitPacketPtr);
}

tosboot

/opt/tinyos-1.x/tos/lib/Deluge/TOSBoot