Alle Fragen und Infos zum Thema CommandServer
Ankündigung
Einklappen
Keine Ankündigung bisher.
[mmh] CommandServer
Einklappen
X
-
meudenbachStichworte: -
-
Hi,
kann man dem <script><run=... command mitteilen das er die returncodes der im script ausgeführten commands optional mit zurückliefert?
Beispiel ist ein script welches verschiedene itunes funktionen aufruft und unter anderem auch den player status abfragt. Aktuell bekomme ich nur RUN=SUCCESS zurück, ich möchte aber den player status auch noch im iViewer auswerten können.
Was mir auch fehlt sind ein paar logik Bausteine wie:
<if PLAYING="<itunes><getplayerstate><itunes>">
<sys><returnvalue="Player läuft"></sys>
<else>
<sys><returnvalue="Player läuft nicht"></sys>
</else>
</if>
Wie macht Ihr so etwas?
VG Macrauder
-
meudenbach
Ja, die Logik Engine... *traum*... dann brauchten wir ja bald keinen HS oder ahnliches mehr.... ;-)
... eines Tages!! Aber vorerst müssen wir uns um andere Dinge kümmern. Wir sind letztendlich nur eine kleine Bude und arbeiten schon grenzlastig. Wir würden gern weitere Entwickler hinzunehmen, aber das kostet halt alles Geld...
In der Tat führen wir aber "Gesprache" und würden bei erfolgreichen Abschluss auch notwendigen "Schub" bekommen, um eben "Projekte" wie Logik, Konfigurator, uvm. antriggern zu können. In erster Linie sind wir also dazu "verdammt" Anforderungen aus den jeweiligen Projekten mit höherer Prioritat anzufassen. Wenn wir könnten, wie wir wollten, oha... ;-)
Nun aber zu Deinem Anliegen:
Der EventServer kann Dir evtl. weiterhelfen. Wir senden ja jede Änderung des iTunes Status auf dem Broadcast Port 1038. Auf diesen kann man auch entsprechend "lauschen" und auswerten. Der iViewer stellt hierfür leider keinerlei Funktionen zur Verfügung. Kurzum, der iViewer ist und bleibt "dumm".
Ich hatte zB die Anforderung zu erkennen, wenn iTunes über "Remote" angesprochen wird um eben automatisch die Audioanlage einzuschalten. Da wir nun nicht zwischen die Kommunikation von iTunes und "Remote" kommen, haben wir den EventServer entsprechend erweitert. Hier kann auf den BC Port gelauscht und es können Meldungen ausgewertet werden. Entsprechend können auch Aktionen ausgeführt werden !!!
Beispiel:
[CONFIG];;
TRIGGERIP;192.168.50.55;
TRIGGERPORT;1038;
TRIGGERMODE;ASCII;
[TRIGGERS];;
<ITUNES>GETPLAYERSTATE=\*|;iTunesRemoteEvent.myh;O NCHANGE
lauscht auf den BC Port und führt bei Änderung des PLAYERSTATE entsprechendes Script aus. Dies ist quasi gleichzusetzen mit der Bedingung "IF=GETPLAYERSTATE="
Nun kommt der Trick...
Wie Du ja mittlerweile weißt, wird der "Match" automatisch als Argument dem Scriptaufruf angehangen... Angenommen GETPLAYERSTATE andert sich auf "PLAYING"... dann würde in diesem Fall der Scriptaufruf wie folgt ausgeführt...
<SCRIPT><RUN=iTunesRemoteEvent.myh><ARG=PLAYING> </SCRIPT>
Nun betrachten wir mal den Inhalt des Scriptes iTunesRemoteEvent.myh:
<SCRIPT><RUN=iTunesRemoteEvent_[ARG].myh></SCRIPT>
Wie Du siehst hange ich das Argument einem erneuten Scriptaufruf an. Über das Argument baue ich quasi einen neuen Namen zusammen... um final das Script:
<SCRIPT><RUN=iTunesRemoteEvent_PLAYING.myh></SCRIPT>
aufzurufen, welches die Bedingung "GETPLAYERSTATE=PLAYING" entsprechen würde.
Du kannst somit auf alle Playerstatis gezielt Aktionen ausführen.
Vermutlich kann die Vorgehensweise auch vereinfacht werden, habe ich allerdings noch nicht getestet. Wenn Du folgendes in der EventServer Definition eintragst:
[TRIGGERS];;
<ITUNES>GETPLAYERSTATE=\*|;iTunesRemoteEvent_\#.my h;ONCHANGE
könnte/sollte sich der Zwischenschritt über das iTunesRemoteEvent.myh Script entfallen...
LG
Kommentar
-
Hi,
ja das liebe geld und dann braucht man auch noch zeit und die richtige resourcen, überall das selbe problem.
Danke für die Antwort, die Trigger Funktion hab ich mir auch mal in der Doku durchgelesen, die geht aber anscheint nur mit iTunes. Ich wollte mir für verschiedene Sourcen Steuerscripts erstellen, also auch TV und DVD, da wirds damit leider nix.
Hab deswegen gerade etwas Applescript gehackt.
Wenn Ihr in eurer AppleScript Command Function noch das Result zurückgeben würdet und eine Art ECHO Funktion erstellt, dann könnte man die Logik komplett über AppleScript erschlagen.
tell application "MyHGUI" of machine "eppc://192.168....."
set mmhResult to Command "<SYS><HELLO></SYS>"
if mmhResult contains "gmbh" then
Command "<SYS><ECHO=TRUE></SYS>"
end if
end tell
Im iViewer würde ich dann auf TRUE matchen können.
Was hälst du davon?
Ich weis Ihr habt noch andere wichtigere Dinge in der Pipe, wäre aber ein nettes Feature!
VG Macrauder
Kommentar
-
Hi,
ich habe gerade feststellen müssen das der CommandServer anscheint Single Threaded läuft!
Mir ist es aufgefallen als ich ein Korruptes Command an den Server geschickt habe und Ihn damit abgeschossen habe. Danach hab ich den Server restartet und einen Telnet auf den Port gemacht und Commands per Hand abgesetzt und festgestellt das man Parallel nicht mir dem ScriptingClient arbeiten kann.
Das ganze schrenkt die Möglichkeiten meiner Meinung nach doch arg ein, da man so nur mit einen Client den Server steuern kann. Jetzt könnte man sagen das mehrere Clients auf die Sekunde genau zugreifen müssen aber richtig doof wird es wenn man von einem Script aus was im Server läuft auch wieder einen Connect macht der mmh commands absetzen soll. (sieh mein AS Script)
Generell sollten Server Prozesse möglichst immer Multithreaded ausgelegt werden so das ein Prozess nicht den ganzen Server platt machen kann.
Sprich jeder Request wird in einen Thread verpackt und dann verarbeitet.
Das macht den Server einfach robuster gegenüber Fehlern und auch flexiebler einsetzbar.
Gibt es technische Gründe dafür oder ist es eher aus der Historie heraus entstandenen?
VG macruader
Kommentar
-
meudenbach
Mit Sicherheit läuft der/die CServer mutlithreaded !!!!
kann es sein Das Du Dich, mit was auch immer, per TCP verbindest ???
Ich habe es noch nicht geschafft, den CServer "abzuschießen"... wäre evtl. mal wichtig zu erfahren, was genau Du da machst ??
LG
Kommentar
-
meudenbach
ja, aber das ist doch auch logisch !!!
Bzw. bedienen wir auf dieser Ebene per TCP nur eine Verbindung. Kommen so auch eigentlich super zurecht. Der Mac ist hinsichtlich der Protokoll Schnittstelle eben "nur" Client...
Mich würde interessieren, was Du denn da genau vor hast ??? Evtl. können wir Dir neben UDP ja einen anderen Weg aufzeigen.
LG
Kommentar
-
ja, aber das ist doch auch logisch !!!
"normal" wird ein server der auf einen port lauscht gethreaded ausgelegt... da brauchen wir aber nicht aus diksutieren!
Was hab ich vor!
Ich möchte aus einem command aufruf heraus ein AS aufrufen welches dann wieder weitere commands called um die iviewer joins zu verändern.
Verhält der iViewer "Server" sich eigentlich auch wie der CommandServer? Sprich kann da nur ein iPhone mit ihm parallel reden?
Mich würde euer Verständniss was Client oder Server ist mal Interessieren, ich denke mit den Begriffen wird etwas inflationär umgegangen!
Für mich ist mmh ein Server den ich sage was er machen soll... der client ist für mich das programm was ihm sagt was er machen soll, also iphone, gui, scripts usw. sind wir da dakor?
Kommentar
-
meudenbach
... wir diskutieren nicht, wir handeln !!! Bauen das also entsprechend um.
Warum Du nun aus AS iViewer Joins verändern möchtest, ist mir noch nicht ganz klar. Theoretisch geht das auch, da eben der iViewer Server "gethreaded"
ausgelegt ist. Was auch die Frage beantwortet, ob Du Dich mit mehr als einem Phone/Touch verbinden kannst....
Das Problem: Wenn Du das mit AS so machen willst, kannst Du das zZ nur über UDP. Da der iViewer Client sich nur mit einem Server verbinden läßt, hast Du auch keine Chance irgendwie anders dazwischen zu kommen....
Verständnis Frage: :-) ja, da habe ich mich wohl ein wenig verhaspelt ....
LG
Kommentar
-
Hi Mike,
kannst du kurz erklären was du mit
...Bauen das also entsprechend um.
AppleScript unterstützt leider kein UDP da es nur zum Scripten da ist und nicht auf low level Functions zugreifen kann, leider! Wird ein TCP Support kommen?
Bezüglich Join Änderungen:
Meiner Meinung nach ist das Join ändern über mmh eine Super Funktion, da du so z.B. bei einem Screen Change bewust die Felder neu befüllen kannst und dir nicht die Finger Wund greppen must mit den Values und den Positionen, auch kann ich so externe Services nutzen. z.b. per WebService oder KO Abfragen Felder befüllen.
Gerade wenn demnächst beim iViewer auch Listen hinzukommen wird das ein must have sein.
VG macrauder
Kommentar
-
meudenbach
Ich meine damit, dass die nächste Version entsprechend geändert wird.
Auszug aus dem changelog:
Version 1.0.65:
- TCP- und UDP-Kommandoparser multithreaded
- Commandserver parallelisiert (=performanter), bitte wenn möglich mal mit mehreren Geräten gleichzeitig ausprobieren
- Broadcast-Engine optimiert
- iViewer-Absturz bei iTunes-Betrieb behoben
LG
Kommentar
-
Hallo allerseits,
habe ein Problem mit der Ansteuerung eines Sanyo PLV-Z5 Beamers.
Der Beamer besitzt eine RS232 Schnittstelle, wenn ich die Kommandos
über Hyper-Terminal sende führt er diese brav aus.
Nun versuche ich über mmh CommadServer diese Kommandos
auszuführen, laut SkriptClient-Monitor macht mmh das auch brav.
aber es tut NIX !
Der Beamer ist über ein Moxa NPort5110 Lan/Serial Adapter mit dem
Netzwerk verbunden.
Ich habe schon mit den Einstellungen des Nport experimentiert „aber Nix da“.
In der Bedienungsanleitung des NPort steht, das die TX/RX LED das
transmitting mit grün signalisiert diese bleibt aber „AUS“
(Ready und Link LED sind grün) das lässt vermuten
das die Konfiguration des NPort nicht korrekt ist.
Kennt sich jemand mit Nport 5110 und dessen Konfiguration in Verbindung mit
mmh aus?
Meine Konfiguration Nport:
Network Settings : Außer IP alles Standard
Serial Settings : Baud rate 19200 (laut Sanjo)
Data bits 8
Stop bits 1
Parity None
Flow control None
FIFO Enable
Operating Settings:Real COM Mode (alles andere Standard)Gruß
Olli
Kommentar
-
Mapping funktioniert nicht
Hallo,
kriege über den Commandserver "Server" folgenden Inhalt nach mmh:
11:10:42.869 - network: udp message from xxx.xxx.xxx.xxx, size 23 bytes
11:10:42.869 - parser: parsing sequence: <SERVER><JAHR></SERVER>
11:10:42.871 - parser: command: SERVER - JAHR
11:10:42.871 - parser: reply sequence: <SERVER>JAHR=|OK</SERVER>
11:10:42.871 - commandserver: TCP send: xxx.xxx.xxx.xxx:9000 data: 2006\0x0A
11:10:42.877 - commandserver: TCP receive: xxx.xxx.xxx.xxx:9000 data: |16 Blocks
11:10:42.878 - commandserver: translated reply sequence: <SERVER>TITEL|OK</SERVER>
11:10:42.889 - network: message parsed
11:10:42.906 - commandserver: TCP receive: xxx.xxx.xxx.xxx:9000 data: |300|An Inconvenient Truth|Babel|Blood Diamond|Das Leben der Anderen|Deja Vu|Dreamgirls|Pirates of the Caribbean: Dead Man's Chest|Hollywoodland|The Departed|The Good Shepherd|The Prestige|Volver|Cars|The Da Vinci Code|Penelope|Rescue Dawn|Notebook|Trixie
11:10:42.908 - commandserver: translated reply sequence: <SERVER>TITEL|OK</SERVER>
Manchmal kommt die Rückantwort in einer Sequenz dann so wie hier in 2 Sequenzen.
Der Commandserver:
[CONFIG];
ACTIVE;YES
SERVERIP;xxx.xxx.xxx.xxx
SERVERPORT;9000
SERVERMODE;ASCII
SERVERTIMEOUT;NONE
SERVERPROTOCOL;TCP
MATCHING=NORMAL
CMDSUFFIX;\0x0A
[COMMANDS];
SEND;\#;
JAHR;2006
[MAPPINGS];
\?\*;TITEL
Was mach ich falsch?
Gewünschtes Ergebnis:
<SERVER>TITEL=16 Blocks|300|An Inconvenient Truth|Babel|Blood Diamond|Das Leben der Anderen|Deja Vu|Dreamgirls|Pirates of the Caribbean: Dead Man's Chest|Hollywoodland|The Departed|The Good Shepherd|The Prestige|Volver|Cars|The Da Vinci Code|Penelope|Rescue Dawn|Notebook|Trixie|OK</SERVER>
Klaus
Kommentar
-
Hallo Klaus,
bzgl. der Übertragung machst Du garnichts falsch, die Gegenstelle sendet die Antwort "zerhackt".
Lösung 1: Wenn möglich, auf UDP umstellen.
Lösung 2: Wenn möglich, das TCP-Sendeverhalten der Gegenstelle umstellen, sodaß der komplette String auf einmal gesendet wird.Gruß
Sascha
Kommentar
Kommentar