DXP GT – Fireplace
DXP GT – Mobile Footer Layer

C# Fernsteuerrung

BigKane

Newbie
Registriert
Juni 2012
Beiträge
4
Hallo,

Ich möchte gerne eine einfache Art der Steuerung von einem Rechner zum anderen realisieren
So z.B. das ich eine Mause von einem Rechner mit der Maus des anderen Steuere.

Letztendlich möchte ich über ein Device über WLAN/Internet mich an einen Rechner hängen und von diesem durch Bluetooth einen Roboter steuern.

Jedoch fehlt mir der Ansatz da ich mit C# nun auch nicht so viel Erfahrung habe.

Mein Problem liegt halt das ich nicht genau weiß wie ich es hin bekomme das die Informationen gesendet und empfangen werden, also im falle der Maus, das die Positionsdaten gesendet und auch richtig empfangen werden und wenn auch möglichst schnell und präzise.
Oder halt beim Roboter die relevanten Daten.

MFG
 
Erst einmal: Über ein lokales Netzwerk oder Internet? (Wenn über das Internet, kämen da nämlich eventuell noch ein paar Hürden mehr, die zu lösen wären)
 
Woran genau hapert es denn? Nur der Datenübertragung über das Netzwerk oder auch dem Erhalten der neuen Informationen wie Mausbewegung und "Roboterdaten"?
 
also den Aufbau einer Verbindung sollte ich schon hin bekommen.

Mir fehlt es eher an dem Verständnis, was ich machen muss um einen sich dauernden Datenwert(e) zu verschicken und ihn dann am ziel zu lesen und gleichzeitig auch zu nutzen.

Daher das Beispiel mit der Mausposition, dies ist ja nichts anderes wie ein Integer wert der sich dauerhaft verändert, dieser soll versendet werden und am Client dann verarbeitet werden sodass sich am Client der Mauszeiger genau gleich verhält(nur als Beispiel)
 
Also wegen der Verbindung hast du mehrere Möglichkeiten:

Sockets,
TcpClient/TcpListener
WCF

sei mal an dieser Stelle erwähnt. Für was du dich entscheidest ist dir überlassen, meine Empfehlung wäre entweder WCF oder TcpClient/-Listener.

Zu der Datenübertragung... ist relativ einfach. Du musst ja nur die Position von deinem Cursor auslesen, es in ein Byte-Array speichern, rüberschicken. Auf der anderen Seite empfängst du es, wandelst die Bytes wieder in Int und weist es dann dem Cursor zu die Werte.

Code:
Cursor.Position = new Point(x, y); //oder so ähnlich ging der Befehl :D

Wenn du Tasten übermitteln willst, dann das selbe Spiel. Nur dass du hier den KeyCode z.B. übermittelst. Auf der Empfänger-Seite brauchst du dann aber in jedem Fall die "SendInput-Methode" aus der WINAPI.

Da gibts aber unzählige Tutorials zum Thema ;)

PS: Such irgendwo in diesem Forum mal nach nem Thread "Bildvergleich" oder so hieß der. Er war zwar nicht von mir, aber ich hab in diesem Thread viele Fragen bezüglich Verbindungsaufbau (über WCF) und Bildabgleich-Übermittlung gestellt. Da sind dann sogar Code-Beispiele dabei ;)


Hoffe ich konnte dir etwas weiterhelfen :D
Ergänzung ()

PS: zu der SendInput hatte ich hier übrigens auch schon mehrere Fragen samt Code-Schnipsel gesehen gehabt ;)

Hab jetzt aber leider keine Zeit um die ganzen Links zu den Threads raußzukramen, sorry.
Wenn du die nicht findest, dann kann ich heute Abend ja mal gucken :)
 
Zuletzt bearbeitet:
Zhen schrieb:
Also wegen der Verbindung hast du mehrere Möglichkeiten:

Sockets,
TcpClient/TcpListener
WCF

sei mal an dieser Stelle erwähnt. Für was du dich entscheidest ist dir überlassen, meine Empfehlung wäre entweder WCF oder TcpClient/-Listener.

