Zugriff auf Native JSON-RPC Schnittstelle

Hallo,
auch auf die Gefahr hin, dass ich (trot 30 Minuten Suche) ein bestehendes Topic übersehen habe…
Kann mir jemand einen Tipp geben wie ich bei der neuen 3.0 Beta auf die „Native JSON-RPC Schnittstelle“ zugreifen kann?
Ich habe bereits einen Webserver angelegt, bei dem ich „Enable Json-RPC“ gesetzt habe und habe diesem den Port 81 sowie einen leeren Ordner mit Namen „rpc“ zugeordnet.

Leider kriege ich keine Verbindung mir dieser Schnittstelle aus VS 2012…

Schon mal danke für jegliche Hilfe.

Gruß Detlef

Es gibt dafür noch leider keine Doku. Aber der Endpoint ist in http://ip:port/api und die Befehle sind 1:1 wie in PHP.

paresy

Hallo Paresy,
erst mal danke für die schnelle Antwort!

Ich habe den Endpunkt so wie angegeben und es nochmal versucht.

Kriege dann folgende Meldung:
Fehler beim Herunterladen von „http://192.168.2.106:81/api/$metadata“.
Anforderung nicht erfolgreich mit HTTP-Status 404: Not Found.
Metadaten enthalten einen Verweis, der nicht aufgelöst werden kann: „http://192.168.2.106/api“.
Es war kein an http://192.168.2.106/api lauschender Endpunkt vorhanden, der die Nachricht annehmen konnte. Dies wird häufig durch eine fehlerhafte Adresse oder SOAP-Aktion verursacht. Weitere Details finden Sie unter „InnerException“, sofern vorhanden.

Fällt Dir hierzu auf die schnelle noch was ein?
Falls nicht mache ich mich mal in den VS und JSON Foren schlau…

Gruß Detlef

Hmm,

die alte in PHP implementierte JSON Schnitstelle liefert beispielsweise bei folgendem Aufruf:

http://IP:Port/jsonrpc.php?{"jsonrpc":"2.0","method":"GetValue","params":[36445],"id":"Null"}

den Variablenwert zurück:

{"jsonrpc":"2.0","result":false,"id":"Null"}

Wie müsste denn dieser Aufruf für die neue API aussehen? Alle Abwandlungen, die ich bisher probiert habe, waren leider nicht unbedingt von Erfolg gekrönt… :o

@Detlef: Ich weiß nicht, wie deine Library für VS.NET funktioniert. Aber in der offiziellen JSON-RPC Doku gibt es keine $metadata Erweiterung die wie z.B. bei SOAP per WSDL die Dienste beschreibt. Du musst also eher direkt im Quellcode einfach die Funktion + Parameter angeben und ausführen.

@meson123:

Requests müssen per POST Request gesendet werden.

Außerdem gab es noch Fehler in der API, die ich jetzt in der #2890 korrigiert habe. Anbei ein Beispiel:


echo file_get_contents('http://ip:82/api/', false, stream_context_create(
    array('http' =>
        array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/json; charset=utf-8',
        'content' => '{"jsonrpc":"2.0","method":"GetValueformatted","params":[38809],"id":"null"}'
        )
    )
));

paresy

Vielen Dank, auf die Art funktionierts perfekt! :smiley:

Hatte zwar vor Paresys Lösung schnellstmöglich auszuprobieren.
Komme aber Jobbedingt gerade nicht dazu.
Werde aber hier posten sobald ich EWrgebnisse habe…

bin ich nung gekommen.
Habe die ganze Anfrage in C reingepackt und es schient nun auch soweit mal zu laufen.
Allerdings steht in der Response welche ich nach dem Request an „http://192.168.2.106/api“ kriege drin, dass der Remote Srver den Fehler „Not found“ sendet.
Ich habe spaßeshalber mal als Port den meines normalen Webfront genommen und bei der Anfrage das „/api“ weggelassen.
In dem Fall zeigt mir der Debugger in Visual Studion zumindest eine Response mit gültigem Inhalt an…
Wenn ich auf den normalen Webfront Port die JSON Option aktiviere und es dann mit „…/api“ probiere kriege ich die gleiche Meldung wie auf Port 81/api…

Scheint also als ob der Request zwar auf dem richtigen Port ankommt, hinter /api aber keinen Abnehmmer findet. Oder sehe ich das falsch?

Gruß Detlef

ip: port/api/ liefert bei mir


{ "IP-Symcon": "3.00", "API": "0.1", "JSON-RPC": "2.0" }

Hallo Ralf,
kriegst Du das bei Aufruf im Browser zurück oder in einem Programm?
Gruß Detlef

Im Browser.

Dank dem Tipp von Ralf bin ich jetzt doch etwas weiter.
In Paresys Post stand
ip:port/api
Bei ralf
ip:port/api/

Der abschließende Slash macht einen großen Unterschied :wink:

Werde morgen oder übermorgen mal schauen ob ich jetzt weiter komme…

Erstmal eine gute Nacht!

Gruß Detlef

So, hab’s mittlerweile über normalen HTTP Request geschafft auf die JSON RPC zuzugreifen und konnte die JSON Daten auch deserialisieren.
Mal schauen was sich damit anfangen lässt.

Gruß Detlef

Das ganz ist ab Version 3.0 RC2 noch einfacher: http://www.ip-symcon.de/service/dokumentation/entwicklerbereich/datenaustausch/

Im Prinzip muss nur noch einmal im Skript das $rpc Objekt erstellt werden und dann schreibt ihr vor den normalen IP-Symcon Befehl das $rpc-> und schon wird der Befehl auf einem anderen IP-Symcon Server ausgeführt!

paresy

Hallo alle zusammen,

bei einem „HttpWebRequest“ bekomme ich dies Fehlermeldung:

{„id“:„null“,„error“:{„message“:„Invalid Username/Password for JSON-RPC!“,„code“:"-32603"},„jsonrpc“:„2.0“}

In IPS funktioniert das:


$rpc = new JSONRPC("http://User:password@192.168.2.103:82/api/");
$rpc->IPS_RunScript(10693 /*[Schäferweg\Obergeschoss\Büro\HM_Büro_Licht\.SWITCH_DEVICE]*/ );

Weis jemand wie ich bei einem WebRequest den User und das Passwort übergebe?

Das funktioniert nicht:

request = HttpWebRequest.Create(„http://User:Password@192.168.2.103:82/api/“)

Edit:

Das geht auch nicht:

request = HttpWebRequest.Create(„http://192.168.2.103:82/api/“)
request.Credentials = New System.Net.NetworkCredential(„User“, „password“)

Besten Dank für Eure Hilfe.

Die Antwort aus diesem Thema sollte dich ans Ziel führen: :slight_smile:

paresy

Besten Dank paresy.

Bin mal wieder unterwegs (Mannheim).
Werd das am Wochenende probieren.

Nochmals besten Dank!!

Hallo paresy,

Das hat geklappt. Besten Dank!! :slight_smile: