You are on page 1of 15

Mô phỏng

Vào terminal và nhập cd Contiki/tools/cooja


Nhập ant run

Cửa sổ cooja sẽ xuất hiện như hình dưới


Tạo một simulation mới bằng cách: File -> New simulation

Ta cần tạo border router, chạy trên skymode


Motes -> Add motes -> Create a new mote type -> Sky mote …
Chọn Browse -> /home/user/contiki/examples/ipv6/rpl-border-router/border-router.c
Sau đó, compile -> Create ( để tạo 1 router) -> Add motes

Tiếp theo, ta cần add các mode sky khác :


- Motes -> Add motes -> Create a new mote type -> Sky mote …
- Browser: /home/user/contiki/examples/ipv6/sky-websense/sky-websense.c
Tương tự, compile -> Create ( với number of new motes là 5) -> Add motes

Tiếp theo, ta nhấp chuột phải vào border router, sau đó chọn More tools for sky -> serial
socket (server)
Trong Listen port nhập 60001 và chọn Start

Kiểm tra thông qua terminal


Tiếp theo, mở terminal nhập cd contiki/examples/ipv6/rpl-border-router
Enter -> nhập make connect-router-cooja
Pass for user : user

Quay lại cửa sổ cooja


Ở cửa sổ Simulation control, ta chọn Start.
Kết quả sẽ như hình dưới: ta sẽ có 6 mote ( 1 border router mote và 5 Websense motes)
Ở hình trên ta có thế thấy được các địa chỉ ipv6 đã xuất hiện và lưu lương truy cập thì đang
thay đổi ở cửa sổ Network

Quay lại với cửa sổ terminal, ta có thể thấy được địa chỉ ip của border router là
Với địa chỉ ip trên ta có được nội dung trên Mozilla firefox như sau:

Trên hình ta có thể thấy, neighbors là fe80::212:7405:5:505 , fe80::212:7402:2:202 ,


fe80::212:7406:6:606 điều đó nghĩa là border router đang hoạt động ổn định với các mode
2, 5, 6 ở vùng lân cận nên nó là các neighbor.
Ngoài ra, ta có thể đọc được nhiệt độ và ánh sáng ở các địa chỉ trên. Ví dụ với
aaaa::212:7406:6:606 ta có kết quả như dưới:

Tương tự với các địa chỉ khác

Ta có thể kiểm tra mức tiêu thụ năng lượng bằng cách vào Tools -> Mote radio duty cycle
Trạng thái của motes được hiển thị thông qua cửa sổ radio messages

/*
* Copyright (c) 2010, Swedish Institute of Computer Science.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the Institute nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS
IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS
BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF
* SUCH DAMAGE.
*
*/

/**
* \file
* Slip fallback interface
* \author
* Niclas Finne <nfi@sics.se>
* Joakim Eriksson <joakime@sics.se>
* Joel Hoglund <joel@sics.se>
* Nicolas Tsiftes <nvt@sics.se>
*/

#include "net/ip/uip.h"
#include "net/ipv6/uip-ds6.h"
#include "dev/slip.h"
#include "dev/uart1.h"
#include <string.h>

#define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])

#define DEBUG DEBUG_PRINT


#include "net/ip/uip-debug.h"

void set_prefix_64(uip_ipaddr_t *);

static uip_ipaddr_t last_sender;


/*---------------------------------------------------------------------------*/
static void
slip_input_callback(void)
{
// PRINTF("SIN: %u\n", uip_len);
if(uip_buf[0] == '!') {
PRINTF("Got configuration message of type %c\n", uip_buf[1]);
uip_clear_buf();
if(uip_buf[1] == 'P') {
uip_ipaddr_t prefix;
/* Here we set a prefix !!! */
memset(&prefix, 0, 16);
memcpy(&prefix, &uip_buf[2], 8);
PRINTF("Setting prefix ");
PRINT6ADDR(&prefix);
PRINTF("\n");
set_prefix_64(&prefix);
}
} else if (uip_buf[0] == '?') {
PRINTF("Got request message of type %c\n", uip_buf[1]);
if(uip_buf[1] == 'M') {
char* hexchar = "0123456789abcdef";
int j;
/* this is just a test so far... just to see if it works */
uip_buf[0] = '!';
for(j = 0; j < 8; j++) {
uip_buf[2 + j * 2] = hexchar[uip_lladdr.addr[j] >> 4];
uip_buf[3 + j * 2] = hexchar[uip_lladdr.addr[j] & 15];
}
uip_len = 18;
slip_send();

}
uip_clear_buf();
}
/* Save the last sender received over SLIP to avoid bouncing the
packet back if no route is found */
uip_ipaddr_copy(&last_sender, &UIP_IP_BUF->srcipaddr);
}
/*---------------------------------------------------------------------------*/
static void
init(void)
{
slip_arch_init(BAUD2UBR(115200));
process_start(&slip_process, NULL);
slip_set_input_callback(slip_input_callback);
}
/*---------------------------------------------------------------------------*/
static int
output(void)
{
if(uip_ipaddr_cmp(&last_sender, &UIP_IP_BUF->srcipaddr)) {
/* Do not bounce packets back over SLIP if the packet was received
over SLIP */
PRINTF("slip-bridge: Destination off-link but no route src=");
PRINT6ADDR(&UIP_IP_BUF->srcipaddr);
PRINTF(" dst=");
PRINT6ADDR(&UIP_IP_BUF->destipaddr);
PRINTF("\n");
} else {
// PRINTF("SUT: %u\n", uip_len);
slip_send();
}
return 0;
}

/*---------------------------------------------------------------------------*/
#if !SLIP_BRIDGE_CONF_NO_PUTCHAR
#undef putchar
int
putchar(int c)
{
#define SLIP_END 0300
static char debug_frame = 0;

if(!debug_frame) { /* Start of debug output */


slip_arch_writeb(SLIP_END);
slip_arch_writeb('\r'); /* Type debug line == '\r' */
debug_frame = 1;
}

/* Need to also print '\n' because for example COOJA will not show
any output before line end */
slip_arch_writeb((char)c);

/*
* Line buffered output, a newline marks the end of debug output and
* implicitly flushes debug output.
*/
if(c == '\n') {
slip_arch_writeb(SLIP_END);
debug_frame = 0;
}
return c;
}
#endif
/*---------------------------------------------------------------------------*/
const struct uip_fallback_interface rpl_interface = {
init, output
};
/*---------------------------------------------------------------------------*/

You might also like