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.