Sockets benutzt man immer, egal für was man sich entscheidet. WCF ist, wenn es auf Latenz ankommt, die denkbar schlechteste Wahl. Nebenbei ein ziemlicher Overkill, wenn man "nur" einen Vektor übertragen möchte. D.h. du musst dich zwischen UDP und TCP/IP entscheiden. Ich empfehle letzteres, falls du aber auch noch das letzte bischen Latenz rauskitzeln möchtest, kannst du auch mit dem UdpClient experimentieren.

Ansonsten hat Zhen schon recht, es ist ziemlich einfach. Da du lediglich eine Punkt-zu-Punkt Verbindung aufbauen möchtest, musst du dir keine großen Sorgen um Threading etc. machen.
Du solltest dir allerdings überlegen wie du mit verschiedenen Auflösungen umgehen möchtest. Die Koordinaten 1:1 zu übernehmen kann zu Problemen führen. Unter Umständen (bei verschiedenen Display-Auflösungen) musst du interpolieren.

Das nächste betrifft nur die Client-Applikation. Forms oder WPF? Ich rate dir zu Forms. Mittlerweile ist es Mode geworden fast ausschließlich mit WPF zu arbeiten. Sollte das auch deine Wahl sein, wird es deutlich "schwieriger" für dich, den Cursor auf dem Zielrechner zu bewegen. P/Invoke lässt grüßen.

Für Code schaust du dir am Besten die Beispiele auf MSDN (TcpListener, TcpClient) an. Für deine Zwecke kannst du die fast 1:1 übernehmen. Um die Maus zu bewegen nimmst du den Code von Zhen (funktioniert nur unter Windows Forms).

Gutes Gelingen ;)
 
@holy:

ja mir ist bewusst dass es alles mit sockets funktioniert, aber was ich eigentlich damit ansprechen wollte waren die klassen selbst in c# :D

Ich finde man kann viel einfacher mit den TcpClient/Listener-Klassen arbeiten als mit der Socket-Klasse (also zumindestens ist es bei mir so) ;)

PS: Ich hab für meine Fernwartung übrigens WCF hergenommen :P
 
Zhen schrieb:
ja mir ist bewusst dass es alles mit sockets funktioniert, aber was ich eigentlich damit ansprechen wollte waren die klassen selbst in c# :D

Ich finde man kann viel einfacher mit den TcpClient/Listener-Klassen arbeiten als mit der Socket-Klasse (also zumindestens ist es bei mir so) ;)

So meinte ich das gar nicht. TcpClient und UdpClient arbeiten auf einem Socket. Wenn du irgendwas übers Netzwerk verschickst, hast du immer irgendwo unter deiner "High-level" API einen Socket liegen.
 
das wollte ich doch damit sagen :D

"Unter" den "Hig-Level" APIs wie du schon sagst liegen Sockets.
Damit man in C# die Sockets verwenden kann, gibt es solche Klassen wie "Socket, TcpClient und dann gehts weiter mit Networkstream, etc.".

Was ich sagen wollte ist, dass es einfacher ist mit der TcpClient-Klasse zu arbeiten (die wiederum auf der Socketklasse aufbaut - soweit ich weiß) als mit der Socketklasse, weil sie einem mehr Arbeit abnimmt.

Genauso wie es z.B. mit einem Streamreader/-writer einfacher zu arbeiten ist als mit einem Stream. Weil man hier direkt einen String übergeben kann, wobei beim Stream ich den erst "selber" in ein Byte-Array umwandeln muss.

Ich glaub da haben wir einfach an einander geredet obwohl wir das selbe gemeint haben ^^
sorry ;)
 
Zuletzt bearbeitet:
super, werde ich mal heute oder morgen dann dran basteln und mich dann ggf. wieder melden :)

holy schrieb:
Du solltest dir allerdings überlegen wie du mit verschiedenen Auflösungen umgehen möchtest. Die Koordinaten 1:1 zu übernehmen kann zu Problemen führen. Unter Umständen (bei verschiedenen Display-Auflösungen) musst du interpolieren.

Das mit der Maus is ja auch eher nur einn Beispiel zum testen da ich es letztendlich an einem Roboter anwenden möchte, wenn werde ich auch nicht mit der Position direkt arbeiten sondern mit der Bewegung
 
Zurück
Oben