Hallo, ich habe da mal eine Frage. Ich möchte auf einem AVR-NET-IO mit ethersex über einen IP Stack verschiedene IO Zustände Abfragen. Eine Verbindung über einen Socket konnte ich in C# schon herstellen. Was ich noch nicht hinbekomme ist dann ein ecmd Befehl wie z.B. (ecmd?io set ddr 2 03) abzusetzen. Über die Eingabe im Browser geht der Befehl ausführen und zeigt die gewünschte Veränderung. Wie aber und in welcher Form übergebe ich das ECMD Kommando dem Ip Stack. Mit freundlichen Grüßen boerly
boerly schrieb: > Über die Eingabe im Browser geht der Befehl ausführen und zeigt die > gewünschte Veränderung. dann muss du es genau so machem wie der browser. Also musst du eine verbindung auf port 80 machen und dort eine Get/Put/Post anfrage senden. Dafür kann du den httpclient in C# nutzen.
Danke PeterII für deine schnelle Antwort ich habe dieses wie im Beispiel unten versucht bekomme dort aber den Fehler s.u. using System; using System.Net; using System.Text; using System.Net.Sockets; namespace HTTP_GET_Console { /// <summary> /// Das folgende Kommandozeilenprogramm illustriert wie Sockets /// dazu verwendet werden können Daten zu empfangen und zu senden. /// </summary> public class HTTPGet { public static void Main(string[] args) { string host; int port = 80; if (args.Length == 0) { // Falls kein Hostname als Argument übergeben wurde soll // der lokale Host als Standard genommen werden. host = Dns.GetHostName(); } else { host = args[0]; } host = "143.21.88.187"; //host = "143.21.88.12"; port = 80; string result = SocketSendReceive(host, port); Console.WriteLine(result); Console.ReadLine(); } // Initialisiert die Socketverbindung und gibt diese zurück private static Socket ConnectSocket(string server, int port) { Socket sock = null; IPHostEntry hostEntry = null; //hostEntry = Dns.GetHostEntry(server); hostEntry = Dns.GetHostEntry(server); // Nutze die Eigenschaft AddressFamily von IPEndPoint um Konflikte zwischen // IPv4 und IPv6zu vermeiden. Gehe dazu die Adressliste mit einer Schleife durch. foreach (IPAddress address in hostEntry.AddressList) { IPEndPoint ipo = new IPEndPoint(address, port); Socket tempSocket = new Socket(ipo.AddressFamily, SocketType.Stream, ProtocolType.Tcp); tempSocket.Connect(ipo); if (tempSocket.Connected) { sock = tempSocket; break; } else { continue; } } return sock; } // Die Methode sendet eine HTTP GET 1.1 Anfrage an den Server und // empfängt die Daten private static string SocketSendReceive(string server, int port) { Socket sock = null; // Die zu sendenden Daten string request = "ecmd?io set ddr 2 03\r\n"; // Kodiere den string in Bytes Byte[] bytesSent = Encoding.ASCII.GetBytes(request); // Lege ein Byte Array an für die zu emfangenden Daten Byte[] bytesReceived = new Byte[4096]; // Instanziere ein gültiges Socket Objekt mit den übergebenen Argumenten sock = ConnectSocket(server, port); if (sock == null) return ("Connection failed!"); // Sende den HTTP-Request sock.Send(bytesSent, bytesSent.Length, SocketFlags.None); int bytes = 0; string page = "Default HTML page on " + server + ":\r\n"; // Empfange die Daten und konvertiere sie do { bytes = sock.Receive(bytesReceived, bytesReceived.Length, SocketFlags.None); // kovertiere die Byte Daten in einen string page = page + Encoding.ASCII.GetString(bytesReceived, 0, bytes); } while (bytes > 0); // Unterbinde alle weiteren Send() und Receive() Aktivitäten am Socket sock.Shutdown(SocketShutdown.Both); sock.Close(); return page; } } } Der Fehler: System.Net.Sockets.SocketException was unhandled Message=The requested name is valid and was found in the database, but it does not have the correct associated data being resolved for Source=System ErrorCode=11004 NativeErrorCode=11004 StackTrace: at System.Net.Dns.InternalGetHostByAddress(IPAddress address, Boolean includeIPv6) at System.Net.Dns.GetHostEntry(String hostNameOrAddress) at HTTP_GET_Console.HTTPGet.ConnectSocket(String server, Int32 port) in C:\Documents and Settings\AU3589\My Documents\Visual Studio 2010\Projects\Test\HTTP_GET_Console\HTTP_GET_Console\Program.cs:line 45 at HTTP_GET_Console.HTTPGet.SocketSendReceive(String server, Int32 port) in C:\Documents and Settings\AU3589\My Documents\Visual Studio 2010\Projects\Test\HTTP_GET_Console\HTTP_GET_Console\Program.cs:line 86 at HTTP_GET_Console.HTTPGet.Main(String[] args) in C:\Documents and Settings\AU3589\My Documents\Visual Studio 2010\Projects\Test\HTTP_GET_Console\HTTP_GET_Console\Program.cs:line 33 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException:
irgenwie machst du das komisch einfach den web client nutzen. using (WebClient client = new WebClient()) { byte[] arr = client.DownloadData("http://ETHERSEX-IP/ecmd?ECMD-COMMAND"); // Write values. Console.WriteLine("--- WebClient result ---"); Console.WriteLine(arr.Length); }
bist echt schnell PeterII ich werde das mal probieren wie du es vorgeschlagen hast. mit der original Firmware von Pollin funzt das mit dem Senden über den IP Socket wie folgt. byte[] setport11 = { Convert.ToByte('S'), Convert.ToByte('E'), Convert.ToByte('T'), Convert.ToByte('P'), Convert.ToByte('O'), Convert.ToByte('R'), Convert.ToByte('T'), Convert.ToByte(' '), Convert.ToByte('1'), Convert.ToByte('.'), Convert.ToByte('1') }; sock.Send(setport11);
Hallo PeterII wenn ich deinem Vorschlag folge bekomme bei byte[] arr = client.DownloadData("http://143.21.88.187/ecmd?version"); ich diesen Fehler: System.Net.WebException was unhandled Message=The server committed a protocol violation. Section=ResponseStatusLine Source=System StackTrace: at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request) at System.Net.WebClient.DownloadData(Uri address) at System.Net.WebClient.DownloadData(String address) at download_webclient.Form1.button1_Click(Object sender, EventArgs e) in C:\Documents and Settings\AU3589\My Documents\Visual Studio 2010\Projects\Test\download_webclient\download_webclient\Form1.cs:line 26 at System.Windows.Forms.Control.OnClick(EventArgs e) at System.Windows.Forms.Button.OnClick(EventArgs e) at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ButtonBase.WndProc(Message& m) at System.Windows.Forms.Button.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.U nsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.Run(Form mainForm) at download_webclient.Program.Main() in C:\Documents and Settings\AU3589\My Documents\Visual Studio 2010\Projects\Test\download_webclient\download_webclient\Program.cs:line 18 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException:
da schein sich wohl dein Gerät nicht an das HTTP-Protokoll zu halten. Kannst du mal mit wireshark mitlesen was da übertragen wird?
Hallo Peter, ich habe den Versuch mal mit wireshark aufgezeichnet. aber erlich ist mir das ein wenig komplex um den fehler auszumachen.
ich habe den Transfer nochmal gecaptured und im wireshark format angehängt.
ich weiss ja nicht was du alles aufgezeichnet hast, aber das wichtigste fehlt. setzte doch mal ein Filter auf die IP von deinem µC-Board. Teste bitte mal nein C# Programm erstmal mit einem anderen webserver. Trage estmal http://www.google.de ein. Wenn dort kein Fehler kommt, stimmt das Programm erstmal. Dann noch mal mit deiner url testen und die richtigen daten mitschneiden.
Hallo, ich habe nur eine Lösung gefunden. ind der app.config die Einträge: <system.net> <settings> <httpWebRequest useUnsafeHeaderParsing="true" /> </settings> </system.net> hinzufügen. Dann komme ich auch mit dem WebClient auf den Controller. Grüße boerly
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.