Skip to content

PE Project 1

Mookeun Ji edited this page Jul 2, 2018 · 9 revisions

Requirements

  • 실제 실험과 simulation 모두 진행
  • stack을 최대한 간단하게 만들어 실험할 것
  • Null MAC과 CSMA 두 방식에 대해 모두 실험할 것
  • 각각의 실험에서 [패킷 크기에 따른 초당 Tx, Rx 패킷 수] 그래프와 이로부터 [패킷 크기에 따른 Tx, Rx bps] 그래프를 그릴 것

contiki-ng에서는 가장 간단한 형태의 network stack인 null net을 지원하지만, contiki-ng에서의 null MAC은 tx, rx 자체를 하지 않음.

따라서 패킷을 실제로 보내는 것이 불가능하고, CSMA와의 비교도 불가능하다고 판단되어, contiki-os에서 rime broadcast + nullmac + nullrdc + framer_nullmac 세팅으로 실험을 진행하는 것으로 결정함.


Makefile

null rdc, null mac, framer_nullmac(null mac을 사용하기 위해서는 필수인듯, 설정하지 않으면 패킷이 transmit되지 않음)

all: sender receiver

CONTIKI = ../..

CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\"
CONTIKI_WITH_RIME = 1

include $(CONTIKI)/Makefile.include

project-conf.h

#define NETSTACK_CONF_RDC nullrdc_driver
#define NETSTACK_CONF_MAC nullmac_driver
#define NETSTACK_CONF_FRAMER framer_nullmac

project-setting.h

// settings for packet
#define MAX_PKT_NUM 1000
#define PKT_SIZE 10

// settings for sender
#define TX_DELAY_SEC 0

// settings for receiver
#define EXPECTED_TX_DURATION_SEC 10

sender.c

  • 원활한 실험을 위해 sender는 5초의 delay 후에 패킷을 보내기 시작.
  • while loop을 쉬지 않고 수행할 경우, 프로세스가 재시작되는 문제가 있음. while loop 내에 PROCESS_PAUSE() 추가.
  • printf %ㄹ 출력 안 됨...
#include "contiki.h"
#include "net/rime/rime.h"

#include <stdio.h> /* For printf() */

#define MAX_PKT_NUM 1000
#define PKT_SIZE 117
#define CHANNEL_NUM 129

#define TX_DELAY 0
#define WAIT_RX_DELAY 5

/*---------------------------------------------------------------------------*/
PROCESS(project_1_sender, "sender process");
AUTOSTART_PROCESSES(&project_1_sender);
/*---------------------------------------------------------------------------*/

static void
broadcast_recv(struct broadcast_conn *c, const linkaddr_t *from)
{
  /* do nothing */
}
static const struct broadcast_callbacks recv_callbacks = {broadcast_recv};
static struct broadcast_conn broadcast;

PROCESS_THREAD(project_1_sender, ev, data)
{
  static uint8_t payload[PKT_SIZE] = {0,};
  static int count = 0;
  static struct etimer et;
  static clock_time_t begin_time, end_time;

  PROCESS_EXITHANDLER(broadcast_close(&broadcast));
  PROCESS_BEGIN();

  printf("Wait for receiver to start\n");
  etimer_set(&et, WAIT_RX_DELAY * CLOCK_SECOND);
  PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));

  broadcast_open(&broadcast, CHANNEL_NUM, &recv_callbacks);

  printf("Start sending...\n");
  begin_time = clock_time();

  while (count < MAX_PKT_NUM){

    packetbuf_copyfrom(payload, PKT_SIZE);
    broadcast_send(&broadcast);

    count++;

#if TX_DELAY == 0
    PROCESS_PAUSE();
#else
    etimer_set(&et, TX_DELAY_SEC);
    PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
#endif
  }

  end_time = clock_time();

  printf("%d packets (length: %d bytes) sent in %lu clocks (CLOCK_SECOND: %lu)\n", 
    count, PKT_SIZE, end_time-begin_time, CLOCK_SECOND);

  PROCESS_END();
}

receiver.c

  • 일정 시간 동안 기다린 뒤 결과를 출력
#include "contiki.h"
#include "net/rime/rime.h"

#include <stdio.h> /* For printf() */

#define CHANNEL_NUM 129

#define EXPECTED_TX_DURATION 30

/*---------------------------------------------------------------------------*/
PROCESS(project_1_receiver, "receiver process");
AUTOSTART_PROCESSES(&project_1_receiver);
/*---------------------------------------------------------------------------*/

static int count = 0;
static clock_time_t begin_time, end_time;

static void
broadcast_recv(struct broadcast_conn *c, const linkaddr_t *from)
{
  // if this is first packet
  if(count == 0) 
    begin_time = clock_time(); 
  
  end_time = clock_time();

  count++;
}
static const struct broadcast_callbacks recv_callbacks = {broadcast_recv};
static struct broadcast_conn broadcast;

PROCESS_THREAD(project_1_receiver, ev, data)
{
  static struct etimer et;

  PROCESS_EXITHANDLER(broadcast_close(&broadcast);)
  PROCESS_BEGIN();

  broadcast_open(&broadcast, CHANNEL_NUM, &recv_callbacks);

  etimer_set(&et, EXPECTED_TX_DURATION * CLOCK_SECOND);
  PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));

  printf("%d packets received in %lu (CLOCK_SECOND: %lu) \n", 
    count, end_time-begin_time, CLOCK_SECOND);

  PROCESS_END();
}

Result

  • 전반적으로 null mac에 비해 csma에서 더 낮은 throughput 관찰
  • 2대의 transmitter(sender)를 둔 경우
    • null mac의 throughput은 큰 경향성 없이 날뛰지만, csma의 경우에는 안정적으로 보임
    • csma에서 더 많은 packet이 수신 성공

알게된 것

  • 너무 가까우면 신호를 못 받는다.. 조금 떨어뜨려 보거나 tx power 를 조절해 보자
    • tx power 를 조절해도 최소 50~60cm 정도는 떨어뜨려야 하는 듯
    • 중간에 장애물이 있어도 잘 안 받아지니 주의하자