Hallo,
da ich keine Ahnung von Programmierung habe und es (nach 3 Monaten
erfolglosen Eigenrecherchen) dank eurer Hilfe innerhalb eines Tages
geschafft habe meinen Projektor über eine Batch datei zu starten bitte
ich euch hier nochmal um Hilfe.
A)Ich habe einen PC mit Win 10 per ConLine-V24-XXL-S Serial LAN Device
Server Netzwerkadapter an meinen Beamer angeschlossen (Virtual COM1).
B) Ich habe ein Odroid C2 mit Linux per ConLine-V24-XXL-S Serial LAN
Device Server Netzwerkadapter an meinen Beamer angeschlossen (Virtual
COM1)
Die batch Datei sieht also so aus:
@echo off
mode com1: BAUD=9600 PARITY=n DATA=8 STOP=1 to=off xon=off odsr=off
octs=off dtr=off rts=off idsr=off
type C:\Beamer\beamer_On.hex > COM1
in der beamer_On.hex steht: PON (STXPONETX)
Das funktioniert mit Windows 10 super.
Im Zuge meiner Automatisierung müsste ich diesen Befehl aber über den
Odroid und nicht den PC senden. Ich habe gelesen das ich dazu eine bash
Datei benötige, weil die Batch Datei nicht auf Linux ausführbar ist?
Aber wie hat diese auszusehen? Ich kann wahrscheinlich nicht den Inhalt
der Batch einfach unter .sh abspeichern oder?
Habe auch schon diverse Recherchen angestellt aber werde aus diesen
dingern einfach nicht schlau.
Sorry für die Unwissenheit aber vielleicht könnt ihr mich ja aufklären.
Danke schon mal im Voraus.
Nur so als Vorlage. Den seriellen Port must du natürlich anpassen und
die beamer_On.hex muss im gleichen Verzeichnis wie das Script liegen.
wichtig ist, dass der Benutzer in der Gruppe dialout ist. Sonst gibts
Probleme.
Für Linux scheint es keine Virtual-COM-Software zu geben (zumindest
nicht vom Hersteller des Interfaces). Wenn für das Interface aber
TCPSERVER mit Port 1002 als Emulation für die serielle Schnittstelle
konfiguriert ist, sollte ein einfaches
zum Senden des Einschaltbefehls genügen. Ggf. musst du in der obigen
Befehlszeile 192.168.100.100 durch die tatsächlich konfigurierte
IP-Adressee des Interfaces ersetzen.
Die Einstellung der RS-232-Parameter wie Baudrate, Datenbits usw. musst
du mittels Telnet direkt auf dem Interface (s. Handbuch) vornehmen. Es
sieht aber so aus, dass 9600,8,N,1 die Defaulteinstellung ist, so dass
du hier nichts ändern musst.
Unter linux gibt es auch das Tool netcat, dass solche sachen etwas
vereinfacht.
Es wird mit der Abkürzung nc aufgerufen.
nc name port < dateiname
für das Beispiel von yalu:
nc 192.168.100.100 1002 < beamer_On.hex
(Es muss nicht die IP-Adresse sein, man kann auch den DNS-Namen der
Geräte nehmen)
Wahrscheinlich hatte ich wohl einen Fehler in meiner Beschreibung
gemacht oder einen Denkfehler in der Umsetzung und in der
Problembeschreibung wie auch immer.
Der PC (Win 10) hat einen virtuellen COM1 und kann per Batch datei den
Befehl auslösen s.o.
Ich möchte den Befehl aber über den Odroid C2 (Linux) mit einem
bestimmten Programm absetzen s.o.
Das Programm kann folgende Protokolle, Befehle...(siehe angehängtes
Bild)
Diese Befehle werden mit einer sogenannten .cvaction Datei ausgelöst.
Da mein Linux MiniPC ja keinen virtuellen Com1 hatte ich mir überlegt
das es nur 2 Möglichkeiten gibt den Befehl abzusetzen (da ich kein
Experte bin kann das natürlich falsch sein):
1.Einen Befehl vom Linux MiniPc an den Win PC senden, damit der Win PC
die Batch datei ausführt und dann den Befehll an COM1 (Beamer)sendet.
Dies geht aber nicht über das ausführen einer Konsole unter Linux
sondern über die Commands: siehe Bild
2.Den Befehl direkt an den ConLine-V24-XXL-S Serial LAN Device
Server Netzwerkadapter senden. Wenn ich das jetzt richtig deute müsste
ich das Beispiel von Yalu X.: "echo -ne '\x02PON\x03' >
/dev/tcp/192.168.100.100/1002" in ein pyhton script schreiben, damit das
Programm den Befehl direkt senden kann.
Aber ich kann kein pyhton script schreiben und weis auch nicht ob ich
richtig liege?
Hoffe ich kann dieses unlösbare Problem mit eurer Hilfe lösen.
Danke euch, dieses Forum ist wirklich nur weiterzuempfehlen.
Jens schrieb:> Wenn ich das jetzt richtig deute müsste ich das Beispiel von Yalu X.:> "echo -ne '\x02PON\x03' > /dev/tcp/192.168.100.100/1002" in ein pyhton> script schreiben, damit das Programm den Befehl direkt senden kann.
Nein, du brauchst dafür kein Python-, sondern ein Bash-Skript. Zum
Testen kannst du diesen Befehl auch einfach in der Konsole eintippen.
Ich selber konnte das nicht testen, weil ich diesen ConLine-Adapter
nicht habe. Aber laut den Informationen in dessen Handbuch müsste es so
oder so ähnlich gehen.
Hab den Befehl zum testen direkt in die Konsole eingegeben.
Bekomme folgende Fehlermeldung:
-sh. can´t create /dev/tcp/192.168.188.52/1002: nonexisting directory
-sh: -sh:: not found
Was könnte das bedeuten?
> -sh. can´t create /dev/tcp/192.168.188.52/1002: nonexisting directory> -sh: -sh:: not found>> Was könnte das bedeuten?
Es könnte sein, dass eine der Verzeichnisstufen
/dev
/dev/tcp
/dev/tcp/192.168.188.52
nicht existiert, und darum die Datei
/dev/tcp/192.168.188.52/1002
nicht angelegt werden kann.
Jens schrieb:> Hab den Befehl zum testen direkt in die Konsole eingegeben.> Bekomme folgende Fehlermeldung:> -sh. can´t create /dev/tcp/192.168.188.52/1002: nonexisting directory> -sh: -sh:: not found>> Was könnte das bedeuten?
Filenamen wie "/dev/tcp/192.168.188.52/1002" existieren nicht wirklich
sondern werden von der Bash-Shell speziell ausgewertet. Der "-sh"
bedeutet aber, dass das nur eine Standard-Shell ist. Das anlegen von
Verzeichnissen nutzt also nichts, das Verwenden von netcat (wie oben
beschrieben) schon.
A.H. schrieb:> Filenamen wie "/dev/tcp/192.168.188.52/1002" existieren nicht wirklich> sondern werden von der Bash-Shell speziell ausgewertet.
Ich dachte, auf dem Raspberry läuft normalerweise eine normale Bash.
Offensichtlich ist dies hier nicht der Fall. Also entweder vorher eine
Bash mit
ich kann die bash datei mit "./ bash_datei.sh" öffnen.
Dann bekomme ich folgende Fehlermeldung:
./ bash_datei.sh line 1: can´t create: /dev/tcp/192.168.188.52/1002:
nonexisting directory
Meine bash sieht so aus:
echo -ne '\x02PON\x03' > /dev/tcp/192.168.188.31/57195
also unter .sh gespeichert.
Ich könnte mir vorstellen, das sie so ähnlich aussehen müsste:
#!/bin/sh
echo -ne '\x02PON\x03' > /dev/tcp/192.168.188.31/57195
Jens schrieb:> ich kann die bash datei mit "./ bash_datei.sh" öffnen.
Deine Default-Shell ist, wie schon oben deutlich wurde, nicht die Bash
(oder allenfalls eine im restricted Mode). Du musst also explizit
angeben, dass das Skript bzw. der Befehl durch die Bash ausgeführt
werden soll.
Als Skript:
Mega, dieser Befehl hat super im Terminal funktioniert "echo -ne
'\x02PON\x03' | nc 192.168.100.100 1002"
Also direkt abgesetzt.
Vielen Dank!!!!
Jetzt muss ich das Ganze aber über ein bash script ans laufen bringen um
mit meinem Programm den Befehl absetzen zu können.
Es tut mir wirklich leid und ich möchte nicht nerven aber könnte mir
einer nochmal sagen wie das bash Skript mit dem Befehl auszusehen hat?
Wäre echt toll. Sorry
In meinem Skript steht:
#!/bin/bash
echo -ne '\x02PON\x03' | nc 192.168.188.52 1002
gespeichert unter datei.sh
aufgerufen im Terminal unter bash datei.sh
Leider tut sich da nix.
Jens schrieb:> Mega, dieser Befehl hat super im Terminal funktioniert "echo -ne> '\x02PON\x03' | nc 192.168.100.100 1002"> Also direkt abgesetzt.> ...> In meinem Skript steht:> #!/bin/bash> echo -ne '\x02PON\x03' | nc 192.168.188.52 1002> ...> Leider tut sich da nix.
Ist der Unterschied beabsichtigt?
192.168.100.100 vs. 192.168.188.52
Oh nein blöder Fehler von mir.In beiden Fällen ist:
"echo -ne '\x02PON\x03' | nc 192.168.188.52 1002" der richtige Befehl.
Hab mich jetzt nur hier verschrieben
Jens schrieb:
>aufgerufen im Terminal unter bash datei.sh>Leider tut sich da nix.
Wenn man bei Linux ein Programm im aktuellen Ordner
starten möchte, und dieser Ordner sich nicht im
Programmsuchpfad befindet, muß man glaube ich ./
davor setzen. Also:
./datei.sh
Vielleicht liegt es daran?
Hi
Wenn sich 'nix tut' heißt Das normaler Weise, daß kein Fehler auftrat.
Kannst Du statt dem nc-Aufruf 'tee' in den Script schreiben?
'tee' gibt das Übergebene auf der Komandozeile wieder aus - vll. werden
nicht alle Argumente übergeben, vll. musst Du weiter Quoten
(Anführungsstriche)?
Aka nc '12.34.56.78 1002'
MfG
man tee
NAME
tee - read from standard input and write to standard output and
files
....
Patrick J. schrieb:> Kannst Du statt dem nc-Aufruf 'tee' in den Script schreiben?
Nicht statt, sondern zusätzlich, nämlich:
1
echo -ne '\x02PON\x03' | tee /tmp/datei.log | nc IPADRESSE-HIER 1002
Wenn Du tatsächlich "statt" meintest, kannst Du direkt schreiben:
echo -ne '\x02PON\x03' >/tmp/datei.log
Außerdem empfiehlt sich ein
1
bash -x skript.sh
Dann sieht man, was ausgeführt wird.
Hat man einmal die Datei datei.log, kann man natürlich auch schreiben:
nc IPADRESSE-HIER 1002 < /tmp/datei.log
Hier empfiehlt sich dann aber, die Datei woanders hinzulegen, sonst
könnte sie einen Reboot nicht überstehen.
An tee kanns aber nicht liegen. Das gibt lediglich die Standard-Eingabe
an die Standard-Ausgabe weiter und protokolliert zusätzlich sämtliche
Daten in einer Ausgabedatei.
Noch nicht ganz am Ziel.
Hatte gedacht jetzt bekomme ich den Rest hin aber Pustkuchen :-(
Also kurz zusammengefasst:
1) Das .sh Skript "beameron.sh" ist in dem Pfad "storage/downloads"
2) Befinde ich mich in dem Pfad Downloads und gebe: "bash -x
beameron.sh" in den Terminal geht mein Beamer an.
So jetzt will ich aber wie gesagt mit dem Programm Cinemavision den
Befehl auslösen.
Das sollte ungefähr so aussehen:
command:///storage/downloads/beameron.sh
Leider funktioniert das nicht.
Gebe ich das direkt in den Terminal: /storage/downloads/beameron.sh
Öffnet sich das file auch nicht.
Ich denke der Fehler liegt irgendwo bei:
command:///storage/downloads/beameron.sh
Denn im Terminal unter dem Pfad Downloads mit dem Befehl: "bash -x
beameron.sh" funktioniert es ja???????
chmod +x /storage/downloads/beameron.sh habe ich schon gemacht.
Wenn ich command:bash -x ///storage/downloads/beameron.sh in Putty
schreibe bekomme ich command:bash not found, gebe ich bash -x
///storage/downloads/beameron.sh in Putty ein dann funktioniert es.
command:bash -x ///storage/downloads/beameron.sh in dem Programm
Cinemavision funktioniert leider auch nicht.
Das dann aus dem Download-Verzeichnis heraus.
Von 'Außerhalb' den Punkt auch vor die Pfadangabe.
Ist der Script definitiv ausführbar?
Wobei das chmod -x ja keine Fehlermeldung auswarf, sollte Das gepasst
haben.
MfG
Ich vermute, dein Cinemavision läuft unter einem anderen User.
gib mal bitte die folgenden Kommandos in der Shell ein:
chmod a+rx /storage
chmod a+rx /storage/downloads
chmod a+rx /storage/downloads/beameron.sh
in Cinemavision sollte das Kommando wie folgt sein:
command:///storage/downloads/beameron.sh
Könnte Es ein Rechte-Problem sein?
Da Du im Terminal SUDO bist, sollte das Script aber auch mit diesen
Rechten laufen und diese Rechte an die selbst aufgerufenen Scripte
vererben - mache selber aber nicht viel mit höheren Rechten - bis auf
'updateme', Welches mir apt-get zum Updaten aufruft (per sudo), bin ich
immer nur User.
Wenn sudo erforderlich ist, packe Das vor den Aufruf im Script.
Beim Aufruf mit sudo-Rechten sollte keine erneute Passwortabfrage
kommen.
Wäre mir aber 'unangenehm', wenn da irgendwo ein Script läuft, den nicht
ich geschnitzt habe - Der darf dann auch 'sudo' spielen.
MfG
Diese not found Meldung beim direkten Aufruf des scripts mit dem
absoluten Pfad ist sehr interressant. Könnte es sein, dass sich bash
nicht unter /bin/bash befindet? Was geben "which bash" und "realpath
/proc/$$/exe" oder "ls -l /proc/$$/exe" oder "echo $SHELL" aus? Falls
die ausgabe nicht /bin/bash ist, setze das ausgegebene im Script nach
dem #! ein. In dem fall hättest du das Problem dann aber mit so ziemlich
jedem bash script, und ein Symlink in bin könnte sich als sinvoll
erweisen.
Autsch, vertan...
soweit ich es erkenne liegt das Script nicht in /storage/downloads,
sondern in /home/kino/storage/downloads (oder ähnlich)
kannst du mal bitte die Ausgabe von
pwd
posten und das Kommando
/home/kino/storage/downloads/beameron.sh
testen?
Das hilft!
Ändere in deinem Script die erste Zeile von
#!/bin/bash
auf
#!/usr/bin/bash
Danach sollte der einfache Aufruf von
/storage/downloads/beameron.sh
funktionieren
Hmm,
dann nochmal strukturiert:
1) Das folgende Kommando schaltet den Beamer ein, richtig?
echo -ne '\x02PON\x03' | nc 192.168.188.52 1002
2) Bitte poste die Ausgabe der folgenden Kommandos:
ls -l /storage/downloads/beameron.sh
cat /storage/downloads/beameron.sh
ls -l /usr/bin/bash
Jens schrieb:> leider nicht, er sagt not found
Hast du dabei den absoluten Pfad verwendet:
/storage/downloads/beameron.sh oder den Relativen: ./beameron.sh ?
Falls du es mit beameron.sh statt ./beameron.sh versucht hast, das geht
nur wenn beameron.sh in einem Verzeichnis in $PATH ist.
ok, ändere die zweite Zeile bitte in
echo -ne '\x02PON\x03' | nc 192.168.188.52 1002
Die wesentliche Veränderung ist das Löschen des Anhangs.
Tee kann auch Entfernt werden, da es hier eigentlich nichts bringt.
JJ schrieb:> ok, ändere die zweite Zeile bitte in>> echo -ne '\x02PON\x03' | nc 192.168.188.52 1002>> Die wesentliche Veränderung ist das Löschen des Anhangs.
Es könnte auch sein, dass die Datei in der letzten Zeile kein newline
hat. cat würde dann auch kein newline am ende ausgeben, und der nächste
prompt von sh würde angehängt.
Geht leider weder in Cinemavision noch im Terminal.
Gebe ich /storage/downloads/beameron.sh im Terminal ein bekomme ich:
bash: /storage/downloads/beameron.sh: not found
Daniel A. schrieb:> Es könnte auch sein, dass die Datei in der letzten Zeile kein newline> hat. cat würde dann auch kein newline am ende ausgeben, und der nächste> prompt von sh würde angehängt.
Ja stimmt, das ist auch möglich.
Mir würden ansonsten nur noch Windows Zeilenumbrüche einfallen. Aber ich
habe keine Vorstellung wie man das über ein Forum debuggen kann.
Hast du eine Idee?
Ja, die Ausgabe jeder der Befehle müsste Aufschluss über die Zeilenenden
bringen, aber ich weiss nicht ob die ersten beiden unter busybox
verfügbar sind, und ich weiss nicht ob busyboxes bash bei der Dritten
des $'\r' als Argument korrekt an grep übergibt, oder dort ein false
negative möglich wäre.
Um defekte Zeilenenden auszuschließen können wir die Datei auch noch
einmal neu schreiben, bzw. zur Sicherheit eine neue anlegen.
Das kannst du mit diesen Kommandos in PuTTY erreichen:
Problem gelöst. Durch ein Mitglied in einem anderen Forum.
Ihr hattet mit Zeilenumbruch recht.
Es war ein "DOS line endings created by Windows editor" Problem.
Nachdem ich: "dos2unix /storage/downloads/beameron.sh" in den Putty
Terminal eingegeben habe, funktioniert es im Terminal
unter:"/storage/downloads/beameron.sh" und in Cinemavision
unter:"Command:///storage/downloads/beameron.sh.
Ohne eure Hilfe hätte das nicht funktioniert.
Vielen Dank, das ihr so viel Zeit in mein Problem investiert habt.