NEWS
tcp-request-node für UPnP-Client-Implementierung?
-
Hallo,
ich möchte im node-red eine Abonnementanfrage an eine Set-Top-Box stellen und dann Benachrichtigungen empfangen.
In Javascript funktioniert das mit net.socket gut. Die Abonnementanfrage hat die Struktur:
SUBSCRIBE /MediaRenderer/AVTransport/Event HTTP/1.1\r\n" HOST: 192.168.165.106:1400\r\n CALLBACK: <http://192.168.165.90:1234>\r\n NT: upnp:event\r\n TIMEOUT: Second-3600\r\n \r\n
Im node-red könnte ich eine tcp-Node verwenden? Komme da einfach nicht weiter.
-
Ich muss meine Frage mal noch etwas ausführlicher erläutern.
Die Abonnementanfrage funktioniert in Javascript wie folgt:
const net = require('net'); const msg = "SUBSCRIBE /MediaRenderer/AVTransport/Event HTTP/1.1\r\nHOST: 192.168.165.106:1400\r\nCALLBACK: <http://192.168.165.90:1234>\r\nNT: upnp:event\r\nTIMEOUT: Second-3600\r\n\r\n" const client = new net.Socket() client.connect(1400, '192.168.165.106', function() { client.write(msg) console.log('write: ' + msg); }) client.on('data', function(data) { console.log('received: ' + data); client.destroy(); }) client.on('close', function() { console.log('connection closed'); });
- Es wird eine Verbindung zum Server aufgebaut.
- Über net.Socket.write wird die subscribe-Message versandt.
- Ich erhalte ein 200-ok zurück und die Verbindung wird getrennt.
Jetzt sendet der Server seine Events auf den Port (1234). Auf diesem Port kann ich lauschen und die Nachrichten empfangen. Das Lauschen funktioniert auch in node red mit einer tcp-in-node.
Ich bekomme es aber nicht hin, die net.Socket.write-Funktionalität in node red nachzustellen. Habe es wie folgt versucht:
Ich schicke meine Message als payload an die tcp-request-node. Dann bekomme ich aber ein 400 Bad Request zurück
Habe es versucht als string zu senden und als buffer ... finde einfach keine Lösung, warum das in node red nicht funktionieren soll.Vielleicht hat jemand eine Idee?
-
https://www.google.com/search?q=node+red+upnp
für upnp gibt es schon nodes.
haben die die notwendige funktionalität nicht?oder du verwendest einen tcp listener?
https://flows.nodered.org/node/node-red-contrib-tcp-client -
Die habe ich auch schon gesehen. Die eine node ist wohl für die Steuerung eines iRobot und die zweite sendet nur Kommandos an ein Gerät.
Ich möchte Events abonnieren. Im JS funktioniert das ja auch alles wunderbar. Ich hätte's nur gern im node red und ich stehe auf dem Schlauch, warum es da nicht funktioniert?!
-
Binde die Bibliothek mit der es funktioniert doch einfach in eine function Node. Websocket Node wirst du schon probiert haben?
-
Da muss ich doch an die settings.js ran - oder? Das wollte ich vermeiden.
-
@goesebrecht Nein musst du nicht. Du kannst in der function node jede beliebige Bibliothek einbinden, die wird automatisch geladen.
Dafür habe ich den Thread erstellt
https://forum.iobroker.net/topic/53446/ext-nodejs-module-in-node-red-on-the-fly-nutzen-ab-v-3-0 -
Danke, das funktioniert. Trotzdem schade, dass es nicht über die tcp-nodes funktioniert. ... Du bist doch der Anti-function-nodes-Verfechter ...
-
@goesebrecht sagte in tcp-request-node für UPnP-Client-Implementierung?:
Danke, das funktioniert. Trotzdem schade, dass es nicht über die tcp-nodes funktioniert. ... Du bist doch der Anti-function-nodes-Verfechter ...
Das bin ich auch - und ich kenn mich zuwenig in diesen Netzwerkdingen aus, aber um externe Module nutzen zu können oder auch asynchrone Verarbeitung oder wenn es keine passenden Nodes gibt, dann sind doch function Nodes gut. Ich finde function nodes nur überflüssig, wenn man payloads verändern will etc. - Auch haben function Nodes den Vorteil von eigenem Kontext. Also ich bin nicht grundsätzlich dagegen - aber function nodes sind trotzdem ein mächtiges Mittel, wenn man mit den verfügbaren Nodes nicht auskommt.
Wahrscheinlich müsste man sich nur mal den Quellcode der Bibliothek anschauen, um zu sehen, wie der Handshake aussehen muss.