UDP communication
This page documents how to send and receive raw UDP datagrams with Contiki-NG.
We focus on the module simple-udp
.
The API of this module is detailed at doxygen:simple-udp.
We present here a simple example of how to use it. First, register a socket, both at the sender and receiver:
#include "simple-udp.h"
...
static struct simple_udp_connection udp_conn;
simple_udp_register(&udp_conn, UDP_PORT, NULL, UDP_PORT, udp_rx_callback);
This registers udp_conn
, with host and remote port UDP_PORT
. No fixed remote IPv6 address is provided (third argument is NULL
). The last argument is the input callback function. Provide an implementation for it as follows:
static void
udp_rx_callback(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)
{
...
}
For each incoming datagram, the function above will be called with parameters that provide source/destination addresses and ports, and the payload.
Lastly, this is how to send a UDP datagram:
uint8_t payload[64] = { 0 };
simple_udp_sendto(&udp_conn, payload, 2, &destination_ipaddr);
You’re all set! The last parameter is the IPv6 address (type uip_ipaddr_t
) of the destination. If the connection was registered initially with a given remote, you do not need to specify the destination every time you send, simply use simple_udp_send
instead. Finally, you can also send to a particular UDP port with simple_udp_sendto_port
.