Forum: PC-Programmierung Http Daten am win 10 PC empfangen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Werner (10kloc)


Lesenswert?

Hallo,
Ich möchte Daten von einem shelly in win 10 bearbeiten.
Shelly sendet Daten in diesem Format
Http://192.168.xxx.yyy/Daten.  (Adresse des PC).

Wie kann ich mit c# und Visual Studio auf diese Daten zugreifen.
Danke für konstruktive Hilfe

von Harald K. (kirnbichler)


Lesenswert?

Werner schrieb:
> Wie kann ich mit c# und Visual Studio auf diese Daten zugreifen.

Indem Du einen Webserver programmierst.

Port 80 aufmachen, auf eingehende Verbindungen warten, rudimentär das 
http-Protokoll implementieren ...

von Εrnst B. (ernst)


Lesenswert?

Harald K. schrieb:
> Port 80 aufmachen, auf eingehende Verbindungen warten, rudimentär das
> http-Protokoll implementieren
1
using System.Net;
2
3
using var listener = new HttpListener();
4
listener.Prefixes.Add("http://192.168.xxx.yyy:80/");
5
listener.Start();
6
7
Console.WriteLine("Listening on port 80...");
8
9
while (true)
10
{
11
    HttpListenerContext ctx = listener.GetContext();
12
    HttpListenerRequest req = context.Request;
13
14
    // if (req.Url != "/Data") ... 404 Fehlermeldung
15
    // else
16
    using HttpListenerResponse resp = ctx.Response;
17
18
    resp.StatusCode = HttpStatusCode.OK;
19
 
20
/// ....
21
22
}

: Bearbeitet durch User
von Rüdiger B. (rbruns)


Lesenswert?

Es gibt auch wget für windows.

von Harald K. (kirnbichler)


Lesenswert?

Rüdiger B. schrieb:
> Es gibt auch wget für windows.

Falsche Richtung.

von Sebastian W. (wangnick)


Lesenswert?

Rüdiger B. schrieb:
> Es gibt auch wget für windows.

Unter https://www.gnu.org/software/wget/manual/wget.html finde ich keine 
Möglichkeit, http-Anfragen zu empfangen. Wie soll das gehen?

LG, Sebastian

von Stephan S. (uxdx)


Lesenswert?

Harald K. schrieb:
> Werner schrieb:
>> Wie kann ich mit c# und Visual Studio auf diese Daten zugreifen.
>
> Indem Du einen Webserver programmierst.

Es gibt lighttpd auch für Windows. Klein und schnell.

von Harald K. (kirnbichler)


Lesenswert?

Sebastian W. schrieb:
> Wie soll das gehen?

Tut es nicht, wie ich schon schrieb: "Falsche Richtung".

Stephan S. schrieb:
> Es gibt lighttpd auch für Windows.

Das ist ein Webserver. Aber die Daten, die übertragen werden soll, die 
muss man dann auch noch aus diesem Webserver rausholen.

Man kann auch nginx, Apache oder IIS verwenden, wenn man eine dafür 
passende CGI-Sprache nutzt. Die Kombination Apache & Php ist altbewährt. 
Alternativ kann man sich auch für node.js etwas zusammenklöppeln.

von Werner (10kloc)


Lesenswert?

Vielen Dank für die Infos.
Brauche ich die Portangabe im WLAN?
Die shelly kommunizieren untereinander ohne Portangabe oder
Portfreigabe.

von Max (max_u)


Lesenswert?

Wenn nichts dabei steht, ist http (ohne s) immer Port 80.

von Bauform B. (bauformb)


Lesenswert?

weborf kann webDAV, hat den schon mal jemand für Windows gebaut?

https://github.com/ltworf/weborf/releases

von Εrnst B. (ernst)


Lesenswert?

Bauform B. schrieb:
> weborf kann webDAV

aber was will er damit? So wie sich das erste Posting anhört, will er 
die Webhooks von seinem Shelly auf seinem Windows-PC mit einem C# 
Programm empfangen...

Ich würde das zwar eher über MQTT machen, aber den nötigen Endpunkt hat 
er mit 10 Zeilen C# auch so eingebaut, ganz ohne zusätzliche Webserver & 
Bibliotheken.

von Werner (10kloc)


Lesenswert?

Das ist genau was ich brauche.
Wie mach ich das mit dem endpoint und 10 Zeilen C# code

von Harald K. (kirnbichler)


Lesenswert?


von Εrnst B. (ernst)


Lesenswert?

Werner schrieb:
> Wie mach ich das mit dem endpoint und 10 Zeilen C# code

