Rolf B: URL per Button an Mediola Gateway senden

Beitrag lesen

Hallo Sigi,

http://192.168.2.35/command?code=19082401000900000100E0587D0101000100000000000100000000&XC_FNC=Send2

Das ist ein URI (universal resource identificator). Er folgt dem Schema http, er richtet sich an das Gerät an der Adresse 192.168.2.35, und zwar am IP Port 80 (was der Default für http ist), und er ruft dort die Ressource "command" ab.

Bei diesem Abruf werden zwei Parameter übergeben: code und XY_FNC.

Der Server, der auf 192.168.2.35 am Port 80 auf http Anfragen lauscht, hat nun die Aufgabe, aus der Ressourcenabfrage

/command?code=19082401000900000100E0587D0101000100000000000100000000&XC_FNC=Send2

etwas zu machen. Ein klassischer Webserver versucht, Ressourcenabfragen auf Dateien abzubilden, die er dann ausliefert oder - beispielsweise bei PHP Scripten - ausführt.

Man KANN - beispielsweise auf einem Apache - über URL Rewrites hergehen und /command in ein command.php übersetzen. Dieses würde dann zwei GET Parameter erhalten: code und XC_FNC, und könnte daraus dann irgendwelche Aktionen ableiten.

Das muss das Mediola Gateway aber nicht zwingend tun. Es bekommt einfach diese Zeichenkette /command...Send2 und darf sie nach Laune interpretieren. Es darf sich an die Regeln für URIs halten, sollte das auch, muss aber nicht. Abfragen wie

http://192.168.2.35/bitte_schalte_den_fernseher_aus
http://192.168.2.35/bitte_mach_den_ton_etwas_leiser

könnte man durchaus ebenfalls zulassen.

Für Dich bedeutet das: du musst auf deiner Seite die entsprechenden Requests an das Mediola Gateway schicken. Das geht im einfachsten Fall über einen Link, d.h. du schreibst auf deiner Webpage

<a href="http://192.168.2.35/bitte_schalte_den_fernseher_aus">Fernseher aus</a>

naja, oder mit einer command... URL. Die kennst Du sicherlich besser als ich.

Die Benutzererfahrung ist da aber nicht so gut. Die Folge eines solchen Links dürfte ein leerer Bildschirm sein, oder einer, der fast leer ist und auf dem nur noch "ok" steht.

Schöner geht das mit JavaScript. Aber dann stößt Du auf ein neues Problem: XSS (Cross Site Scripting). Du bist auf Site A (deine Webseite) und willst eine Ressource auf Site B (Mediola) abrufen (dieses /command Dings). Das ist verboten. Der Browser kann nämlich nicht zwischen deiner Mediola-Steuerung und einer bösen Seite unterscheiden, die dein Bankkonto plündern will.

Die einzige Möglichkeit, die ich kenne, um das zu umgehen, ist ein spezieller Aufruf mit dem fetch-API, dem Du den mode-Parameter auf "no-cors" setzt. Der Aufruf wird dann durchgeführt, aber du bekommst auf dem Weg keine Daten.

   fetch("http://192.168.2.35/command?...Send2", { mode: "no-cors" });

Sorry. Das ist lästig. Bedanke Dich bei den Piraten da draußen, die solche Schranken nötig machen. Das CORS Konzept setzt eine aktive Mitwirkung der aufgerufenen Seite voraus (also das Mediola Gateway), es muss einen passenden CORS Header zurückgeben der Aufrufe von beliebigen Seiten gestattet (Access-Control-Allow-Origin: *). Vielleicht liefert es den ja, das müsstest Du einmal evaluieren.

Eine andere Alternative ist ein Webserver mit PHP im gleichen Netz wie das Mediola Gateway, von dem Du deine Seite lädst. Deine Seite kann mit AJAX Techniken Requests an PHP Scripte auf dem Webserver schicken, und die leiten die Aufrufe nach Mediola durch. An der Stelle hast Du keine XSS Sperre mehr.

Rolf

--
sumpsi - posui - clusi