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