Benutzer-Werkzeuge

Webseiten-Werkzeuge


contiki:simple-udp-workshop

Dies ist eine alte Version des Dokuments!


Workshop: Erstellung eines einfachen UDP Service mit Contiki

1. Installation der Entwicklungsumgebung: Instant Contiki

  • Die Installation von Instant Contiki benötigt VMWare Player, oder Virtualbox
  • 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

  1. 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.

  1. Erstellen Sie folgendes Makefile im Verzeichnis (für IPv4):
CONTIKI_PROJECT = simpleUDP
all: $(CONTIKI_PROJECT)
 
WITH_UIP=1
 
CONTIKI = ../..
include $(CONTIKI)/Makefile.include

Für die Verwendung von IPv6 verwenden Sie das folgende Makefile:

CONTIKI_PROJECT = simpleUDP
all: $(CONTIKI_PROJECT)
 
UIP_CONF_IPV6=1
 
CFLAGS += -DUIP_CONF_IPV6=1
 
CONTIKI = ../..
include $(CONTIKI)/Makefile.include
  1. 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-Service

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-Service. 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

  1. Pingen Sie den Contiki UDP-Service:
    ping 172.18.0.2
  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.

Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
contiki/simple-udp-workshop.1432129738.txt.gz · Zuletzt geändert: 2017/01/24 18:49 (Externe Bearbeitung)