Richtiger Umgang mit der JSON-Schnittstelle

Hallo Leute,

mit

	$rpc = new JSONRPC("http://".$k_RPiTV['User'].":".$k_RPiTV['Password']."@".$ipRPi.":3777/api/");
	$rpc->IPS_RunScriptWaitEx(17145 /*[Objekt #17145 existiert nicht]*/ , Array("command" => $command));
	$result = $rpc->GetValueString(11910 /*[Objekt #11910 existiert nicht]*/);

ist es mir erfolgreich gelungen, eine Verbindung vom „Haupt-IPS“ zu einem IPS auf einem Raspberry Pi aufzubauen, wobei „User“ und „Passwort“ die Anmeldedaten des Raspberry Pi sind… 8da wäre ich nach der Anleitung nicht drauf gekommen…)

Nun versuche ich vom Raspberry Pi umgekehrt eine Verbindung aufzubauen, was mir aber bisher noch nicht geglückt ist, auch nicht nach der Anleitung

Welchen Port (Webserver oder 3777) nimmt man für welchen Fall?
Welche User/Passwort-Kombination ist wann richtig?

Joachim

User/Passwort ist immer das was beim Zielsystem hinterlegt ist. Wenn unter Windows kein Passwort für Fernzugriff hinterlegt ist, geht es nur über localhost:3777 (laut Doku).
Wenn du aber den Fernzugriff aktiviert hast, geht es auch über die IP/Port der Webserver-Instanz.
Michael

Hallo Michael,

vielen Dank für Deine Antwort, obgleich ich weiterhin verwirrt bin…:confused:

Der Raspberry Pi ist im gleichen LAN. Ihn spreche ich über den Raspberry Pi User, das Raspberry Pi Passwort und Port 3777 an - Passwort und User haben also erst einmal nichts mit IPS zu tun, so funktioniert es aber…

Im Analogieschluß müsste ich ja den Windows User und das Windows Passwort nutzen - da habe ich keines gesetzt…
Den Fernzugriff habe ich eingeschaltet, damit hätte ich schon mal ein Passwort, der User soll laut meinem Verständnis der Anleitung der Lizenz-Benutzername sein, der enthält aber schon mal ein „@“ was vielleicht schon deswegen nicht funktioniert…

$rpc = new JSONRPC("http://Lizenz-Benutzername:Fernzugriff-Passwort@IP-des-Windows-IPS:3777/api/");

Sollte es so funktionieren??

Jochim

…bei 99 Betrachtern und keiner helfenden Antwort scheint die Herausforderung wohl nicht „trivial“ zu sein…:smiley:

Joachim

Bei Windows ist der Port dein WebFront Port. Also z.B. 82. Die 3777 gilt nur für die neuen Test-Versionen :slight_smile:
Und falls du SSL aktiviert hast… nicht vergessen https zu nutzen :smiley:

Freut mich aber, dass sich jemand an die RPC Schnittstelle wagt!

paresy

Hallo Paresy,

vielen Dank für Deine Antwort.

Und wie lautet dann User und Passwort? (Passwort = Passwort des aktivierten Fernzugriffs, User = Lizenz-Benutzername -> E-Mailadresse (per Definition schon mit „@“)??)

Joachim

Nachtrag: Ist es denn „im Sinne des Erfinders“, dass die Schnittstelle bei Raspberry Pi über User/Passwort des Raspbian - also losgelöst zum IPS - erfolgt?

Wie schon vor fast einem Jahr hier und noch einmal hiergeschrieben, ist meiner Meinung nach die Datenaustausch Doku für die JSONRPC-Klasse seit 3.1 (oder 3.2) nicht mehr korrekt. User und Password müssen Base64 im Header und nicht in der URL übergeben werden, weil das „@“ im Lizenzusernamen=Email als Trennzeichen zum Host interpretiert wird. Wüßte nicht, das das in der Zwischenzeit offiziell gefixt wurde.

Im ersten Link ist ein Beispiel zum Setzen des Headers aus meinem Wrapper. Funktioniert so bestens.

Tommi

Hallo Tommi,

vielen Dank für Deine Antwort und die Erläuterung. Da muss ich mich mal etwas intensiver mit beschäftigen…

@Paresy: Gibt das dazu vom Entwicklerteam eine Stellungnahme?

Joachim

Fix kommt dafür im nächsten 3.4er Update. Dann läuft es genauso wie auf dem Pi :slight_smile:

Aber kann es sein, dass bei dir die Verbindung vom Pi zu Windows geht? Es dürfte nur die Verbindung von Windows auf Pi betroffen sein.

paresy

…Fix hört sich gut an!:slight_smile:

Also:
Verbindung vom Windows-IPS zum RaspberryPi-IPS (läuft bisher problemlos):
User = Raspbian User
Passwort = Raspbian Passwort
IP = IP des Pi
Port = 3777
(User/Passwort haben also per Definition nichts mit IPS zu tun, sondern sind die Einstellungen des Raspbian - was mich nach der Anleitung zum Datenaustausch schon sehr wundert…)

Im Analogieschluss - Du schreibst „Dann läuft es genauso wie auf dem Pi“ - müsste das dann ja dem Windows User und dem Windows Passwort entsprechen…

Erwartungsgemäß würde ich sagen, warum nicht die Daten zur Authentifizierung aus den Einstellungen des Webfronts (z.B. auf dem der auf Port 82 läuft) nehmen?

Joachim

Ich glaube du hast auf deinem Pi einfach gar kein Password für den Fernzugriff angegeben. Somit kannst du dein Raspbian User/Pass einfach weglassen und es wird gehen :smiley:

paresy

…die Idee das zu probieren ist mir zwischendurch auch schon in den Kopf geschossen!:smiley:

Wenn man Nägel mit Köpfen machen möchte, könnte man den „Datenaustausch zwischen IPS“ ja auch als neue „I/O-Instanz“ definieren, auf denen dann für den „Gegenpart“ die wichtigen Daten (IP, Port, User, Passwort…) zentral auf einer Maske definiert werden - dann wäre die Anrede über soetwas wie (IPS_JSONRPC(ObjektID, IPS_Befehl):wink: möglich…:wink:

Joachim

Gute Idee --> Feature Request !!!

Gute Idee --> Feature Request !!!

Wozu soll das gut sein? Die 3 Anmeldedaten schreibt man doch besser gleich in ein include. Andernfalls muss mass sich wieder die Objekt-ID des IO-Modules notieren und weglegen. Ich glaube, Paresy hat da wichtigere Baustellen. Zumal das alles jetzt schon geht.

Hier ein Beispiel aus meiner API. Als erstes ein kleines Include mit Usernamen/Password für die API

#IPS_JSON_config.cfg for PHP and Perl
#commandline parameter will have precedence over this
#this code will be executed by the calling script, no  Tags allowed
$host='ips';
$user="user@ipsymcon.de";
$password="ipsymcon";
$port=82;

Anwendung ohne Wrapper:

include ('IPS_JSON.php');
$user='...';
$password='...';
$host='...';
$port=...;
$config='IPS_JSON_config.cfg';
if (file_exists($config))  {
	$config_data=file_get_contents($config);
	$res=eval($config_data);
	if ($res===false) {
		echo "eval of $config failed. Hint:Use code only, no leading php tags
";
		exit;
	}
}
$url="http://".$host.":".$port."/api/";
$ips = new IPS_JSON($url,$user,$password);
$version=$ips->IPS_GetKernelVersion; //IPS_GetKernelVersion ist ein Standard IPS-Befehl
if (!$version) {
	die ("IPS Request failed:".$ips->getErrorMessage()."
");
}else{
	print "$version
";
}

Der o.g. Wrapper reduziert den Code auf ein Minimum. Dort ist schon alles eingebaut. Das Wrapper Script kann man sich selber generieren. Ab jetzt ist es Egal, ob man den gleichen Code innerhalb von IPS oder auf einer beliebigen anderen PHP-Umgebung ausführt.


if (!function_exists('IPS_GetKernelVersion')) {
   //we are outside of IPS and need the JSON wrapper
   include('ips_wrapper.php'); 
}
$version=IPS_GetKernelVersion();
print $version;	

Weitere Beispiele finden sich in meinen Scripten. Man kann mit der JSON RPC eigentlich alles machen, wo man keine Echtzeit-Anforderungen oder Laufzeitprobleme hat. Und man hat nicht den Hassle mit den Modulversionen wie beim SDK, das es für Linux ohnehin (noch?) nicht gibt…

Tommi

Hallo Tommi,

ähnliche Verfahrensweisen gibt es sicher auch für die „händische“ Erstellung eines Clientsockets, einer 1-Wire- oder Homematic-anbindung usw. - und trotzdem versucht man die „grundsätzlichen Funktionen“ in Konfiguratoren o.ä. abzubilden…

Deine Skripte in Ehren, aber m.E. ist es nicht förderlich solche „zugesicherten Funktionen“ in der Form (dauerhaft)abzubilden. Wenn jemand sich die Mühe macht um unsupportete Geräte an IPS anzubinden, ist das etwas anderes.

…und ganz ehrlich: Auch wenn ich schon ein Stück weit Erfahrung habe, was das Programmieren in IPS angeht, so ist mir ad hoc nicht klar wie ich Deine Skripte anwenden soll (kommt vielleicht noch mit Try and Errror). Wie soll denn erst ein Anfänger diese zugesicherte Funktion nutzen?

Joachim

…gibt im Übrigen auch eine „Triviallösung“::smiley:

 $rpc = new JSONRPC("http://user".chr(64)."domain.de:Fernzugriffkennwort@192.168.178.41:82/api/");
$result = $rpc->IPS_GetKernelDir();
echo "KernelVersion: ".$result;

Firewall auf Port 82 freischalten nicht vergessen!

Joachim

Hallo Paresy,

der JSON-Zugang ganz ohne User und Passwort vom Windows-IPS zum Raspberry Pi-IPS führt zu einer Fehlermeldung.
Was mich aber zu der Frage führt, wie ich im Linux-IPS überhaupt den Fernzugang freischalte…
Im Windows IPS mache ich das über das schicke Icon in der Leiste -> Information -> Fernzugriff ändern.
Und in der Linux-Version?

Joachim

Schau mal hier: IP-Symcon Community Forum :slight_smile:

paresy

Hallo Paresy,

ich habe heute mal Zeit gefunden und das Fernzugriff-Passwort auf den zwei Raspberry Pi gesetzt. Wenn ich jetzt versuche mit der Konsole darauf zuzugreifen wird User/Passwort bemängelt. Als User habe ich meine E-Mail-Adresse eingesetzt, als Passwort das was ich gerade Base64-Codiert dort habe eingetragen (letzte Zeile).
Habe ich das „@-in-E-Mail-Adresse-Problem“?

Joachim

Ziemlich sicher. Das Problem sollte mit der 3.4 für dich korrigiert sein.

paresy