Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Workshop: Erstellung eines einfachen UDP Service mit Contiki
1. Installation der Entwicklungsumgebung: Instant Contiki
- Anmeldung an Instant Contiki mit dem Passwort:
user
- Die folgende Beschreibung bezieht sich immer auf das Quellcode-Verzeichnis:
/home/user/contiki-2.7/
2. Anpassungen des Quellcodes
Im Workshop werden Contiki-Anwendungen direkt in Instant Contiki auf dem Entwicklungsrechner ausgeführt. Dazu müssen einige Veränderungen an Quellcode-Dateien vorgenommen werden. Im ersten Schritt wird die Anwendung für IPv4 erstellt. Die Anpassung für IPv6, sowie die Kompilierung für weitere Hardwareplattformen (Mikrocontrollerboards) ist später möglich.
2.1 Erstellen eines neuen Projekt-Verzeichnisses
- Erstellen Sie das Verzeichnis:
/home/user/contiki-2.7/examples/simpleUDP
2.2 Erstellen des Quellcodes
Für das Projekt werden eine C-Datei und ein Makefile benötigt.
- Erstellen Sie folgendes
Makefile
im Verzeichnis:
CONTIKI_PROJECT = simpleUDP all: $(CONTIKI_PROJECT) WITH_UIP=1 CONTIKI = ../.. include $(CONTIKI)/Makefile.include
- Erstellen Sie die C-Datei
simpleUDP.c
:
/** * \file * A very simple Contiki UDP application * \author * Thomas Scheffler, Sven Zehl */ #include "contiki.h" #include "contiki-lib.h" #include "contiki-net.h" #include "net/uip.h" #include "net/netstack.h" #include <stdio.h> /* For printf() */ #include <stdlib.h> #include <string.h> #include <ctype.h> #define UDP_IP_BUF ((struct uip_udpip_hdr *)&uip_buf[UIP_LLH_LEN]) /*---------------------------------------------------------------------------*/ PROCESS(simpleUDP_process, "Simple UDP process"); AUTOSTART_PROCESSES(&simpleUDP_process); /*---------------------------------------------------------------------------*/ static struct uip_udp_conn *udpconn; #define MAX_PAYLOAD_LEN 120 void bsp_udphandler(void) { char buf[MAX_PAYLOAD_LEN]; if(uip_newdata()) { /*Zeige Benutzer den Inhalt der empfangenen Nachricht*/ /*Setze letztes Byte zu Null, fuer String Ende*/ ((char *)uip_appdata)[uip_datalen()] = 0; printf("Server received: %s\n", (char *)uip_appdata); /*Verwende die Quell- als Zieladresse fuer Antwort */ uip_ipaddr_copy(&udpconn->ripaddr, &UDP_IP_BUF->srcipaddr); udpconn->rport = UDP_IP_BUF->srcport; /*Schreibe Antwort-Daten in Buffer*/ sprintf(buf, "Hello from the server"); /*Versende das Antwort-Packet*/ uip_udp_packet_send(udpconn, buf, strlen(buf)); /*Setze Adresse/Port in Verbindungsstruktur auf Null,*/ /*um von jedem Absender Daten empfangen zu koennen*/ memset(&udpconn->ripaddr, 0, sizeof(udpconn->ripaddr)); udpconn->rport = 0; } } PROCESS_THREAD(simpleUDP_process, ev, data) { PROCESS_BEGIN(); printf("UDP Echo Server\n"); /*Starte neue UDP Verbindung mit IP 0.0.0.0 und Port 0, */ /* d.h. akzeptiere jede ankommende Verbindung*/ udpconn = udp_new(NULL, UIP_HTONS(0), NULL); /*Setze den Port auf dem gelauscht wird auf 49999*/ /*HTONS() uebersetzt zur Network Byte Order*/ udp_bind(udpconn, UIP_HTONS(49999)); printf("listening on UDP port %u\n", UIP_HTONS(udpconn->lport)); while(1) { /* Warte bis ein TCP/IP Event eintrifft */ PROCESS_WAIT_EVENT_UNTIL(ev == tcpip_event); /*Rufe die Handler-Funktion auf*/ bsp_udphandler(); } PROCESS_END(); }
3. Übersetzen des UDP Services
Im Anschluss kann der UDP Service mit Hilfe des Makefiles übersetzt werden:
make TARGET=minimal-net
Sollte es notwenig sein nachträglich Änderungen am Makefile durchzuführen, sollte das Projekt vor der erneuten Übersetzung zurückgesetzt werden:
make TARGET=minimal-net clean
4. Ausführung des UDP-Servers
Nach der erfolgreichen Übersetzung kann die Anwendung gestartet werden. Das muss
mit dem Befehl sudo
erfolgen. Dazu muss evtl. das Passwort user
erneut eingegeben
werden:
sudo ./simpleUDP.minimal-net
Contiki richtet jetzt ein neues Netzwerkinterface tap0
ein und startet den UDP-Server.
Dabei werden die verwendeten Netzwerkeinstellungen angezeigt.
Anschließend kann über ein zweites Terminalfenster des Entwicklungssystems auf den Contiki-Service zugegriffen werden.
5. Interaktion mit dem UDP-Service
Starten Sie ein zweites Terminalfenster und testen Sie den Service
- Pingen Sie den Contiki UDP-Service:
ping 172.18.0.2
- Senden Sie mit dem Programm
netcat
Daten an den Contiki UDP-Service:netcat -u 172.18.0.2 49999
Beobachten Sie die Ausgabe des Services, sowie die vom Service gesendete Antwort. Sie sollten mit dem Service kommunizieren können.