Anfänger Frage-Posten von Aufträgen gegen Entgelt?

  • Hi,

    ich denke/hoffe, das entspricht deinen Ansprüchen. ^^

    Für die Aufruf-Konventionen einfach ohne Parameter starten, dann bekommst du eine Erklärung.
    Ansonsten gilt: Nur die EXE wird für Lesen funktionieren, da die AU3 keine Ausgabe in der Konsole erzeugt.

    Spoiler anzeigen
    [autoit]


    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Change2CUI=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

    [/autoit] [autoit][/autoit] [autoit]

    ;chesstiger @ autoit.de Nov '13

    [/autoit] [autoit][/autoit] [autoit]

    If $CMDLine[0] = 0 Then
    MsgBox(64, "Aufruf-Syntax", @ScriptName & " <IP> <Port> [set|get] <Nummer|all> <Status>" & @CRLF & @CRLF & "Beispiel: " & @ScriptName & " 192.168.0.42 1234 set all 0" & @CRLF & "Alle Ausgänge ausschalten.")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Global Enum $_IP = 1, $_PORT, $_DIRECTION, $_NUMBER, $_STATE

    [/autoit] [autoit][/autoit] [autoit]

    ;Parameter verarbeiten
    Local $sAddress = $CMDLine[$_IP]
    Local $iPort = $CMDLine[$_PORT]
    Local $sDirection
    Local $iNumber
    Local $iState
    Local $sEqual

    [/autoit] [autoit][/autoit] [autoit]

    Switch $CMDLine[$_DIRECTION]
    Case "set"
    $sDirection = "sAusgang"
    $iState = $CMDLine[$_STATE]
    $sEqual = "="
    Case "get"
    $sDirection = "gEingang"
    $sEqual = ""
    $iState = ""
    Case Else
    MsgBox(16, "Mode-Fehler", "Unbekannter Modus: " & $CMDLine[$_DIRECTION])
    EndSwitch
    If $CMDLine[$_NUMBER] = "all" Then
    $iNumber = ""
    Else
    $iNumber = $CMDLine[$_NUMBER]
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    TCPStartup()

    [/autoit] [autoit][/autoit] [autoit]

    $hSocket = TCPConnect($sAddress, $iPort)
    If @error Then
    ConsoleWrite("TCPConnect: Fehler beim Aufbau der Verbindung: WSA-" & @error & @CRLF)
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $sQuery = $sDirection & $iNumber & $sEqual & $iState

    [/autoit] [autoit][/autoit] [autoit]

    TCPSend($hSocket, $sQuery)
    If @error Then
    ConsoleWrite("TCPSend: Fehler beim Senden: WSA-" & @error & @CRLF)
    Exit
    EndIf
    If $sEqual = "=" Then
    Local $sRecv = ""
    Do
    $sRecv &= TCPRecv($hSocket, 4096)
    Until @error
    ConsoleWrite($sRecv)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    TCPCloseSocket($hSocket)
    TCPShutdown()

    [/autoit]

    (Das ganze basiert logischerweise auf deinen Angaben, daher garantiere ich nicht, dass es reibungslos funktioniert - Wenn was nicht passt, sag bescheid. ^^)

    lg

  • [autoit]

    $Text = "sAusgang=1"
    $g_IP = "192.168.178.37"
    ;~ ; Start The TCP Services :
    ;============================
    TCPStartUp()
    ;~ ; Connect to "SOCKET" :
    ;=========================
    $socket = TCPConnect( $g_IP, 1000 )
    TCPSend($socket,$Text)
    ;~ ; Shutdown The TCP Services :
    ;===============================
    TCPShutdown ( )

    [/autoit]

    $Text = "sAusgang=1"

  • :thumbup::thumbup::thumbup:
    Klasse geht!

    TOP!

    ok damit kann ich schon bischen testen :D
    Also damit sollte das Schalten der Karten möglich sein,hast du ne Idee wie ich die nun abfragen kann?

    Also mit gAusgang kann cih alle Eingänge abfragen,aber wie kriege ich diese nun in die Software rein?
    Über eine variable?
    Die Software beherrscht PHP die es empfangen soll.....
    Also es müsste ein Serverscript laufen der auf dem Port lauscht oder?

    PS.
    Meld dich bitte per PN wegen Belohnung deiner Dienste ;)

  • Zitat


    Die Software beherrscht PHP die es empfangen soll.....


    Soll das heißen, du sprichst mein Programm per PHP an? ^^
    Dann kannst du z.B. per passthru den Inhalt abfangen:

    PHP
    <?php
    //...
    $sReturn = passthru("arduino.exe 192.168.0.42 1234 gEingang");
    echo $sReturn;
    //...
    ?>

    So (oder ähnlich) solltest du an den Status kommen. ^^

    lg

  • Jep,
    es geht dabei um Haussteuerung mitels Homeputer Studio von Contronics.

    Da es dort aber keine fertigen Module mit meinen gewünschten Funktionen gibt,bastel ich an allem was geht :)

    Ja also ich starte deine exe aus Homeputer per startwin.......

    Vielen Dank schon mal für deine Hilfe,und ich teste das Morgen aus PHP direkt,und melde mich wieder,
    Meld dich per pn wie gesagt

    Mfg.
    Haustechno

  • Hi,
    eins ist mir aber direkt aufgefallen leider :(

    Also mein script ohne die Parametersteuerung lief ohne das cmd Fenster.
    Dein Script öffnet aber mittig das cmd Fenster und es bleibt für ne Sekunde auf :S
    Da auf dem PC ja auch die Visualisierung ist siehts nicht schön aus mit dem cmd.
    Kanntst du da noch was machen?

    soo nun muss ich aber los,


    Mfg.
    Haustechno

  • Das liegt an der Option ganz am Anfang:

    [autoit]


    #AutoIt3Wrapper_Change2CUI=y

    [/autoit]

    Das muss sein, damit man Informationen über den StdIO-Stream ausgeben kann (Das, was in der Konsole angezeigt wird. Sonst würde das passthru in PHP auch nicht funktionieren.).
    Man kann das CMD-Fenster allerhöchstens direkt nach dem Erscheinen verstecken. ^^

  • Morgen chesstiger,
    Also wie gesagt,diese Lösung ist nicht akzeptabel da es die Visu des systems beeintrechtigt :(

    Ich kann mit dem von mir zusammengeschustertem Code ohne das cmd Fenster die Ausgänge schalten,und das funktioniert sehr gut nur leider ohne die Parametersteuerung :whistling:

    Vielleicht könntest du wenn du mal Langeweile hast meinen Code noch um die Parameter erweitern? :D

    Also ich muss nach einem anderem Weg suchen,die Eingänge abzufragen,bzw.die irgendwie in einer Variable abzulegen
    ohne dieses cmd fenster ;)


    Mfg.
    Haustechno

  • Da liegt ja das Problem:

    Um eine Ausgabe zu erzeugen, die man z.B. per PHP oder CMD abfangen kann, muss man in den StdIO-Stream schreiben. Und das geht mit AutoIt nur, wenn du das Programm als sogenannte CLI-Anwendung kompilierst (Command Line Interface).

    Und das wiederum erzwingt dieses CMD-Fenster. Sorry.

    Einzige Alternative wäre, per PHP beim Ausführen direkt einen Parameter für das Verstecken des Fensters mitzugeben:

    Code
    $WshShell = new COM("WScript.Shell");
    $oExec = $WshShell->Run("cmd /C arduino 192.168.0.42 1234 sAusgang=0", 0, true);

    lg

    Edit:
    Noch mal ein Snippet, wie man das in VBS realisieren könnte.

    Spoiler anzeigen
    Code
    Set objShell = WScript.CreateObject("WScript.Shell")
    Set objExec = objShell.Exec("xcopy /?")
    Do
        line = objExec.StdOut.ReadLine()
        s = s & line & vbcrlf
    Loop While Not objExec.Stdout.atEndOfStream
    WScript.Echo s


    Kurz in PHP übertragen:

    Spoiler anzeigen
    Code
    $objShell = new COM("WScript.Shell");
    $objExec = $objShell->Exec("arduino 192.168.0.42 1234 gEingang");
    var $sLine, $sOut = "";
    $objStdOut = $objExec->StdOut;
    do
    {
        $sLine = $objStdOut->ReadLine();
        $sOut .= $sLine & "\n\r";
    }while(!$objStdOut->atEndOfStream);
    echo $sOut;


    Ob die PHP-Variante so auch klappt - ka. ^^

    Ganz alternativ könnte man den Output in eine Datei schreiben... Und diese dann per PHP auslesen.
    Bei mehreren Zugriffen geht das allerdings schief.

    Gruß

  • @cheestiger

    Also ich habe versucht deinen arduino script anzupassen.kriege das aber nicht hin :(

    Also ich möchte ja die Parametersteuerung behalten ,erst mal ohne die Abfrage über das cmd.

    Also nur das Senden des Textes an die IP.

    Habe nun auch noch "zu" den set und "get" auch noch "FS20" als Befehl ,mit dem ich direkt Aktoren (ELV FS20) Schalten kann über LAN.
    Könntest du nochmal netterweise den Code so anpassen,also:
    - "gAusgang1"
    - "sAusgang1=1"
    - "FS20 12341234.11,22,ON"

    Das wäre klasse,

    Mfg.
    Haustechno

  • [autoit]

    $Text = "FS20 31144141,1113,ON"
    $g_IP = "192.168.178.37"
    ;~ ; Start The TCP Services :
    ;============================
    TCPStartUp()
    ;~ ; Connect to "SOCKET" :
    ;=========================
    $socket = TCPConnect( $g_IP, 1000 )
    TCPSend($socket,$Text)
    ;~ ; Shutdown The TCP Services :
    ;===============================
    TCPShutdown ( )

    [/autoit]

    Hier nochmal die bei mir funktionierende Version ohne Parametersteuerung

  • Kannst du nicht direkt bei Homeputer über TCP was schicken? Also mit fsockopen und fwrite?

    Einmal editiert, zuletzt von m-obi (1. Dezember 2013 um 11:02)

  • Und vor allem gewöhnt dir mal diese ganzen Doppelposts ab. Es gibt eine tolle Funktion hier und zwar das editieren von Beiträgen.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.