Forum: Mikrocontroller und Digitale Elektronik LWIP Stack: TCP + UDP


von entwickler (Gast)


Lesenswert?

Hallo,

für die Ethernet Kommunikation wird auf einem Mikrocontroller der 
LWIp-Stack eingesetzt.

Nun meine Frage: Können UDP und TCP gemeinsam benutzt werden in einer 
Applikation? Wenn ja, was müsste man beachten?

von Jim M. (turboj)


Lesenswert?

Das man beim Entwickeln keinen Knoten im Hirn bekommt und die Bytes 
sauber trennt.

von entwickler (Gast)


Lesenswert?

Danke für deine hilfreiche Anwort.

von entwickler (Gast)


Lesenswert?

Ist es überhaupt möglich mit dem LWIP-Stack zwei Kommunikationsinstanzen 
UDP + TCP auf einem Mikrocontroller zum Laufen zu bringen?

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Warum nicht? Was sind denn das bittschön für fragen?
Setz die defines und probiers aus...

entwickler schrieb:
> Können UDP und TCP gemeinsam benutzt werden in einer
> Applikation? Wenn ja, was müsste man beachten?

Da meine Glaskugel grade zur Reparatur ist, weis ich leider nicht was 
denn nun konkret geplant ist

von entwickler (Gast)


Lesenswert?

Ich habe beide defines für UDP und für TCP auf 1 gesetzt. In der 
Testapplikation wird zuerst die UDP Kommunikation installiert und im 
Anschluss die TCP Kommunikation.

Udp:
1
LWIP_Init();
2
upcb = udp_new();
3
if (upcb)
4
{
5
  udp_bind(upcb, IP_ADDR_ANY, UDP_SERVER_PORT);
6
  udp_recv(upcb, udp_server_receive_callback, NULL);
7
}

Tcp:
1
LWIP_Init();
2
tpcb = tcp_new();
3
if (tpcb != NULL)
4
{
5
  tcp_bind(tpcb, IP_ADDR_ANY, TCP_SERVER_PORT);
6
  tpcb = tcp_listen(tpcb);
7
  tcp_accept(tpcb, tcp_callback_accept);
8
}

Das Programm bleibt allerdings in der Initialisierungsroutine LWIP_Init 
stehen. In dieser Routine wird die Funktion lwip_init vom Stack 
aufgerufen.

von Michael U. (amiga)


Lesenswert?

Hallo,

nur vom Drüberschauen: LWIP_Init(); scheint den Stack zu initialisieren.
Vielleicht hat er nur kein Verständnis dafür, wenn das 2x passieren 
soll?

Gruß aus Berlin
Michael

von Ratgeber (Gast)


Lesenswert?

UDP und TCP nacheinander zu nutzen geht auf jeden Fall, das nutze ich so 
in einem Projekt.
Ob's auch gleichzeitig geht weiß ich nicht, würde aber vermuten: ja.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Angehängte Dateien:

Lesenswert?

Wie schon rausgefunden wurde, ist 2 mal LWIP_Init(); aufrufen keine gute 
Idee.
Ansonsten hat lwip nen brauchbares wiki wo erklärt wird wie man das in 
sein System einbindet.
Weiterhin empfielt es sich beim ersten nutzen die Debugausgaben 
einzuschalten und auf nen UART zu legen, diese sind sehr informativ.

Damit eine Serveranwendung auf mehreren Sockets lauschen kann wurde die 
select Anweisung gefunden.
Dieser ist es egal ob der eingehende Socket jetzt UDP oder TCP ist.
Dazu im Anhang etwas Code für Linux als Beispiel.
Lauscvht auf UDP/TCp, nimmt 2 Zahlene tngegen, rechnet was aus und 
schickt das Ergebnis zurück.
Für lwip muss das nur ein kleinw enig angepasst werden.

Infos zu select:
http://www.tutorialspoint.com/unix_system_calls/_newselect.htm
https://www.gnu.org/software/libc/manual/html_node/Server-Example.html
https://github.com/goertzenator/lwip/blob/master/contrib-1.4.0/apps/socket_examples/socket_examples.c

von entwickler (Gast)


Lesenswert?

