Forum: Mikrocontroller und Digitale Elektronik lwIP einfache Hello Word string senden.


von etech91 (Gast)


Lesenswert?

Ich möchte eine simple nachricht über die TCP/IP PRotokoll schicken...
Der Code ist nicht gerade sauber rorgrammiert das ist mir bewusst aber 
im Prinzip sollte das so funktionieren ? Mit Wireshark hab ich versucht 
etwas zu empfangen aber iwie sehe ich da nichts. Es gibt keine 
Fehlermeldung.

was meint ihr ?

Anpingen funktioniert die verbindung ist da.
mein Code:
1
#include <DAVE3.h>      //Declarations from DAVE3 Code Generation (includes SFR declaration)
2
3
4
/*Local port waiting for packets*/
5
#define LOCAL_PORT_RECEIVE           (45555)
6
/*Local port used to echo back the packet*/
7
#define LOCAL_PORT_TRANSMIT     (45174)
8
/*Destination port of echoed packet*/
9
#define TRANSMIT_PORT_DESTINATION   (45175)
10
struct tcp_pcb *pcb_tr;
11
err_t err;
12
13
14
15
static err_t
16
close_con()
17
{
18
  tcp_arg(pcb_tr, NULL);
19
  tcp_sent(pcb_tr, NULL);
20
  tcp_close(pcb_tr);
21
}
22
23
err_t Connected()
24
{
25
    char data[] = "HELLO TCP WORLD";
26
27
    err = tcp_write(pcb_tr, &data, 20, 0);
28
29
    err = tcp_output(pcb_tr);           //to make it send the data immediately
30
31
    tcp_sent(pcb_tr, close_con);
32
    return err;
33
}
34
35
struct tcp_pcb * tcp_init_comm(unsigned int port) {
36
  /* start the TCP server */
37
  struct tcp_pcb *pcb;
38
  /* create new TCP PCB structure */
39
  pcb_tr = tcp_new();
40
  tcp_bind(pcb_tr, IP_ADDR_ANY, port);
41
    return pcb_tr;
42
43
}
44
45
int main(void)
46
{
47
  DAVE_Init();      // Initialization of DAVE Apps
48
  lwIPStack_init();    //Start Lwip stack
49
50
  struct ip_addr serverIP;
51
  uint16_t bufspace;  
52
53
  IP4_ADDR( &serverIP, 192, 168, 0, 40);  //PC
54
55
  //Create
56
  pcb_tr=tcp_init_comm(TRANSMIT_PORT_DESTINATION);
57
  
58
59
  //Connect
60
    if(pcb_tr != NULL)
61
      err = tcp_connect(pcb_tr, &serverIP,TRANSMIT_PORT_DESTINATION,0);
62
    
63
    if (err == ERR_OK)
64
      bufspace = tcp_sndbuf(pcb_tr);
65
66
    if (bufspace)
67
        err = Connected();
68
69
70
  while(1)
71
  {
72
73
        
74
  }
75
  return 0;
76
}

von Rico W. (bitkipper)


Lesenswert?

Hier fehlt auf den ersten Blick eine ganze Menge. Wo ist dein 
Protokolltyp genannt? Es gibt keinen Listener. LwIP bietet hier 
tcp_listen() an. Du sagst auch nichts genaueres von wo nach wohin du 
senden willst.
Schon hier geguckt?
http://lwip.wikia.com/wiki/Raw/TCP

von etech91 (Gast)


Lesenswert?

okey das Listener wusste ich jetzt nicht :S

ich sende doch an die Adresse serverIP ?

auf der seite war ich mal glaub ich ...

okey ich schaue mir das mal noch mal an...

von etech91 (Gast)


Lesenswert?

void TCP_CONNECTION_INIT(void)
{
  struct tcp_pcb *pcb;

  /* Create a new TCP control block  */
  pcb = tcp_new();

  /* Assign to the new pcb a local IP address and a port number */
  /* Using IP_ADDR_ANY allow the pcb to be used by any local interface 
*/
  tcp_bind(pcb, IP_ADDR_ANY, PORT);


  /* Set the connection to the LISTEN state */
  pcb = tcp_listen(pcb);

  /* Specify the function to be called when a connection is established 
*/
  tcp_accept(pcb, Hello_Accept);

}

void Hello_Accept(void *arg, struct tcp_pcb *tpcb, err_t err)
{

  tcp_arg(pcb, mem_calloc(sizeof(struct name), 1));

  tcp_recv(pcb, tcp_receive_handler);
}

von GuckstDuHier (Gast)


Lesenswert?


von Stefan F. (Gast)


Lesenswert?

Ich bin ziemlich sicher, dass deine leere while-Schleife nicht korrekt 
ist. Irgendwo muss der lwIP STack regelmäßig aufgerufen werden. 
Normalerweise genau in dieser Hauptschleife.

Siehe: 
http://lwip.wikia.com/wiki/LwIP_with_or_without_an_operating_system

