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
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 ...
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
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
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.
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.
Vielen Dank für die Infos. Brauche ich die Portangabe im WLAN? Die shelly kommunizieren untereinander ohne Portangabe oder Portfreigabe.
weborf kann webDAV, hat den schon mal jemand für Windows gebaut? https://github.com/ltworf/weborf/releases
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.
Das ist genau was ich brauche. Wie mach ich das mit dem endpoint und 10 Zeilen C# code
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
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
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
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
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.
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.
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
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)
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
Werner schrieb: > Listener.Start bringt jetzt den Fehler "Zugriff verweigert. Das wird wohl daran liegen: https://learn.microsoft.com/en-us/dotnet/framework/wcf/feature-details/configuring-http-and-https?redirectedfrom=MSDN#configuring-namespace-reservations
Beitrag #7587142 wurde vom Autor gelöscht.
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")
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.
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?
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.
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
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#.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.