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?
Das man beim Entwickeln keinen Knoten im Hirn bekommt und die Bytes sauber trennt.
Ist es überhaupt möglich mit dem LWIP-Stack zwei Kommunikationsinstanzen UDP + TCP auf einem Mikrocontroller zum Laufen zu bringen?
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
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.
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
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.
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
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, ðernetif_init, ðernet_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 | }
|
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
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.
Guten Morgen, mir ist noch immer nicht klar wie ich TCP und UDP ohne RTOS mit dem LWIP-Stack zum Laufen bekommen kann.
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.