-
Notifications
You must be signed in to change notification settings - Fork 1
PE Project 1
Mookeun Ji edited this page Jul 2, 2018
·
9 revisions
- 실제 실험과 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 세팅으로 실험을 진행하는 것으로 결정함.
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
#define NETSTACK_CONF_RDC nullrdc_driver
#define NETSTACK_CONF_MAC nullmac_driver
#define NETSTACK_CONF_FRAMER framer_nullmac
// 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는 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();
}
- 일정 시간 동안 기다린 뒤 결과를 출력
#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();
}
- 전반적으로 null mac에 비해 csma에서 더 낮은 throughput 관찰
- 2대의 transmitter(sender)를 둔 경우
- null mac의 throughput은 큰 경향성 없이 날뛰지만, csma의 경우에는 안정적으로 보임
- csma에서 더 많은 packet이 수신 성공
- 너무 가까우면 신호를 못 받는다.. 조금 떨어뜨려 보거나 tx power 를 조절해 보자
- tx power 를 조절해도 최소 50~60cm 정도는 떨어뜨려야 하는 듯
- 중간에 장애물이 있어도 잘 안 받아지니 주의하자