Vielen Dank für deinen Beitrag. Leider kann ich SOCKET mit dem 
LWIP-Stack nicht nutzen, da ich kein RTOS verwende. Gibt es noch eine 
weitere Möglichkeit mit LWIP TCP und UDP zu benutzen?

1
void LWIP_Init(void)
2
{
3
  struct ip_addr ipaddr;
4
  struct ip_addr netmask;
5
  struct ip_addr gw;
6
7
  IP4_ADDR(&ipaddr, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3);
8
  IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1 , NETMASK_ADDR2, NETMASK_ADDR3);
9
  IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
10
11
  lwip_init();
12
13
  /* - netif_add(struct netif *netif, struct ip_addr *ipaddr,
14
  struct ip_addr *netmask, struct ip_addr *gw,
15
  void *state, err_t (* init)(struct netif *netif),
16
  err_t (* input)(struct pbuf *p, struct netif *netif))
17
18
  Adds your network interface to the netif_list. Allocate a struct
19
  netif and pass a pointer to this structure as the first argument.
20
  Give pointers to cleared ip_addr structures when using DHCP,
21
  or fill them with sane numbers otherwise. The state pointer may be NULL.
22
23
  The init function pointer must point to a initialization function for
24
  your ethernet netif interface. The following code illustrates it's use.*/
25
  netif_add(&xnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &ethernet_input);
26
27
  /*  Registers the default network interface.*/
28
  netif_set_default(&xnetif);
29
30
  /* Set Ethernet link flag */
31
  xnetif.flags |= NETIF_FLAG_LINK_UP;
32
33
  /* When the netif is fully configured this function must be called.*/
34
  netif_set_up(&xnetif);
35
}

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Dann is ja noch einfacher, der Reihe nach in der raw API durchpollen ob 
da jetz grade nen paket ankam oder nicht:
http://www.st.com/resource/en/application_note/dm00036052.pdf

von entwickler (Gast)


Lesenswert?

Ich kann dir nicht ganz folgen. Wie meinst du das genau?

von entwickler (Gast)


Lesenswert?

UDP Server Initialisierung:
1
upcb = udp_new();
2
if (upcb)
3
{
4
  udp_bind(upcb, IP_ADDR_ANY, UDP_SERVER_PORT);
5
  udp_recv(upcb, udp_server_receive_callback, NULL);
6
}
7
8
TCP Server Initialisierung:
9
[c]
10
tpcb = tcp_new();
11
if (tpcb != NULL)
12
{
13
  tcp_bind(tpcb, IP_ADDR_ANY, TCP_SERVER_PORT);
14
  tpcb = tcp_listen(tpcb);
15
  tcp_accept(tpcb, tcp_callback_accept);
16
}

Wenn ich beide Initialisierungen ausführe, dann bleibt mein Programm bei 
ankommenden Packete hängen.

von entwickler (Gast)


Lesenswert?

Guten Morgen,

mir ist noch immer nicht klar wie ich TCP und UDP ohne RTOS mit dem 
LWIP-Stack zum Laufen bekommen kann.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

> Autor: Mw En (Firma: fritzler-avr.de) (fritzler)
> Datum: 02.08.2016 12:23

> Autor: entwickler (Gast)
> Datum: 02.08.2016 12:28

Hast das dicke pdf also in 5min gelesen, verstehe.
Ich verstehe, dass du keine Lust hast dich ausführlich mit dem Thema zu 
beschäftigen und Dokus zu lesen.
Ich bin raus aus dem Fred hier.

von Stefan F. (Gast)


Lesenswert?

Das ist jetzt schon der dritte Thread dieser Art, wo es im Grunde 
genommen um das Gleiche Thema geht.

@entwickler:

Beispiele für deine konkreten fall wirst du kaum finden. Sei froh, dass 
es überhaupt einen freien IP Stack gibt.

Der Fachbereich, den du Dir da ausgesucht hast, ist schon recht komplex. 
Da kann man nicht einfach so ein paar Bausteine (nach Arduino Art) 
zusammen stecken und es läuft.

Du solltest schon bereit sein, dich einige Monate mit den Frameworks zu 
beschäftigen. Lies die gesamte Doku und den Quelltext und verstehe jede 
einzelne Zeile. Erst danach wirst du imstande sein, anständige 
Anwendungen zu entwicklen.

Ansonsten klass es besser ganz bleiben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.