From b3f31636613a12ce512517f7a9f67e6b894e848f Mon Sep 17 00:00:00 2001 From: Adam Dunkels Date: Mon, 29 Aug 2011 21:33:23 +0200 Subject: [PATCH] Example code for the simple UDP API --- examples/ipv6/simple-udp-rpl/Makefile | 9 ++ .../ipv6/simple-udp-rpl/broadcast-example.c | 67 +++++++++++ .../ipv6/simple-udp-rpl/unicast-receiver.c | 108 ++++++++++++++++++ examples/ipv6/simple-udp-rpl/unicast-sender.c | 105 +++++++++++++++++ 4 files changed, 289 insertions(+) create mode 100644 examples/ipv6/simple-udp-rpl/Makefile create mode 100644 examples/ipv6/simple-udp-rpl/broadcast-example.c create mode 100644 examples/ipv6/simple-udp-rpl/unicast-receiver.c create mode 100644 examples/ipv6/simple-udp-rpl/unicast-sender.c diff --git a/examples/ipv6/simple-udp-rpl/Makefile b/examples/ipv6/simple-udp-rpl/Makefile new file mode 100644 index 000000000..5721b46aa --- /dev/null +++ b/examples/ipv6/simple-udp-rpl/Makefile @@ -0,0 +1,9 @@ +all: broadcast-example unicast-sender unicast-receiver +APPS=servreg-hack +CONTIKI=../../.. + +WITH_UIP6=1 +UIP_CONF_IPV6=1 +CFLAGS+= -DUIP_CONF_IPV6_RPL + +include $(CONTIKI)/Makefile.include diff --git a/examples/ipv6/simple-udp-rpl/broadcast-example.c b/examples/ipv6/simple-udp-rpl/broadcast-example.c new file mode 100644 index 000000000..575adf1ab --- /dev/null +++ b/examples/ipv6/simple-udp-rpl/broadcast-example.c @@ -0,0 +1,67 @@ +#include "contiki.h" +#include "lib/random.h" +#include "sys/ctimer.h" +#include "sys/etimer.h" +#include "net/uip.h" +#include "net/uip-ds6.h" + +#include "simple-udp.h" + + +#include +#include + +#define UDP_PORT 1234 + +#define SEND_INTERVAL (10 * CLOCK_SECOND) +#define SEND_TIME (random_rand() % (SEND_INTERVAL)) + +static struct simple_udp_connection broadcast_connection; + +/*---------------------------------------------------------------------------*/ +PROCESS(broadcast_example_process, "UDP broadcast example process"); +AUTOSTART_PROCESSES(&broadcast_example_process); +/*---------------------------------------------------------------------------*/ +static void +receiver(struct simple_udp_connection *c, + const uip_ipaddr_t *sender_addr, + uint16_t sender_port, + const uip_ipaddr_t *receiver_addr, + uint16_t receiver_port, + const uint8_t *data, + uint16_t datalen) +{ + printf("Data received on port %d from port %d with length %d\n", + receiver_port, sender_port, datalen); +} +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(broadcast_example_process, ev, data) +{ + static struct etimer periodic_timer; + static struct etimer send_timer; + + PROCESS_BEGIN(); + + simple_udp_register(&broadcast_connection, UDP_PORT, + NULL, UDP_PORT, + receiver); + + etimer_set(&periodic_timer, SEND_INTERVAL); + while(1) { + + PROCESS_YIELD_UNTIL(ev == PROCESS_EVENT_TIMER); + if(data == &periodic_timer) { + etimer_reset(&periodic_timer); + etimer_set(&send_timer, SEND_TIME); + } + if(data == &send_timer) { + uip_ipaddr_t addr; + printf("Sending broadcast\n"); + uip_create_linklocal_allnodes_mcast(&addr); + simple_udp_sendto(&broadcast_connection, "hej\n", 4, &addr); + } + } + + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ diff --git a/examples/ipv6/simple-udp-rpl/unicast-receiver.c b/examples/ipv6/simple-udp-rpl/unicast-receiver.c new file mode 100644 index 000000000..c0fe4872d --- /dev/null +++ b/examples/ipv6/simple-udp-rpl/unicast-receiver.c @@ -0,0 +1,108 @@ +#include "contiki.h" +#include "lib/random.h" +#include "sys/ctimer.h" +#include "sys/etimer.h" +#include "net/uip.h" +#include "net/uip-ds6.h" +#include "net/uip-debug.h" + +#include "simple-udp.h" +#include "servreg-hack.h" + +#include "net/rpl/rpl.h" + +#include +#include + +#define UDP_PORT 1234 +#define SERVICE_ID 190 + +#define SEND_INTERVAL (10 * CLOCK_SECOND) +#define SEND_TIME (random_rand() % (SEND_INTERVAL)) + +static struct simple_udp_connection unicast_connection; + +/*---------------------------------------------------------------------------*/ +PROCESS(unicast_receiver_process, "Unicast receiver example process"); +AUTOSTART_PROCESSES(&unicast_receiver_process); +/*---------------------------------------------------------------------------*/ +static void +receiver(struct simple_udp_connection *c, + const uip_ipaddr_t *sender_addr, + uint16_t sender_port, + const uip_ipaddr_t *receiver_addr, + uint16_t receiver_port, + const uint8_t *data, + uint16_t datalen) +{ + printf("Data received on port %d from port %d with length %d: '%s'\n", + receiver_port, sender_port, datalen, data); +} +/*---------------------------------------------------------------------------*/ +static uip_ipaddr_t * +set_global_address(void) +{ + static uip_ipaddr_t ipaddr; + int i; + uint8_t state; + + uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0); + uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr); + uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF); + + printf("IPv6 addresses: "); + for(i = 0; i < UIP_DS6_ADDR_NB; i++) { + state = uip_ds6_if.addr_list[i].state; + if(uip_ds6_if.addr_list[i].isused && + (state == ADDR_TENTATIVE || state == ADDR_PREFERRED)) { + uip_debug_ipaddr_print(&uip_ds6_if.addr_list[i].ipaddr); + printf("\n"); + } + } + + return &ipaddr; +} +/*---------------------------------------------------------------------------*/ +static void +create_rpl_dag(uip_ipaddr_t *ipaddr) +{ + struct uip_ds6_addr *root_if; + + root_if = uip_ds6_addr_lookup(ipaddr); + if(root_if != NULL) { + rpl_dag_t *dag; + uip_ipaddr_t prefix; + + rpl_set_root(ipaddr); + dag = rpl_get_dag(RPL_ANY_INSTANCE); + uip_ip6addr(&prefix, 0xaaaa, 0, 0, 0, 0, 0, 0, 0); + rpl_set_prefix(dag, &prefix, 64); + PRINTF("created a new RPL dag\n"); + } else { + PRINTF("failed to create a new RPL DAG\n"); + } +} +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(unicast_receiver_process, ev, data) +{ + uip_ipaddr_t *ipaddr; + + PROCESS_BEGIN(); + + servreg_hack_init(); + + ipaddr = set_global_address(); + + create_rpl_dag(ipaddr); + + servreg_hack_register(SERVICE_ID, ipaddr); + + simple_udp_register(&unicast_connection, UDP_PORT, + NULL, UDP_PORT, receiver); + + while(1) { + PROCESS_WAIT_EVENT(); + } + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ diff --git a/examples/ipv6/simple-udp-rpl/unicast-sender.c b/examples/ipv6/simple-udp-rpl/unicast-sender.c new file mode 100644 index 000000000..e8ebadaa8 --- /dev/null +++ b/examples/ipv6/simple-udp-rpl/unicast-sender.c @@ -0,0 +1,105 @@ +#include "contiki.h" +#include "lib/random.h" +#include "sys/ctimer.h" +#include "sys/etimer.h" +#include "net/uip.h" +#include "net/uip-ds6.h" +#include "net/uip-debug.h" + +#include "node-id.h" + +#include "simple-udp.h" +#include "servreg-hack.h" + +#include +#include + +#define UDP_PORT 1234 +#define SERVICE_ID 190 + +#define SEND_INTERVAL (60 * CLOCK_SECOND) +#define SEND_TIME (random_rand() % (SEND_INTERVAL)) + +static struct simple_udp_connection unicast_connection; + +/*---------------------------------------------------------------------------*/ +PROCESS(unicast_sender_process, "Unicast sender example process"); +AUTOSTART_PROCESSES(&unicast_sender_process); +/*---------------------------------------------------------------------------*/ +static void +receiver(struct simple_udp_connection *c, + const uip_ipaddr_t *sender_addr, + uint16_t sender_port, + const uip_ipaddr_t *receiver_addr, + uint16_t receiver_port, + const uint8_t *data, + uint16_t datalen) +{ + printf("Data received on port %d from port %d with length %d\n", + receiver_port, sender_port, datalen); +} +/*---------------------------------------------------------------------------*/ +static void +set_global_address(void) +{ + uip_ipaddr_t ipaddr; + int i; + uint8_t state; + + uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0); + uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr); + uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF); + + printf("IPv6 addresses: "); + for(i = 0; i < UIP_DS6_ADDR_NB; i++) { + state = uip_ds6_if.addr_list[i].state; + if(uip_ds6_if.addr_list[i].isused && + (state == ADDR_TENTATIVE || state == ADDR_PREFERRED)) { + uip_debug_ipaddr_print(&uip_ds6_if.addr_list[i].ipaddr); + printf("\n"); + } + } +} +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(unicast_sender_process, ev, data) +{ + static struct etimer periodic_timer; + static struct etimer send_timer; + + PROCESS_BEGIN(); + + servreg_hack_init(); + + set_global_address(); + + simple_udp_register(&unicast_connection, UDP_PORT, + NULL, UDP_PORT, receiver); + + etimer_set(&periodic_timer, SEND_INTERVAL); + while(1) { + + PROCESS_YIELD_UNTIL(ev == PROCESS_EVENT_TIMER); + if(data == &periodic_timer) { + etimer_reset(&periodic_timer); + etimer_set(&send_timer, SEND_TIME); + } + if(data == &send_timer) { + uip_ipaddr_t *addr; + addr = servreg_hack_lookup(SERVICE_ID); + if(addr != NULL) { + char buf[20]; + + printf("Sending unicast to "); + uip_debug_ipaddr_print(addr); + printf("\n"); + sprintf(buf, "From %d", node_id); + simple_udp_sendto(&unicast_connection, buf, strlen(buf) + 1, addr); + } else { + printf("Service %d not found\n", SERVICE_ID); + } + } + } + + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/