Programm auf Windows PC mit einem Arduino über Netzwerk starten. Wie geht das?

Hallo,

ich möchte auf einen Windows PC eine Batch-Datei starten wenn von einen Arduino via Netzwerk eine entsprechende Aufforderung kommt.

Gibt es dazu eine einfache Lösung?

Ich möchte auf dem Windows PC keinen Webserver oder PHP installieren.
Irgend ein kleines Tool welches die Netzwerkschnittstelle des PCs überwacht und wenn ein passendes Telegramm ankommt die Batch-Datei startet würde reichen.

Hat jemand dazu eine Idee?

Gruß
Peter

Sowas kann man recht einfach selbst schreiben wenn Kenntnisse in einer passenden Sprache hat

peter_de:
ich möchte ...

Mir fällt dazu eine simple Schaltung ein, die an einem seriellen Port hängt (4 Taster). Benötigt halt noch ein Stück Software, das die gedrückten Tasten auswertet. Eigentlich ganz praktisch, aber ob es dazu entsprechende Software für eine Windows-Schüssel gibt ... ? Wenn ja, scheitert’s wahrscheinlich daran, dass es wohl kaum noch Rechner gibt, die serielle Ports haben.

Einen Arduino zu nehmen, der ein Relais o. ä. schaltet, ist wahrscheinlich das kleinste Problem.

Gruß

Gregor

Selbst moderne Mainboards haben meist eine serielle Schnittstelle. Die ist lediglich nicht ausgeführt.

Aber er will es über das Netztwerk machen. Eine leichtgewichtige Lösung wäre Python. TCP oder UDP ist simpel:
https://wiki.python.org/moin/TcpCommunication
https://wiki.python.org/moin/UdpCommunication
Und eine Datei starten geht einfach per os.system

Geht natürlich auch mit anderen Mitteln. Ich würde da wahrscheinlich C# nehmen, aber Visual Studio ist eine aufwendige und relativ große Installation. Python ist schnell installiert.

Serenifly:
Selbst moderne Mainboards haben meist eine serielle Schnittstelle. Die ist lediglich nicht ausgeführt.

Aber er will es über das Netztwerk machen.

Ups, stimmt ja, das hatte ich übersehen.

Gruß

Gregor

Python ist schnell installiert.

PHP auch....

Danke für eure Hilfe.

Serenifly:
Sowas kann man recht einfach selbst schreiben wenn Kenntnisse in einer passenden Sprache hat

:grinning: :grinning: Den Spruch könnte ich mir an die Wand nageln. :grinning: :grinning:

Mit zusätzlicher Hardware ist das sicher machbar, dazu gehört aber auch Kabel ziehen und das mag ich nicht. Zumal ja über das Netzwerk schon eine Verbindung besteht. Auf dem PC läuft noch WinXP und eine serielle Schnittstelle hat der auch noch.

Gibt es denn eine (kostenlose) solo PHP Installation ohne viel Beipack wie bei z.B. XAMPP?

Python ist wohl auch ein Interpreter? D.h. ich muss Python auf dem PC installieren und kann dann den Python-Code ausführen. Direkt ausführbaren Code (exe) erzeugt man damit wohl nicht.

Gruß
Peter

Es gibt auch Sprachen die direkt eine .exe Datei erzeugen können. Aber zum Programmieren musst du so oder so erst mal was installieren. Und an der Stelle ist Python sehr einfach, da die Installation klein ist. Sowohl was den Interpreter selbst als auch eine IDE (PyCharm) betrifft.

Für C# muss zum Ausführen einer .exe das .NET Framework vorhanden sein, was aber in vielen Fällen da ist. Dafür hat die IDE ein paar GB! Um Java Dateien auszuführen braucht man die Java Runtime. Das ist ja der Vorteil von solchen Umgebungen! Dass man nicht direkt auf die Windows Ressourcen zugreifen muss. Aber dazu braucht man dann eben etwas dazwischen.

Ich dachte aber das soll auf dem gleichen PC laufen auf dem es programmiert wird.

Und es ist wirklich einfach. Selbst wenn man die Sprache nicht im Detail beherrscht. Der Code ist nicht viel. Es sind zwei Teile. Einmal die Netzwerk Verbindung und einmal das Starten der Batch Datei. Das kann man getrennt testen. Dazu gibt es massig Anleitungen und fertige Code Schnipsel. Egal welche Programmiersprache.

Danke nochmal für die Zusätzlichen Infos.

Was ich bisher über Python gelesen habe klingt sehr interessant. Ich denke damit kann ich umsetzen was ich brauche.

Entwickelt wird auf einem Win7 PC aber laufen soll das Programm dann später auf einem XP Rechner.

Und "exe" ist scheinbar mit py2exe auch machbar. Damit erspart man sich dann die Installation von Python auf dem Ziel-PC.

py2exe generiert scheinbar nur ein Verzeichnis, in dem alle für die Ausführung der selbst geschrieben Anwendung erforderlichen Dateien aus der Python Umgebung zusammengetragen werden.
Dieses Verzeichnis kann man dann auf den Ziel PC kopieren und die Anwendung starten ohne das komplette Python Programmpaket dort installieren zu müssen.

Gruß
Peter

Ah, wenn da der Interpreter dabei ist gut. Woanders hatte ich gelesen dass man bei solchen Utilities immer noch einen Interpreter bräuchte. So weit bin ich in Python nicht eingestiegen, deshalb muss ich an der Stelle auch erst mal suchen. Mir erschien es aber vom Aufwand her am geringsten. Man braucht zwar mehrere Programme (die Standard Python Installation, p2exe und am besten PyCharm), aber die Downloads sind im Vergleich zu anderen Optionen recht klein.

