Forum: Mikrocontroller und Digitale Elektronik Luminary LM3S6918 mit lwIP Stack - IP Probleme


von Rogger R. (manta)


Lesenswert?

Hallo!

Also ich habe ein Projekt am Laufen, wobei ich den µC LM3S6918 von 
Stellaris Luminary verwende. Ich lese ID - Tags von einem RFID System 
via UART in den µC ein. Das funktioniert wunderbar. Nur jetzt will ich 
diese IDs an eine Datenbank im Intranet schicken. Ich habe mich deswegen 
mal erkundigt und habe mir auch dieses Datenblatt/Beschreibung des lwIP 
- Stacks durchgelesen und habe mal versucht eine TCP Verbindung zu 
öffnen.

Programmiert wird in: C
Als Kompiler verwende ich: Keil µVision 4.0
Programmiert wird mit dem: ULINK2 JTAG Adapter

Das ganze soll dann in etwa das machen:

Daten von RFID einlesen und dann via TCP zu einer Datenbank schicken.
Ich kann allerdings nicht mal den TCP - Kanal aufbauen, den ich 
dazubenötige. Ich habe mir das so gedacht, dass ich "einfach" einen 
Kanal aufmache und am Server einen Serverprozess laufen lasse, der mir 
die Datenbank managet und mit dem der µC kommuniziert. Jedoch scheitert 
das Ganze schon bei dem TCP - Kanal. Ich verwende die raw/native lwIP 
Version.
Das Problem das ich ermitteln konnte liegt darin:

Der µC macht richtig beim Server (indem Fall noch mein Pc) eine ARP - 
Anfrage. Diese wird richtig von meinem Pc beantwortet und dann beginnt 
der µC mit dem Senden des SYN - Flags. Das soll er natürlich auch 
machen. Allerdings ändert er dazwischen, also nach der ARP - Anfrage und 
noch vor dem Senden des SYN - Flags, seine IP und schickt das ganze dann 
nicht an den Server, sondern an sich selbst. Er ändert seine IP also 
nicht nur, sondern schickt das SYN - Flag in einem "Loop" an sich 
selbst.

Nach langem Suchen bin ich dann auf einen ähnlichen Theard hier im Forum 
gestoßen.

Beitrag "lwIP - TCP/IP Stack"

Hier wird bei der letzten Antwort

b) The problem might be that the struct ip_addr pointer points into the
pbuf at the place of the 'from' address in the IP header. At the time
the IP layer tries to send the packet, that 'from' address contains your
local IP address. Try to copy the ip address to a local address on the
stack:

struct ip_addr addr2;
addr2.addr = addr->addr;
udp_sendto(pcb, p, &addr2, port);


gesagt, dass ich die addresse also in eine andere lokale addresse 
kopieren soll und dann diese verwenden sonst schickt der µC das IP - 
Packet an sich selbst. Mal abgesehen davon, dass in dem Beispiel jetzt 
eine UDP - Verbindung und nicht eine TCP - Verbindung verwendet wird.

Also meine Frage: wenn ich die Addresse von einer anderen Addresse 
nehme, dann "Loop" ich das IP - Packet nicht mehr, aber geht dann auch 
der Fehler weg, dass der µC einfach seine IP ändert, oder hat das andere 
Gründe als Ursache?

Außerdem:

addr2.addr

Das .addr bedeutet was genau? Und wie/wo verwende ich das in meinem 
Code?

Falls es erforderlich sein sollte, der Teil meines Codes, indem ich den 
TCP - Kanal aufbauen will:
1
struct tcp_pcb *pcb_new;
2
struct ip_addr *addr1, *addr2;
3
4
static void tcp_conn_fatal_error(void *arg, err_t err){  
5
6
tcp_arg(pcb_new, NULL);
7
tcp_close(pcb_new);
8
9
}
10
11
static err_t tcp_conn_accept(void *arg, struct tcp_pcb *pcb, err_t err){
12
13
tcp_setprio(pcb_new, TCP_PRIO_MAX);
14
return ERR_OK;
15
16
}
17
18
err_t tcp_kanal_open(void){
19
20
  unsigned char pucMACAddr[6];
21
  err_t error_err;
22
23
  pucMACAddr[0] = 0xAB;
24
  pucMACAddr[1] = 0xCD;
25
  pucMACAddr[2] = 0xEF;
26
  pucMACAddr[3] = 0xFE;
27
  pucMACAddr[4] = 0xDC;
28
  pucMACAddr[5] = 0xBA;
29
30
  IP4_ADDR(addr1, 192,168,0,100);
31
32
  addr2.addr = addr1->addr2;    --> WIE KOPIER ICH DIE SO RICHTIG??
33
34
  lwIPInit(pucMACAddr, 0xC0A80006, 0xFFFFFF00, 0xC0A80064, IPADDR_USE_STATIC);
35
36
  #if NO_SYS
37
38
    tcp_init();
39
    
40
    pcb_new=tcp_new();
41
    
42
    error_err=tcp_bind(pcb_new,IP_ADDR_ANY,80);
43
44
    if(error_err!=ERR_OK){
45
      return ERR_VAL;
46
    }
47
48
    tcp_arg(pcb_new,ERR_OK);
49
  
50
    tcp_err(pcb_new, tcp_conn_fatal_error);
51
    
52
    error_err=tcp_connect(pcb_new,addr2,80,tcp_conn_accept);
53
    
54
    if(error_err!=ERR_OK){
55
      return ERR_VAL;
56
    }
57
58
  #endif
59
60
  return ERR_OK;
61
62
}

Ich würde mich riesig über ein bisschen Hilfe freuen.

lg, Manta

von Nautar (Gast)


Lesenswert?

Kenn mich damit net aus, werde aber demnächst amit anfangen. Structuren 
am Besten mit memcpy kopieren .... das könnte helfen.

addr2.addr = addr1->addr2;    --> WIE KOPIER ICH DIE SO RICHTIG??

von etec (Gast)


Lesenswert?

Hi,
ich hoffe du warst in dem vergangenen Jahr erfolgreich und hast dein 
Problem gelöst. das .adr ist ein Zugriff auf ein Structelement. Das .adr 
verwendet man bevor man einen Socket erstellt. Schau dir mal folgendes 
Tutorial an.
http://www.c-worker.ch/tuts/udp.php#diff

Ist zwar für den PC, wird abervon den meisten TCP/IP Stacks in ähnlicher 
Form unterstützt
LG
etec

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.