Forum: Mikrocontroller und Digitale Elektronik C# und ECMD Befehl über IP Stack an Ethersex absetzen


von boerly (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von boerly (Gast)


Angehängte Dateien:

Lesenswert?

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:

von Peter II (Gast)


Lesenswert?

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);
}

von boerly (Gast)


Lesenswert?

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);

von boerly (Gast)


Lesenswert?

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:

von Peter II (Gast)


Lesenswert?

da schein sich wohl dein Gerät nicht an das HTTP-Protokoll zu halten. 
Kannst du mal mit wireshark mitlesen was da übertragen wird?

von boerly (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Peter,

ich habe den Versuch mal mit wireshark aufgezeichnet.
aber erlich ist mir das ein wenig komplex um den fehler auszumachen.

von boerly (Gast)


Angehängte Dateien:

Lesenswert?

ich habe den Transfer nochmal gecaptured und im wireshark format 
angehängt.

von Peter II (Gast)


Lesenswert?

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.

von boerly (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.