이제 슬 무선 통신을 해보도록 하겠습니다.

이번장에서 배울것.
 - message_t 메세지 버퍼
 - 무선을 통해 메세지 버퍼 송신
 - 무선을 통해 메세지 버퍼 수신

Introduction

TinyOS는 기본적인 통신을 지원 하기 위한 추상 인터페이스와 컴포넌트를 제공 합니다. 이 인터페이스들와 컴포넌트는 message_t라는 추상 메세지 버퍼를 사용 합니다.(message_t는 일반 C와 비슷한 nesC 구조체로 되어 있습니다.) message_t 구조체는 직접 접근은 되지 않으며 제공되는 acessor 나 mutator function을 사용 하여 접근 가능 합니다.

Basic Communications Interfaces

message_t를 사용하는 기본적인 인터페이스는 다음과 같습니다.(tos/interface 폴더에 위치 하고 있습니다.)

* Packet - message_t 구조체를 접근 하기위한 인터페이스입니다.,패킷의 길이, 패킷의 데이타 포인터등을 제공 합니다.
* Send - 주소와 관계없는 메세지 송신에 사용 하는 인터페이스 입니다.
* Receive - 패킷 송신에 관련된 인터페이스 입니다. receive이벤트를 가지고 있으니 꼭 구현 해주어야 합니다. 수신패킷에 접근 할 수 있는 기능도 제공 합니다.
* PacketAcknowledgements - 패킷에 기반하여 ACK 기능을 제공 합니다.
* RadioTimeStamping - 패킷 송수신에 대한 시간 정보(?)를 제공 합니다.

Active Message Interface
TinyOS의 인터넷의 패킷 처럼 무선 전송시 다중 접근 할 수 있는 AM layer를 제공 합니다.(이해가 좀 어렵습니다. 인터넷의 그것 처럼 IP,UDP 이런식으로 구조화 되어 있어 다중 레이어로 되어 있다 생각 하면 될것 같습니다.) 위와 달리 AM은 목적지 주소를 가지고 있어 유니캐스트를 지원 합니다. 그리고 AM에 대한 인터페이스 역시 tos/interface에 있습니다.

* AMPacket - 위 Packet과 비슷한 기능입니다, 추상 구조체인 message_t를 AM 으로 제공 합니다. 목적지를 설정하거나 체크 하는등의 기능을 제공 합니다.
* AMSend - Send와 비슷하나, 목적지 주소(AM Address를 가지고 한개의 노드를 향해 메세지를 송신 합니다.

AM address는 컴파일시 결정되나, ActiveMessageAddressC에서 바꿀 수 있습니다.

Components
TinyOS 2.0에서 무선 통신을 위해 기본적으로 제공 하는 컴포넌트들 입니다. tos/system 에 위치 하고 있습니다.

* AMReceiverC - Receive,Packet,AMPacket을 제공
* AMSenderC - AMSend,Packet,AMPacket,PacketAcknowlegements,Acks를 제공
* AMSnooperC - Receive,Packet,AMPacket을 제공
* AMSnooperReceiverC - Receive,Packet,AMPacket을 제공
* ActiveMessageAddresC- Acitve Adress 체크 및 설정에 사용 합니다.주소 재설정을 사용시에는 확실히 알고 하셔야 합니다.

Naming Wrappers
TinyOS는 여러 플랫폼 지원을 위해 송수신 관련 ActiveMessageC Warpper로 하위 추상 클래스를 가지고 있습니다. ActiveMessageC는 위 대부분의 인터페이스를 가지고 있습니다. 각 플랫폼 별 ActiveMessageC는 다음과 같습니다.

* eyesIFX - Tda5250ActiveMessageC
* telosa,telosb,micaz,intelmote - CC2420ActiveMessageC
* mica - CC1000ActiveMessageC
(* ActiveMessageC를 통해 모듈을 추상화 했다고 보면 됩니다.)

TinyOS 2.0 Message Buffer
TinyOS 2.0에서는 기존 메세지 TOS_Msg를 대체하는 message_t를 가지고 있습니다. tos/types/message.h에 선언 되어 있습니다.

typedef nx_struct message_t {
  nx_uint8_t header[sizeof(message_header_t)];
  nx_uint8_t data[TOSH_DATA_LENGTH];
  nx_uint8_t footer[sizeof(message_header_t)];
  nx_uint8_t metadata[sizeof(message_metadata_t)];
} message_t;

위 구조중 header,footer,metadata는 수정 불가 입니다. 이유는 data의 포인터 위치 고정 입니다.


, .