Hab ich weiter oben geschrieben (10:04), zumindest den Code-Teil dass 
dein C#-Code HTTP-Requests annimmt. Das Parsen der Payload (JSON) und 
Weiterverarbeitung danach muss halt noch ergänzt werden. Und wenn es 
nicht "blocking" sein soll, auch noch ein Thread oder Umstellung auf 
asynchrone Verarbeitung (GetContextAsync())

Als Anfänger würde ich dir aber empfehlen, erstmal mit dem ganz 
einfachen Beispiel zu starten, Log-Ausgaben zu ergänzen, schauen ob das 
funktioniert, und überhaupt Daten vom Shelly ankommen, und ab da dann 
erst weitermachen.

Die Microsoft-Doku hat für alles schöne Beispiele, z.B. hier um den 
POST-Body auszulesen:

https://learn.microsoft.com/en-us/dotnet/api/system.net.httplistenerrequest.hasentitybody?view=net-8.0#system-net-httplistenerrequest-hasentitybody

von Werner (10kloc)


Lesenswert?

Hab versucht den Code von oben in vs einzutragen.
Leider braucht die using Direktive mindestens C# 8.0
Ich schaffe es nicht mein C# aktuell 7.3 auf 8.0 zu bringen.
Mir wird max das net framework 4.8 angeboten für C# 8.0 braucht man
Mindesten net 5.
Hat jemand eine Lösung wie ich C# 8.0 in mein visualStudio bringe.
Oder oder gibt es für obiges Beispiel eine Lösung ohne using

von Oliver S. (oliverso)


Lesenswert?

Werner schrieb:
> Ich schaffe es nicht mein C# aktuell 7.3 auf 8.0 zu bringen.

Aktuelles Visual Studio runterladen und installieren klappt nicht?

Oliver

von Werner (10kloc)


Lesenswert?

Ist aktuell, vs community 22 17.8.3

von Hmmm (hmmm)


Lesenswert?

Werner schrieb:
> Mir wird max das net framework 4.8 angeboten für C# 8.0 braucht man
> Mindesten net 5.

Einfach manuell downloaden?

https://dotnet.microsoft.com/download/dotnet

von Werner (10kloc)


Lesenswert?

Hatte ich schon.
Trotzdem ist die Auswahl in vs max 4.8

von Εrnst B. (ernst)


Lesenswert?

Werner schrieb:
> Oder oder gibt es für obiges Beispiel eine Lösung ohne using

using var listener
und
using HttpListenerResponse resp

sind das Problem? lass das "using" einfach erstmal weg.

Später musst dich dann aber selber darum kümmern, die IDisposables zu 
disposen...
Für die ersten Tests egal.

von Werner (10kloc)


Lesenswert?

Habs jetzt ohne using probiert.
Listener.Start bringt jetzt den Fehler "Zugriff verweigert.
Aufruf mit:
Listener.Prefixes.Add("http://192.168.178.yy:80/";);

Muß das die Adresse vom PC sein oder die vom shelly?
Ist für den obigen Fehler nicht relevant, jede Adresse bringt den 
Fehler.

von Εrnst B. (ernst)


Angehängte Dateien:

Lesenswert?

Werner schrieb:
> Muß das die Adresse vom PC

Ja. der soll ja listenen.

Werner schrieb:
> Listener.Start bringt jetzt den Fehler "Zugriff verweigert.

Hast du am Rechner noch einen anderen Webserver laufen?
Probier andere Portnummern, 8080, 8888, würfel was.

Und ich würde dir wirklich raten, selber mal in die Dokumentation zu 
schauen. Da hättest du z.B. gefunden, dass du z.B. auch ein Prefix 
"http://*:80/"; angeben könntest, was dann auf allen 
Netzwerk-Interfaces/IP-Adressen des Rechners lauscht.

