aus Website LogoControl-Befehle aufrufen

Willkommen Foren LogoControl aus Website LogoControl-Befehle aufrufen

Verschlagwortet: 

8 Beiträge anzeigen - 1 bis 8 (von insgesamt 8)
  • Autor
    Beiträge
  • #2978
    raschner
    Teilnehmer

    wie kann ich aus einer Website, die auf dem selben Pi läuft wie LogoControl,
    z.B. in javascript eine Methode aus LogoControl aufrufen oder einen Zustand einer Variablen
    anzeigen
    Ein Versuch mit XMLHttpRequest bringt leider keinen Erfolg

    //Bsp.:https://wwkw.selfhost.eu:8080/rest/devices/3/methods/2
    var x = new XMLHttpRequest();
    x.open(„GET“,url,false);
    alert(„in setLControl nach x.open“);
    x.send();
    alert(„in setLControl nach x.open:“+x);
    var str=x.responseText;
    alert(„in setLControl:“+str);
    return str;
    }

    #2979
    admin
    Administrator

    Also in der LogoControl-WebGUI mache ich ja auch AJAX-Calls um Methoden aufzurufen oder Attribute zu setzen, allerdings mach ich das nicht per Hand mit XMLHttpRequest sondern mit jQuery, weil’s deutlich einfacher ist:

    // call method
    function callDeviceMethod(deviceId, methodId) {
    	jQuery.get('rest/devices/' + deviceId + '/methods/' + methodId);
    }
    
    // set attribute
    function setDeviceAttribute(deviceId, attributeId, attributeName, currentValue) {
    	var newValue = prompt("Attributwert \"" + attributeName + "\" ändern:", currentValue);
    	if (newValue != null) {
    		jQuery.get('rest/devices/' + deviceId + '/attributes/' + attributeId + '/valueText?set=' + newValue);
    	}
    }

    Kannst dir ja mal den Seitenquelltext von der LogoControl-Haupseite anschauen. Die URL die du versuchst aufzurufen scheint auch richtig zu sein. Lass mich raten: wenn du die URL im Browser von Hand aufrufst funktioniert es, nur eben nicht per AJAX? Dann könnte der folgende Artikel hilfreich sein, da du vermutlich auf dem Pi deinen eigenen Webserver laufen hast, welcher unter einem anderen Port läuft als der LogoControl-Webservice:

    https://de.wikipedia.org/wiki/Same-Origin-Policy

    #2980
    raschner
    Teilnehmer

    Danke für die Unterstützung, daran wird es wohl liegen, da ein href Aufruf im Browser fkt.
    nicht jedoch in einer js-function.

    Werde versuchen das hinzukriegen – nochmals Danke

    #2985
    admin
    Administrator

    Okay, hab mich die Tage jetzt auch noch mal ausführlicher mit der Same-Origin-Policy beschäftigt. Das Problem auf deiner Seite zu lösen ist eher schwierig. Die bevorzugte Lösung für diese „Sicherheitsrichtlinie“ nennt sich Cross-Origin Resource Sharing welche mittlerweile von den meisten Browsern unterstützt wird. Damit lassen sich per XMLHttpRequest auch fremde Ressourcen laden. Bedingung: der Server muss ausdrücklich mitteilen, dass seine Ressourcen in einem XMLHttpRequest eines fremden Clients angefordert werden dürfen. Er tut dies indem er folgenden HTTP-Header in der Response setzt:
    Access-Control-Allow-Origin: *

    Da dies wie gesagt vom Server (also in unserem Fall von LogoControl) gesetzt werden muss, hab ich mal eine Testversion von LogoControl erstellt, die diesen HTTP-Header sendet:
    LogoControl.exe (mit CORS-Header)

    Teste bitte mal, ob das dein Problem behebt. Falls ja (wovon ich ausgehe), werde ich ein neues Release von LogoControl veröffentlichen.

    #2986
    raschner
    Teilnehmer

    Hallo
    habe LogoControl.exe umbenannt und deine exe mit CORS Header ins Verzeichnis LogoControl
    kopiert; dabei gibt es Fehlermeldungen und ständigen restart, muss ich ev. noch was zusaetzlich machen?
    Mit cgi-Programmierung müsste das Problem auch zu lösen sein ?

    hier /tmp/LogoControl.log:

    01.07.2016 22:20:27: Fehler beim Laden der config.xml: Invalid start element: :logo
    System.Xml.Schema.XmlSchemaValidationException: Invalid start element: :logo
    at System.Xml.XmlReaderSettings.OnValidationError (System.Object o, System.Xml.Schema.ValidationEventArgs e) [0x00000] in <filename unknown>:0
    at Mono.Xml.Schema.XmlSchemaValidatingReader+<XmlSchemaValidatingReader>c__AnonStorey0.<>m__1 (System.Object o, System.Xml.Schema.ValidationEventArgs e) [0x00000] in <filename unknown>:0
    at System.Xml.Schema.XmlSchemaValidator.HandleError (System.Xml.Schema.XmlSchemaValidationException exception, Boolean isWarning) [0x00000] in <filename unknown>:0
    at System.Xml.Schema.XmlSchemaValidator.HandleError (System.String message, System.Exception innerException, Boolean isWarning) [0x00000] in <filename unknown>:0
    at System.Xml.Schema.XmlSchemaValidator.HandleError (System.String message) [0x00000] in <filename unknown>:0
    at System.Xml.Schema.XmlSchemaValidator.ValidateStartElementParticle (System.String localName, System.String ns) [0x00000] in <filename unknown>:0
    at System.Xml.Schema.XmlSchemaValidator.AssessOpenStartElementSchemaValidity (System.String localName, System.String ns) [0x00000] in <filename unknown>:0
    at System.Xml.Schema.XmlSchemaValidator.ValidateElement (System.String localName, System.String namespaceUri, System.Xml.Schema.XmlSchemaInfo schemaInfo, System.String xsiType, System.String xsiNil, System.String xsiSchemaLocation, System.String xsiNoNamespaceSchemaLocation) [0x00000] in <filename unknown>:0
    at Mono.Xml.Schema.XmlSchemaValidatingReader.Read () [0x00000] in <filename unknown>:0
    at System.Xml.XmlDocument.Validate (System.Xml.Schema.ValidationEventHandler handler, System.Xml.XmlNode node, XmlSchemaValidationFlags flags) [0x00000] in <filename unknown>:0
    at System.Xml.XmlDocument.Validate (System.Xml.Schema.ValidationEventHandler validationEventHandler) [0x00000] in <filename unknown>:0
    at LogoControl.DataModel.Configuration.ValidateXml (System.Xml.XmlDocument xdoc) [0x00000] in <filename unknown>:0
    at LogoControl.DataModel.Configuration.LoadFromXmlString (System.String xmlString) [0x00000] in <filename unknown>:0
    at LogoControl.Controller.Start () [0x00000] in <filename unknown>:0
    (no inner exception)
    01.07.2016 22:20:29: Fehler beim Laden der config.xml: Invalid start element: :logo
    System.Xml.Schema.XmlSchemaValidationException: Invalid start element: :logo

    #2987
    admin
    Administrator

    Oh, dann verwendest du noch eine alte Version von LogoControl mit dem alten Format der config.xml. Die Version mit den CORS Headern basiert auf der 0.5.x Reihe, bei welcher du eine neue config benötigst (siehe Migrationsanleitung im Download Bereich). Sprich: erst musst du vollständig updaten auf 0.5.2 und dann die CORS Exe verwenden.

    #3005
    raschner
    Teilnehmer

    klappt einfach nicht, exakt den selben url im browser liefert brav true ab
    aber aus der Website immer status 0

    Website zusammengebastelt:
    <!DOCTYPE html>
    <html>
    <body>

    <div id=“tor0″></div>
    <div id=“tor1″ style=“width: 100px; float:left“>Falle1</div>

    <script>
    function setLControl(url,elem_no) {
    alert(„in setLControl:“+url);
    console.log(‚Entry setLControl‘, url);
    //Bsp.:https://wwkw.selfhost.eu:8080/rest/devices/3/methods/2
    var x = new XMLHttpRequest();
    console.log(‚UNSENT‘, x.status);
    x.open(„GET“,url,true);
    //alert(„in setLControl nach x.open“+x.readyState+“ Status:“+x.status);
    console.log(‚OPENED‘, x.status);
    x.onprogress = function () {
    //alert(„in setLControl nach x.open“+x.readyState+“ Status:“+x.status);
    console.log(‚ONPROGRESS=LOADING‘, x.status);
    };
    x.onload = function () {
    //alert(„in setLControl nach x.onload“+x.readyState+“ Status:“+x.status);
    console.log(‚ONLOAD=DONE‘, x.status);
    };
    x.send();
    var str=x.responseText;
    alert(„in setLControl:“+str);
    document.getElementById(„tor1″).innerHTML = str;
    return str;
    }

    </script>

    </body>
    <div id =“tblist1″>
    <button type=“button“ onclick=“setLControl(‚https://88:88@wwkw.selfhost.eu:8080/rest/devices/1/methods/2&#8216;,1)“ style=“position: absolute; left: 0px; top:270px“>LC</button>
    </div>
    </html>

    #3006
    admin
    Administrator

    Hab mal etwas herum probiert: So wie es aussieht funktioniert das nur solange keine Benutzeranmeldung erforderlich ist, also beim LogoControl HTTP service und nicht beim HTTPS. Die Art wie der Browser die HTTP Basic Authentication durchführt ist in Kombination mit dem CORS-Header wohl ein Problem. Ich schau mal ob ich eine Lösung finde…

8 Beiträge anzeigen - 1 bis 8 (von insgesamt 8)
  • Du musst angemeldet sein, um zu diesem Thema eine Antwort verfassen zu können.