von etech91 (Gast)


Lesenswert?

Alles klar, Stefan. Ich schaus mir noch mal an. Habe wenig erfahrung mit 
Netzwerkprotokolle.

@GuckstDuHier danke für die Info.

von etech91 (Gast)


Lesenswert?

@Stefan du meinst die funktion tcp_tmr() die alle 250ms aufgerufen 
werden muss ?

so zBsp. :

#define SYSTEMTICK_PERIOD_MS  10

/*tcp.h */
#define TCP_TMR_INTERVAL       250  /* The TCP timer interval in 
milliseconds. */


void Time_Update(void)
{
  LocalTime += SYSTEMTICK_PERIOD_MS;
}

void LwIP_Periodic_Handle(__IO uint32_t localtime)
{

  /* TCP periodic process every 250 ms */
  if (localtime - TCPTimer >= TCP_TMR_INTERVAL)
  {
    TCPTimer =  localtime;
    tcp_tmr();
  }
}
void System_Periodic_Handle(void)
{

  LwIP_Periodic_Handle(LocalTime);
}


while(1){
System_Periodic_Handle();
}

von etech91 (Gast)


Lesenswert?

verstehe ich das richtig? Es gibt zwei arten eine Verbindung aufzubauen, 
aktive und passive.

http://lwip.wikia.com/wiki/Raw/TCP

die Aktive ist, ich baue die Verbindung direkt auf und die passive, 
wartet drauf bis eine Verbindung von ausen kommt.

 Die Funktion die ich gepostet habe siehe oben.

TCP_CONNECTION_INIT(); wäre die Passive variante korrekt ?

von Stefan F. (Gast)


Lesenswert?

Egal ob aktiv oder passiv, in beiden Fällen brauchst du eine 
Hauptschleife, in der der lwIP Stack möglichst häudig aufgerufen wird, 
sowie einen Timer, der regelmäßig alle 250ms aufgerufen wird.

Hintergrund ist der:

In der Hauptschleife überprüft der Stack durch Hardwarezugriffe, ob ein 
Paket empfangen wurde. Wenn ja, dann wird es verarbeitet.

Der Timer ist wiederum dafür verantwortlich, dass zeitgesteuerte Dinge 
zum richtigen zeitpunkt passieren. Zum beispiel die Wiederholung eines 
Sendevorgangs, wenn der Empfänger nicht antwortet.

Bei µIP konnte der Timer wahlweise im Interrupt abgearbeitet werden, 
oder in der Hauptschleife, was die bevorzugte Methode war. Der 
Timer-Interrupt hat dann nur alle 250ms ein Flag gesetzt das "die zeit 
ist abgelaufen" bedeutete. In der Hauptschleife wurde dieses Flag bei 
jedem Durchlauf abgefragt und wenn das Flag gesetzt war, wurde die 
Timer-Funktion von µIP aufgerufen.

Bei lwIP könnte das ein bisschen anders ablaufen - ich kenne mich damit 
nicht aus. Aber ganz sicher brauchst du eine Hauptschleife, welche lwIP 
möglichst oft aufruft. Denn je seltener du lwIP aufrufst, umso langsamer 
wird es. Wenn du gar keine Hauptschleife hast, werden nur ganz primitive 
Sachen funktionieren, wie das Senden eines einzelnen UDP Paketes ohne 
Wiederholung und ohne Verarbeitung der Response.

von etech91 (Gast)


Lesenswert?

JAp das ist korrekt. Steht auch im Wiki genau so drin,

After lwip_init() is called, you must call tcp_tmr() every 
TCP_TMR_INTERVAL milliseconds (default is 250 milliseconds).

von GuckstDuHier (Gast)


Lesenswert?

Hast du dir auch schonmal die generelle TCP-Statemachine angesehen?
http://de.wikipedia.org/wiki/Transmission_Control_Protocol#Verbindungsaufbau_und_-abbau

Anhand dessen kannst du dir auch die fertigen Beispiele ansehen und 
vergleichen. Das hilft schonmal nur zum Verständnis des Protokolls. Und 
dann kannst du dir die Eigenheiten von LwIP noch einmal zu Gemüte 
führen.

von Peter L. (dermitdemwolftanzt)


Lesenswert?

wurde das Problem gelöst, und kannst du vielleicht deine Lösung hier 
posten?

von Dewa (Gast)


Lesenswert?

CSS mit Media Queries und Image Sets hab ich in der Richtung erstmal 
links ligeen lassen. Ist auf tigion.de ja testweise nur ne reine 
Javascript Lf6sung die auf  window.devicePixelRatio  basiert.Egal ob 
geringer Marktanteil und so   neue Techniken probiere ich halt gern aus. 
dcbrigens sieht es schon verdammt gut auf einem iPad 3/4 aus, wenn die 
Grafiken entsprechend hochauflf6send sind. Danach hatte ich das Geffchl 
alles andere im WWW we4re leicht unscharf.

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.