5585d72c86
functions for converting between host and network byte order. These names are the de facto standard names for this functionality because of the original BSD TCP/IP implementation. But they cause problems for uIP/Contiki: some platforms define these names themselves (Mac OS, most notably), causing compilation problems for Contiki on those platforms. This commit changes all htons to uip_htons instead. Same goes for htonl, ntohs, and ntohl. All-caps versions as well.
90 lines
2.5 KiB
C
90 lines
2.5 KiB
C
/*
|
|
* This file contains an example of how a Contiki program looks.
|
|
*
|
|
* The program opens a UDP broadcast connection and sends one packet
|
|
* every second.
|
|
*/
|
|
|
|
#include "contiki.h"
|
|
#include "contiki-net.h"
|
|
|
|
/*
|
|
* All Contiki programs must have a process, and we declare it here.
|
|
*/
|
|
PROCESS(example_program_process, "Example process");
|
|
|
|
/*
|
|
* To make the program send a packet once every second, we use an
|
|
* event timer (etimer).
|
|
*/
|
|
static struct etimer timer;
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/*
|
|
* Here we implement the process. The process is run whenever an event
|
|
* occurs, and the parameters "ev" and "data" will we set to the event
|
|
* type and any data that may be passed along with the event.
|
|
*/
|
|
PROCESS_THREAD(example_program_process, ev, data)
|
|
{
|
|
/*
|
|
* Declare the UDP connection. Note that this *MUST* be declared
|
|
* static, or otherwise the contents may be destroyed. The reason
|
|
* for this is that the process runs as a protothread, and
|
|
* protothreads do not support stack variables.
|
|
*/
|
|
static struct uip_udp_conn *c;
|
|
|
|
/*
|
|
* A process thread starts with PROCESS_BEGIN() and ends with
|
|
* PROCESS_END().
|
|
*/
|
|
PROCESS_BEGIN();
|
|
|
|
/*
|
|
* We create the UDP connection to port 4321. We don't want to
|
|
* attach any special data to the connection, so we pass it a NULL
|
|
* parameter.
|
|
*/
|
|
c = udp_broadcast_new(UIP_HTONS(4321), NULL);
|
|
|
|
/*
|
|
* Loop for ever.
|
|
*/
|
|
while(1) {
|
|
|
|
/*
|
|
* We set a timer that wakes us up once every second.
|
|
*/
|
|
etimer_set(&timer, CLOCK_SECOND);
|
|
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer));
|
|
|
|
/*
|
|
* Now, this is a the tricky bit: in order for us to send a UDP
|
|
* packet, we must call upon the uIP TCP/IP stack process to call
|
|
* us. (uIP works under the Hollywood principle: "Don't call us,
|
|
* we'll call you".) We use the function tcpip_poll_udp() to tell
|
|
* uIP to call us, and then we wait for the uIP event to come.
|
|
*/
|
|
tcpip_poll_udp(c);
|
|
PROCESS_WAIT_EVENT_UNTIL(ev == tcpip_event);
|
|
|
|
/*
|
|
* We can now send our packet.
|
|
*/
|
|
uip_send("Hello", 5);
|
|
|
|
/*
|
|
* We're done now, so we'll just loop again.
|
|
*/
|
|
}
|
|
|
|
/*
|
|
* The process ends here. Even though our program sits is a while(1)
|
|
* loop, we must put the PROCESS_END() at the end of the process, or
|
|
* else the program won't compile.
|
|
*/
|
|
PROCESS_END();
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|