Ich versuche gerade ein Modul zu schreiben bei dem über ein HTTP-Request (POST) ein JSON empfangen wird. Dieses JSON enthält ein Feld. Ich habe mir gedacht hierfür einen Server Socket zu verwenden.
Nach den zahlreichen Beispielen die es hier gibt ist mir dazu noch kein Licht auf gegangen. Aber Ich werde hier kurz beschreiben was ich gemacht habe.
anlegen meines Moduls indem im Ordner „modules“
1a. Ich habe die library.json angelegt und zwei Unterverzeichnisse
1b. In dem Hauptunterverzeichnis habe Ich die die module.php angelegt die von IPSModule erbt.
Ich habe einen server socket angelegt, den Port gesetzt und aktiv geschaltet.
Es kommen Daten bei dem server socket an. Diese kann Ich im Debugfenster sehen. Des weiteren sehe Ich im log das eine Eingehende Verbindung registriert wurde. Wie komme an die variable die sich in meinem gesendeten JSON befindet?
Gibt es eine Möglichkeit bei Laufzeit zu debuggen? Gibt es eine Möglichkeit zu sehen ob mein Modul Instanziert wurde? Die Verbindung wird nicht geschlossen. Muss ich das per php tuhen?
Ich würde mich sehr über Codebeispiele aber auch Erklärungen bezüglich der Funktionsweise freuen.
Danke
P.S.: Meine Klasse die IPSModul erbt hat die Methoden Create und ApplyChanges sowie einen standard Konstruktor der den Konstruktor von IPSModule aufruft.
Ich glaube aber das mein Problem ein wenig grundlegender ist. Ich versuche gerade über Postman (Chrome-Erweiterung) ein JSON an meinen Server Socket zu senden. Laut debug kommt der an. Die Verbindung wird nicht geschlossen da keine HTTP Antwort kommt. Ich würde gern diese Daten entgegen nehmen und ich habe auch den Code angeschaut und ausprobiert.
class Test extends IPSModule {
// Der Konstruktor des Moduls
// Überschreibt den Standard Kontruktor von IPS
public function __construct($InstanceID) {
// Diese Zeile nicht löschen
parent::__construct($InstanceID);
}
// Überschreibt die interne IPS_Create($id) Funktion
public function Create() {
// Diese Zeile nicht löschen.
parent::Create();
$this->RegisterPropertyString("ReceiveFilter", ".*Hallo.*");
}
// Überschreibt die intere IPS_ApplyChanges($id) Funktion
public function ApplyChanges() {
// Diese Zeile nicht löschen
parent::ApplyChanges();
//Connect to available splitter or create a new one
$this->ConnectParent("{8062CF2B-600E-41D6-AD4B-1BA66C32D6ED}");
//Apply filter
$this->SetReceiveDataFilter($this->ReadPropertyString("ReceiveFilter"));
}
public function ReceiveData($JSONString)
{
$data = json_decode($JSONString);
//Parse and write values to our buffer
$this->SetBuffer("Test", utf8_decode($data->Buffer));
//Print buffer
IPS_LogMessage("IOTest", $this->GetBuffer("Test"));
}
}
ist der momentane Quellcode der modul.php aber ich bekomme keine Ausgabe im Log.
Wie hier zu sehen ist habe Ich den Code aus dem einen Beispiel verwendet aber es scheint nichts an zu kommen.
P.S.: Ich gehe davon aus, dass „$this->ConnectParent(“{8062CF2B-600E-41D6-AD4B-1BA66C32D6ED}");" sich auf die Verbindung mit dem Server Socket bezieht
Hast du den in IPS eine Instanz erstellst?
Ist Diese mit dem Socket verbunden?
Und du setzt einen Empfangsfilter im Appylchanges. Den würde ich erstmal weglassen.
Und anstatt IPS_Logmessage, Kannst du SendDebug nutzen und findest die Ausgabe dann im Reiter Debug deiner Instanz.
Michael
PS: Und hast du auch die richtigen Interfaces in der module.json hinterlegt?
Habe meinen Fehler gefunden. Das Problem war das Ich die Konfiguration falsch gesetzt hatte. Für den Rest habe Ich mich einfach von den Beispielen leiten lassen.
P.S.: Ich habe zusätzlich mir die Startlogs genauer angeschaut. Dort wird genau vermerkt wenn es Probleme mit dem Laden von Modulen gibt. Des weiteren für die PHP-Fehler ist das Log in der Management Console sehr hilfreich.