Forum: Mikrocontroller und Digitale Elektronik Webserver NETIO Paket senden?


von Hannes H. (hansl_)


Lesenswert?

Hallo Leute :)

Ich würde gerne mit dem Webserver von Ulrich Radig einfach ein kleines 
Paket (string) an einen Server in meinem Heimnetz versenden.
Zum Beispiel soll er alle 3 sekunden den String an den Server schicken.
Ist das möglich? Wie würde das denn ca funktionieren?
Ich muss ihm ja sagen an welche IP und so weiter...

Bitte um Hilfe :)

Mfg
Hannes

von STK500-Besitzer (Gast)


Lesenswert?

Der Radig-Server kann doch UDP, oder?
Dann unterstützt die Software auch noch die GET-Methode, um von 
Wetter.com das Wetter abzuholen.
Damit sollte man doch was machen können...

von Hannes H. (hansl_)


Lesenswert?

Mit dem Wetter hast du recht danke ;)
da kann man sicher was machen
Ich werd mal schauen was ich da tun kann danke :)

mfg
Hannes

von Chris M. (shortie)


Lesenswert?

was für einen Server hast du im Netzwerk?

Wenn es ein Linux/BSD-Server ist würde ich es mir so einfach wie möglich 
machen und UDP nehmen. Da kannst du als Sender den Code von Dietmar aus 
dem Thread http://ulrichradig.de/forum/viewtopic.php?f=27&t=1186 nehmen. 
Als Empfänger nimmst du ein kleines Perl-Skript. Ein Beispiel dazu 
findest du unter 
http://docstore.mik.ua/orelly/perl/cookbook/ch17_06.htm. Dort das 
Example 17.2: udpqotd

Bei dem Wetter-Code hast du TCP, was ein komplexeres Protokoll als UDP 
ist und mußt einen größeren Aufwand treiben.

Alternativ könntest du auch über SYSLOG das ganze machen. 
Beitrag "SYSLOG für Ulrich Radigs Webserver auf AVR-NET-IO"
Das hätte den Vorteil daß du auf einem Windows-Server das ganze ins 
Ereignislog schreiben könnte. Ab Windows 2003 R2 Server ist wohl ein 
Syslogserver enthalten. Anderenfalls ist 
http://www.msxfaq.de/tools/ntsyslog.htm ganz hilfreich.

von Hannes H. (hansl_)


Lesenswert?

Danke für eure Antworten hat mir sehr geholfen.
Ich kann jetzt mein Paket jede Sekunden auf die Reise schicken.
Nun hab ich folgendes Problem:

PROGMEM char WEATHER_GET_STRING[] = {"{ id : 123; value : "dd:mm:yyyy 
hh:mm:ss" }"};

Ich möchte den String genau so übergeben. Also mein eigentlicher Wert 
ist:

{ id : 123; value : "dd:mm:yyyy hh:mm:ss" }

Leider zeigt der Compiler nun eine Fehlermeldung an:

../http_get.c:28: error: expected '=', ',', ';', 'asm' or 
'__attribute__' before ':' token

Das heißt er kommt mit den Hochkommern und so nicht zurecht oder?
Hat vielleicht jemand eine Lösung für mich :)??

mfg
Hannes

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

So sollte es richtig sein (Stichwort Quoting):
1
PROGMEM char WEATHER_GET_STRING[] = "{ id : 123; value : \"dd:mm:yyyy hh:mm:ss\" }";

von Hannes H. (hansl_)


Lesenswert?

Danke es funktioniert :) du bist mein held xD

So wenn wir schon dabei wären ;)

Ich würde nun gerne wie du sicher aus dem String erkennen kannst die 
Uhrzeit versenden. Also müsste sich der Wert jede Sekunde ändern.
Das heißt ich müsste diesen Teil:

\"dd:mm:yyyy hh:mm:ss\"

als eigene Variable definieren oder? und dann zuweisen?
am besten ich teil den String und füge ihn später wieder zusammen?

mfg
Hannes

von Hannes H. (hansl_)


Angehängte Dateien:

Lesenswert?

Hallo Leute

Angehängt hab ich ein Bild von Wireshark wo ich die gesendeten Daten 
aufgezeichnet habe.
Denkt ihr ich kann so Daten an einen Server versenden?
TCP Protokoll würde passen und die Daten auch ;)

mfg
Hannes

von Simon K. (simon) Benutzerseite


Lesenswert?

Wo ist denn der Verbindungsauf und -abbau von dem TCP Socket?

von Hannes H. (hansl_)


Lesenswert?

Ich habe einfach den Code von http_get.c genommen und verändert:

void http_request (void)
{
    unsigned long index = MAX_TCP_ENTRY;
   /* if (http_get_state > 1 && http_get_state < 20) http_get_state++;

    if (http_get_state == 0)
    {
        //offnet eine Verbindung zu meinem Webserver
        HTTPC_DEBUG("ARP Request\n\r");
        unsigned int my_http_cp = 2354;
        add_tcp_app (my_http_cp, (void(*)(unsigned char))test);

        //ARP Request senden
        if(arp_request (WEATHER_SERVER_IP))
        {
            for(unsigned long a=0;a<2000000;a++){asm("nop");};

            tcp_port_open 
(WEATHER_SERVER_IP,HTONS(80),HTONS(my_http_cp));

            unsigned char tmp_counter = 0;
            while((index >= MAX_ARP_ENTRY) && 
(tcp_entry[index].app_status != 1))
            {
                index = tcp_entry_search (WEATHER_SERVER_IP,HTONS(80));
                if (tmp_counter++ > 30)
                {
                    HTTPC_DEBUG("TCP Eintrag nicht gefunden 
(HTTP_CLIENT)!\r\n");
                    return;
                }
            }

            HTTPC_DEBUG("TCP Eintrag gefunden (HTTP_CLIENT)!\r\n");
            tcp_entry[index].first_ack = 1;
            http_get_state = 2;
        }
        else
        {
            http_get_state = 1;
        }
    }*/
    //if (http_get_state == 10)
    if (http_get_state > 10 && http_get_state < 20)
    {
        HTTPC_DEBUG("\r\n\r\n\r\nDaten Anfordern\r\n");
        index = tcp_entry_search (WEATHER_SERVER_IP,HTONS(80));
        memcpy_P(&eth_buffer[TCP_DATA_START],WEATHER_GET_STRING,(sizeof(WEATHER_ 
GET_STRING)-1));
        tcp_entry[index].status =  ACK_FLAG | PSH_FLAG;
        create_new_tcp_packet((sizeof(WEATHER_GET_STRING)-1),index);
    }
}

Benötige ich auch das ARP Request? Hier habe ich es einfach 
auskommentiert.
Ich hab das leider nicht ganz verstanden und habe einfach http_get_state 
auf 12 gesetzt somit sendet er mir die ganze Zeit den String aus.

mfg
Hannes

von Hannes H. (hansl_)


Lesenswert?

Hallo :)

Also ich habe heute die ersten Tests mit dem Server gemacht.
Source Code ist wie original nur der String wurde geändert.
Komischerweiße sendet er mir immer nur beim flashen.
Ok http_get_state wird nur einmal auf 0 gesetzt deswegen oder?
Er sendet mir den String an den Server das stimmt soweit. Aber 
irgendwelche Acknowledges oder Timings stimmen nicht.
Hatt bei jemandem schon das Wetter funktioniert??

Bitte helft mir :)

mfg
Hannes

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.