Gibt es denn eine (kostenlose) solo PHP Installation ohne viel Beipack wie bei z.B. XAMPP?

Wer will, findet Wege, und wer nicht will, Gründe.

PHP Download

Das man PHP allein downloaden kann, hätte ich ja noch gewusst. Aber wie spreche ich es an, wenn kein html Server installiert ist?

Es läuft inzwischen mit wenigen Zeilen Python-Code.

Es hat zwar etwas gedauert bis ich mit Python warm wurde, aber eine Hardwarelösung hätte auch Zeit gekostet.
So ist alles universell und ich kann vom Arduino aus beliebige Aktionen auf dem PC starten.

py2exe habe ich nicht eingesetzt sondern eine 32Bit Python Version komplett installiert (ca.60 MB). Obwohl das Script ständig läuft begnügt sich Python mit einer zusätzlichen CPU-Last von 0,0% :wink:

Gruß
Peter

Hallo Peter,

zeigst Du uns, wie das jetzt aussieht? Hab hier mitgelesen und finde das ebenso interessant - hab aber auch keinen Plan von dieser Schlange :grin:

Hallo Klaus,

ich habe auch keinen Plan von Python aber folgendes funktioniert bei mir.

Python Script:

import socket
import subprocess

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind(("", 50010)) 
s.listen(1)

try: 
    while True: 
        komm, addr = s.accept() 
        while True: 
            data = komm.recv(10)

            if not data: 
                komm.close() 
                break
            print "[%s] %s" % (addr[0], data)
            if data == "0":
                subprocess.call("action_00.cmd", shell=False)
            if data == "10":
                subprocess.call("action_10.cmd", shell=False)
            if data == "11":
                subprocess.call("action_11.cmd", shell=False)
            if data == "12":
                subprocess.call("action_12.cmd", shell=False)				
				
finally: 
    s.close()

der Einfachheit halber liegen die cmd-Dateien (action_00.cmd, ...) im gleichen Verzeichnis wie das Python Script.

Arduino Code:

void webclient_03(uint8_t action)   // Python Script für cmd Aufrufe
{
  if (client.connect(server_002, port_python))  // Verbindung zum Server PC aufbauen
  {
    Serial.print(F("Verbunden, Sende Daten zum Python Script "));
    client.print(action);
  }
  else
  {
    Serial.println(F("***** VERBINDUNG KANN NICHT HERGESTELLT WERDEN - Python Script *****"));
  }
  client.stop();
  client.flush();
}

Welche Aktion ausgeführt wird, übergibt man über "uint8_t action" an die Routine. Mit diesen Datentyp kann man also theoretsch bis zu 256 verschiede Aktionen auf den PC auslösen.
"server_002" beinhaltet die IP-Adresse des PCs auf dem Python läuft.
"port_python" enthält die Portnummer für TCP. In diesem Fall die 50010, welche mit dem Wert im Python Script überein stimmen muss.

Einmal angestoßen läuft das Python Script ständig. Ich habe es im Autostart eingetragen.
Zur Sicherheit habe ich die Freigabe für Python in der Windows Firewall auf das lokale Netz begrenzt.

In Python gibt es keine Zusammenfassung/Strukturierung von Codeblöcken mittels Klammern {}. Dies erfolgt hier über einrücken der Codezeilen.

Gruß
Peter

action_11 hast du mit 'k' geschrieben. Heißt die Datei auch so?

Um Dateien aufzurufen gibt es einige Optionen mit unterschiedlichen Modulen, je nachdem ob man das als eigenen Prozess möchte oder wie du als Sub-Prozess. An der Stelle ist C# weniger verwirrend :slight_smile:

Was ich bei Python sehr schön finde:

komm, addr = s.accept()

Mehrere return Werte! :slight_smile:

Hallo,

aktion_11 habe ich korrigiert. In Wirklichkeit haben die aufgerufenen .cmd bei mir andere Namen.
Ich hatte das nur für den Post geändert und dabei einen Schreibfehler gemacht.

So wie die Aufrufe der Dateien jetzt erfolgen gefällt mir das von der Ausgabe her ganz gut.
Es ist nur ein "DOS-Fenster" offen und die Ausgaben der aufgerufenen Dateien erscheinen alle in diesem Fenster.
Würde man die Dateien so aufrufen dass sie in einem eigenen Prozess laufen, würden bei jedem Aufruf wahrscheinlich neue Fenster aufpoppen?

Serenifly:
...
Mehrere return Werte! :slight_smile:

Was meinst du damit?
Die Returns der aufgerufenen .cmd an Python oder die Returns von Python an den Arduino?
Von Python an den Arduino zurück werte ich nichts aus, wäre aber machbar. Wenn da mal was fehlschlägt ist das für meine Anwendung nicht weiter tragisch. Deshalb habe ich auf Rückgaben an den Arduino verzichtet und werte auch eventuelle Fehlermeldungen von(client.connect(server_002, port_python)) nicht aus.

Gruß
Peter

Würde man die Dateien so aufrufen dass sie in einem eigenen Prozess laufen, würden bei jedem Aufruf wahrscheinlich neue Fenster aufpoppen?

Wahrscheinlich, wenn man nicht irgendwie das Verhalten der Fenster extra einstellen kann. Aber alles in einem Fenster ist für dich am besten.

Was meinst du damit?

Ganz allgemein Funktionsaufrufe

In C/C++ (und vielen anderen Sprachen) hast du genau einen return Wert. Mehrere Werte muss man sich mit Referenzparametern nachbilden. Das geht z.B. in Java nicht ohne dass man die Werte in einer Klasse kapselt.

In Python kannst du dagegen einfach das machen:

return var1, var2