2009년 11월 11일 수요일

TOSBase & Network Communication Lib

TOSBase 와 Network Communication Lib. 에 대해 알아보자.
TOSBase 어플리케이션은 Bridge 역할을 한다.

즉, 송신 노드로부터 RF를 통해 전달되는 패킷을 수신하게 되면 TOSBase는 Group ID를 확인하고 자신의 Group ID 와 같으면 패킷을 받아서 시리얼(PC)로 전송하는 기능을 하며, 반대로 시리얼(PC)로부터 데이터를 전달 받으면 RF를 통해 네트워크로 전송하는 기능을 한다.
TOSBase 어플리케이션은 네트워크를 사용하는 다른 어플리케이션들과는 약간 다른 네트워크 라이브러리를 사용한다.
TOSBase 어플리케이션의 경우 RadioCRCPacket 라이브러리를 사용하는데 다음과 같다.

components Main, TOSBaseM, RadioCRCPacket as Comm, FramerM, UART, LedsC, CC2420ControlM;

RadioCRCPacket 라이브러리는 패킷을 받으면 CRC 체크후 에러가 없으면 상위 컴퍼넌트로 전달한다. RadioCRCPacket을 통해 올라온 패킷은 에러체크만 하고, 그룹 ID나 노드 ID는 필터링 되지 않는다.
TOSBase 어플리케이션이 RadioCRCPacket 라이브러리를 쓰는 이유는 네트워크로 수신되는 모든 패킷을 받기 위함이다.
그에 반해 OscilloscopeRF와 같은 일반적인 어플리케이션은 GenericComm 라이브러리를 사용한다.
GenericComm 라이브러리는 RadioCRCPacket을 통해 올라온 패킷들 중에서 그룹 ID와 노드 ID가 자신의 ID와 일치하는 브로드캐스팅된 패킷만 필터링 해서 상위 컴퍼넌트로 올려주는 역할을 한다.
즉, GenericComm 네트워크 스택을 사용하면 자신의 ID 또는 브로드캐스팅 주소로 전송되는 패킷만 수신하게 되는 것이다.
GenericComm과 RadioCRCPacket이 각각의 동작방식은 다르지만 제공하는 command와 event는 같으며, 일반적으로 컴포넌트명도 비슷하게 사용한다.
TOSBase 어플리케이션의 TOSBaseM.nc 파일과 OscilloscopeRF 어플리케이션의 oscilloscopeM.nc파일만 비교해보면 네트워크와 관련해서 같은 라이브러리를 사용하는 것처럼 보일 수가 있다.
그렇기 때문에 TOSBase.nc파일과 Oscilloscope.nc파일을 비교해 보면서 두 어플리케이션에서 각각 어떤 네트워크라이브러리를 사용하는지 알수가 있고 차이점을 파악할 수 있다.
그리고 RF를 통해 네트워크로 전송되는 패킷마다 패킷 ID를 가지며, 이 ID를 가지고 적절한 핸들러를 찾아 이벤트를 발생시켜주는데, 이 이벤트 핸들러는 상위 컴포넌트에서 구현해야 한다.
참고로 OscopeMsg.h 파일을 보면 다음과 같이 선언되어 있는 것을 볼 수 있다.

enum {
AM_OSCOPEMSG = 10,
AM_OSCOPERESETMSG = 32,
};

이처럼 네트워크를 이용하는 다른 어플리케이션들은 이와 비슷한 형태로 패킷별로 고유의 ID를 정해서 사용한다.
네트워크로 패킷이 수신되었을 때 그룹 ID와 노드 ID가 자신의 ID와 동일하더라도 패킷 ID에 대한 핸들러를 구현해놓지 않았으면 해당 패킷은 무시된다.
configuration 부분을 보시면 하위 컴포넌트들과 연결할 때 이 ID를 다음과 같이 지정해서 사용하는 것을 볼 수 있다.

OscilloscopeM.ResetCounterMsg -> Comm.ReceiveMsg[AM_OSCOPERESETMSG];
OscilloscopeM.DataMsg -> Comm.SendMsg[AM_OSCOPEMSG];

위의 경우 패킷을 전송할 때는 AM_OSCOPEMSG 를 패킷에 삽입하여 전송하고, 수신되는 패킷은 AM_OSCOPERESETMSG 를 ID로 가지는 패킷만 처리하겠다는 것을 의미한다.
단순히 Oscilloscope를 수정하여 send와 receive를 하게 되면 보내는 쪽에서는 AM_OSCOPEMSG를 패킷 ID로해서 보내지만, 수신측에서는 AM_OSCOPERESETMSG를 패킷 ID로 가지는 것만 필터링 해서 받기 때문에 전송측에서 보내는 패킷을 받을 수가 없게 된다.
그러므로 네트워크와 관련된 내용을 구현할 때는 configuration 파일을 잘 살펴보고 사용하는 라이브러리와 패킷 ID를 주의하여 사용해야 한다.

댓글 없음:

댓글 쓰기