Und ganz grobes Grundwissen, wie dieses "Web" eigentlich funktioniert, 
wär auch nicht verkehrt. ("was ist TCP, was sind Ports, was ist der 
Unterschied zwischen Client und Server, was ist HTTP")

Ansonsten: bei Node-Red könntest du dir das ganze Klicki-Bunti 
zusammenstellen, ist dann natürlich keine C#-Anfänger-Übungsaufgabe 
mehr...

: Bearbeitet durch User
von Werner (10kloc)


Lesenswert?

Sorry für meine Unwissenheit.
Will doch nur ein paar Daten vom shelly empfangen.

Bin einen Schritt weiter.
Im Administrator mode läuft das Programm und gibt aus:
Listening on Port 80...

Das Programm kommt aus listener.GetContext nicht zurück.
Nach 1 min kommt ein timeout.
Vom Handy schicke ich 192.168.xxx.yy:8080 (die IP vom pc)

von Monk (roehrmond)


Lesenswert?

Werner schrieb:
> Brauche ich die Portangabe im WLAN?

Auf jeden Fall wird immer ein Port gebraucht, standardmäßig Port 80.

Vielleicht liest du dich erst mal ein bisschen ind die Grundlagen zum 
HTTP Protokoll ein. Zum Beispiel auf 
http://stefanfrings.de/mikrocontroller_buch/Einstieg%20in%20die%20Elektronik%20mit%20Mikrocontrollern%20-%20Band%202.pdf 
Kapitel 10

: Bearbeitet durch User
von Hmmm (hmmm)


Lesenswert?


Beitrag #7587142 wurde vom Autor gelöscht.
von Bernd H. (geeky)


Lesenswert?

Werner schrieb:
> Im Administrator mode läuft das Programm und gibt aus:
> Listening on Port 80...
>
> Das Programm kommt aus listener.GetContext nicht zurück.
> Nach 1 min kommt ein timeout.
> Vom Handy schicke ich 192.168.xxx.yy:8080 (die IP vom pc)

Warum rufst du denn Port 8080 auf, wenn du deine Anwendung dem 
"Listening on Port 80" nach doch auf Port 80 lauschen lässt?

Wenn .GetContext() nicht zurück kehrt, dann kommt dort auch nix an.
Ggf. musst du den verwendeten Server-Port auch noch in der 
Windows-Firewall freigeben um von außerhalb des Rechners drauf zugreifen 
zu können
(z.B. einfach eine "eingehende Regel" dort anlegen für TCP-Port 80 (oder 
auf welchen du deine Anwendung lauschen lässt) mit "Zulassen")

Du kannst als ersten Test auch einfach erstmal direkt auf dem Rechner 
mit der C#-Anwendung in einem Browser http://192.168.xxx.yy:8080/ 
aufrufen (bzw. :80, wenn du auf Port 80 lauscht) und bei .GetContext() 
müsste sich etwas tun...

Dem Shelly wird der Port recht egal sein, ob man da in der C# Anwendung 
nun 80, 8080 oder sonst einen anderen nimmt, sofern der Port in der URL 
die man im Shelly einträgt identisch ist.
(Welche Ports bereits durch irgendwelche Anwendungen/Dienste auf dem 
Rechner schon belegt sind kann man in Windows btw z.B. über "resmon.exe" 
anschauen. Dort unter "Netzwerk" und dann "Überwachungsports")

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Eventuell genügt auch ein simpler TCP-Socket auf Port 80 im 
Listen-Zustand. Da das HTTP-Protokoll textbasiert ist, kann man die 
wichtigsten Informationen auch "zu Fuß" heraus parsen ...
Nachdem die Lesung erfolgt ist, schließt man das Socket (trennt damit 
die Verbindung) und macht es gleich wieder im Listen-Zustand auf.

von Werner (10kloc)


Lesenswert?

Ich hab mittlerweile eine ganze Reihe von c# Programmen aus github 
probiert.
Allen ist gemeinsam, daß sie nichts empfangen.
Egal was ich an die Adresse des PC schicke.
Da scheint was grundsätzliches nicht zu funktionieren.
Gibt es ggf fertige Programme für win10 die das Empfangene in ein file 
schreiben?

von Harald K. (kirnbichler)


Lesenswert?

Werner schrieb:
> Gibt es ggf fertige Programme für win10 die das Empfangene in ein file
> schreiben?

Das kann im Prinzip jeder stinknormale Webserver, wenn man dessen 
Logging entsprechend einstellt.

von Εrnst B. (ernst)


Lesenswert?

Dumme Frage: Ist der PC per Kabel oder auch per WLan am Router?
Falls WLan: Client Isolation im Accesspoint abgeschaltet?

Obwohl, dann könnte der PC auch nicht auf die Shelly-Weboberfläche...


Teste der Reihe nach: Kriegt dein Programm was mit, wenn du es per 
Webbrowser auf demselben Rechner ansprichst? Wenn ja: Teste mit 
Webbroser am Handy oder anderem Rechner im selben Netz, und wenn das 
auch geht, dann mit dem Shelly...

: Bearbeitet durch User
von Christian R. (supachris)


Lesenswert?

Wieso eigentlich diese Richtung? Ich hole die Daten zyklisch vom Shelly 
ab, der stellt die doch auf seinem Webserver in json zur Verfügung. Das 
sind 5 Zeilen Python und sicher nicht viel mehr in C#.

von Sebastian W. (wangnick)


Lesenswert?

Werner schrieb:
> Ich hab mittlerweile eine ganze Reihe von c# Programmen aus github
> probiert.
> Allen ist gemeinsam, daß sie nichts empfangen.

Um das zu erreichen braucht es schon eine Menge Erfahrung. Wie hast du 
das geschafft?

LG, Sebastian

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.