Dann fange ich mal an, nachdem ich ein paar Tests gemacht habe.
Der json-Treiber benötigt einen TCP-Server auf der Seite des Backends, dessen IP-Adresse und Port im Kofigurationsmenü eingestellt werden.
Der Treiber ./driver/io_json.js arbeitet mit einem lokalen Proxy (./driver/io_json.php), der die eigentlichen Anfragen beim Backend durchführt. Dadurch sind auch cross-domain Verbindungen möglich, die bei den Ajax-Anfragen des Treibers sonst blockiert werden würden.
Beim Aufrufen einer Seite werden alle dafür benötigten items ermittelt (widget.listeners()) und dem ersten Request als Daten mitgegeben:
Das Backend muss dann im JSON-Format antworten:
Dabei steht <LF> für line-feed (\n, bzw. HEX 0A) und <EOT> für end-of-transfer (\4 bzw. HEX 04). Der Request liest maximal 128 Zeichen oder bis zum in den Daten enthalteten line-feed und benötigt dann ein <EOT>.
In meinen Tests mit dem Netzwerktool "Hercules" ist es mir nicht gelungen, ein JSON zu senden, das der Ajax-Request als solches akzeptiert. Deshalb habe ich in der io_json.js nochmal ein parseJSON eingefügt:
Ob das für den realen Betrieb wirklich nötig ist, kann ich nicht weiter testen. Schaden sollte es aber nicht.
Wenn "realtime"-Daten in der Konfiguration eingeschaltet sind, geht der Treiber in den Poll-Modus, d.h. er fragt pro Sekunde einmal beim Backend alle items der Seite an. Es sollte aber ausreichen, wenn die Gegenstelle nur das jeweils geänderte item zurück gibt.
Um z.B. aus einem Widget ein item mit io.write() zu schreiben, wird ein GET-Request an io_json.php geschickt, in dem das item und sein Wert in der URL mitgeliefert werden:
Zur Bestätigung muss das Backend eine "1" senden, gefolgt von line-feed und <EOT> um die Antwort zurückzugeben, also: 1<LF><EOT> oder 1\n\4. Erst mit dieser Bestätigung aktualisiert der Treiber die Daten im zentralen Speicher (widget.buffer).
In der io_json.php war IMHO noch ein Fehler, der die Rückmeldung nicht an das richtige item geschickt hat. Zeile 96 muss heißen
anstelle
Die Änderungen und eine Verbesserung des Fehlerhandlings sind in dem heute veröffentlichten Release von v3.3.1 enthalten.
Gruß
Wolfram
Der json-Treiber benötigt einen TCP-Server auf der Seite des Backends, dessen IP-Adresse und Port im Kofigurationsmenü eingestellt werden.
Der Treiber ./driver/io_json.js arbeitet mit einem lokalen Proxy (./driver/io_json.php), der die eigentlichen Anfragen beim Backend durchführt. Dadurch sind auch cross-domain Verbindungen möglich, die bei den Ajax-Anfragen des Treibers sonst blockiert werden würden.
Beim Aufrufen einer Seite werden alle dafür benötigten items ermittelt (widget.listeners()) und dem ersten Request als Daten mitgegeben:
Code:
item:"og.buero.licht.fenster,og.buero.licht.decke, og.buero.steckdose.ost"
Code:
{"og.buero.licht.decke":"0","og.buero.licht.fenste r":"0","og.buero.steckdose.ost":"0"}<LF><EOT>
In meinen Tests mit dem Netzwerktool "Hercules" ist es mir nicht gelungen, ein JSON zu senden, das der Ajax-Request als solches akzeptiert. Deshalb habe ich in der io_json.js nochmal ein parseJSON eingefügt:
Code:
if (typeof response == "string") response = $.parseJSON(response);
Wenn "realtime"-Daten in der Konfiguration eingeschaltet sind, geht der Treiber in den Poll-Modus, d.h. er fragt pro Sekunde einmal beim Backend alle items der Seite an. Es sollte aber ausreichen, wenn die Gegenstelle nur das jeweils geänderte item zurück gibt.
Um z.B. aus einem Widget ein item mit io.write() zu schreiben, wird ein GET-Request an io_json.php geschickt, in dem das item und sein Wert in der URL mitgeliefert werden:
Code:
GET http://localhost/svnext/driver/io_json.php?item=og.buero.licht.fenster&val=2&_=16 74726969145
In der io_json.php war IMHO noch ein Fehler, der die Rückmeldung nicht an das richtige item geschickt hat. Zeile 96 muss heißen
Code:
$ret[$this->item] = $this->val;
Code:
$ret[$this->item[0]] = $this->val;
Gruß
Wolfram
Kommentar