Datenaustausch zwischen zwei IP-Symcon Systemen

Ich versuche den Inhalt einer Variablen aus einem anderen IP-Symcon System abzufragen.
Das Ziel System verwendet SSL für den Webzugriff. Externer Zugang ist freigeschaltet und ich kann problemlos auf die Webseite zugreifen.
Mein Code sieht so aus :

$rpc = new JSONRPC(„http://user:password@127.0.0.1:82/api/“);
echo $rpc->GetValueFormatted(43415 /[Object #43415 does not exist]/);

Wobei für „user“ mein Lizenz Name,für „password“ mein passwort des Zielsystems und für „127.0.0.1“ der DynDns Name meine Zielsystems steht.

Ich erhalte dann die folgende Fehlermeldung :

Warning: file_get_contents(http://…XXXXXXXXXX:82/api/): failed to open stream: HTTP request failed! in C:\IP-Symcon\scripts__jsonrpc.inc.php on line 33

Warning: array_walk_recursive() expects parameter 1 to be array, null given in C:\IP-Symcon\scripts__jsonrpc.inc.php on line 40

Hat jemand eine Idee was ich hier falsch mache ?

Auf den ersten Blick.
Wenn du SSL verwenden willst.
https:// statt http://
Michael

Dann erhalte ich die folgende Fehlermeldung :

Warning: file_get_contents(): Unable to find the wrapper „https“ - did you forget to enable it when you configured PHP? in C:\IP-Symcon\scripts__jsonrpc.inc.php on line 33

Warning: file_get_contents(): Unable to find the wrapper „https“ - did you forget to enable it when you configured PHP? in C:\IP-Symcon\scripts__jsonrpc.inc.php on line 33

Warning: file_get_contents(https://…xxxxxxxxxxxxxxxxxx/api/): failed to open stream: Invalid argument in C:\IP-Symcon\scripts__jsonrpc.inc.php on line 33

Warning: array_walk_recursive() expects parameter 1 to be array, null given in C:\IP-Symcon\scripts__jsonrpc.inc.php on line 40

Wohl das übliche OpenSSL Thema… ?!
Wird OpenSSL geladen beim IPS Start (Logfile)?
Michael

Ich denke schon da ich SSL(Plink) einsetze und die Webseiten alle über SSL abgesichert sind, das würde ohne SSL Library nicht funktionieren. An das Logfile komme ich im Moment nicht ran :frowning:

Plink macht das doch ohne Lib, oder ? Aber für IPS wird ja eigentlich immer eine geladen, Thema ist ja manchmal die Version wegen Abhängigkeiten von PHP-Modulen.

Aber vielleicht bin ich ja auch auf dem Holzweg… jemand Ideen ?
Michael

Mich wundert, das es überhaupt noch mit dem URL-Format http://user:password@ipshost:82…funktionieren soll, da der Username normalerweise die Lizenz-Email ist, wo auch schon ein @ drin ist und deshalb dem file_get_contents nicht mehr klar ist, was der Username und was der Host ist. Stattdessen sollte man doch einen Base64 codierten HTTP Authheader mitschicken, was ich in der API-Wrapper Klasse auch gemacht habe.

Wenn ich in _jsonrpc so reinschaue wird auch nicht geprüft, ob überhaupt ein gültige JSON-Antwort vom Server kommt. Wenn jsondecode in Zeile 35 Null zurückliefert, liefert ObjectTo Array(ab Zeile 50) auch Null und so kommt bei der Arraywalk-Funktion auch nie ein Array an.

Tommi

Stimmt die Auth im Header hatte ich auch schon gesehen… ich wuste doch das da was war…
Nun fehlt nur noch die Erfolgsmeldung von BestEx.
Wobei die Doku aber noch was anderes aussagt.
http://www.ip-symcon.de/service/dokumentation/entwicklerbereich/datenaustausch/
Michael

Liebe Jungs, dass ist bestimmt die Lösung aber ich scheitere schlicht an meiner Unkenntnis zu diesem Thema. Ich habe jetzt den folgenden Syntax versucht :

$rpc = new JSONRPC(„http://Basic <base64code des Users+PW>@<dyndnsurl>:82/api/“);
Zum Kodieren nutze ich Base64 Online - base64 decode and encode

gleiche Fehlermeldung

Hier war der Beitrag von Tommi
JSON-RPC Zugang

Vielleicht reicht es auch wenn du username und password getrennt mit urlencode kodierst? K.a. wie PHP das im Wrapper umsetzt.
Viel mir jetzt noch so ein, wegen Punkt und @ im Usernamen.
Finde es aber dennoch merkwürdig das er sagt er hat für https keinen Wrapper …
Michael

Funktioniert trotzdem nicht. Ich bin jetzt an dem Punkt wo ich sage die Doku stimmt nicht und @Paresy sollte jetzt mal ein richtiges Beispiel zeigen

Sorry wenn ich mich da so einmische… diese ganze API ist im Moment für mich nicht so ganz Nachvollziehbar.
Mit ein paar Zeilen Code , ohne Passwort und Code Prüfungen, alles machbar ist ?

Simpel … den code in das webfront Verzeichnis als zb. x.php und dann im Browser
http://ip/x.php?f=GetValue&p1=11214 <- natürlich eine gültige ID angeben.


<?
$function=$_REQUEST['f']; $params=[];
for($j=1;$j<3;$j++){
	if(isSet($_REQUEST['p'.$j])){
		$v=$_REQUEST['p'.$j];
		if (is_bool($v))$params[]=(bool)$v;
		else if(is_numeric($v))$params[]=(int)$v;
		else $params[]=$v;
	}
}
if(function_exists($function)){
	switch(count($params)){
		case 1: $return=$function($params[0]);break;
		case 2: $return=$function($params[0],$params[1]);break;
		case 3: $return=$function($params[0],$params[1],$params[1]);break;
		default : $return=$function();
	}
}else $return='NICHTS';
echo $return;	
?>

cu
Xaver

Die Datenaustausch-Doku ist mM. von den Beispielen her wirklich outdated.

Wie beschrieben verwende ich meine eigene API-Wrapper Klasse statt _jsonrpc.php. Funktioniert bis jetzt bestens. Einfach in die Konfig Host, User und Password eintragen, bei Bedarf den Wrapper neu generieren und includen, dann kann man die normalen IPS-Funktionen wie innerhalb von IPS direkt aufrufen.

@softbar: Sollte im Prinzip so gehen. Parameter-Checks vor dem Aufruf und Fehlerbehandlung wären mehr als sinnvoll.

Tommi