PE Project 1 - goofcode/UR GitHub Wiki

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 ์ •๋„๋Š” ๋–จ์–ด๋œจ๋ ค์•ผ ํ•˜๋Š” ๋“ฏ
    • ์ค‘๊ฐ„์— ์žฅ์• ๋ฌผ์ด ์žˆ์–ด๋„ ์ž˜ ์•ˆ ๋ฐ›์•„์ง€๋‹ˆ ์ฃผ์˜ํ•˜์ž
โš ๏ธ **GitHub.com Fallback** โš ๏ธ