2016-05-11 11 views
0

Ich habe sowohl im Internet als auch in der Börse nach einer Erklärung für dieses seltsame Verhalten gesucht, das ich beim Verbinden mit MQTT erlebe. Aber ich konnte keinen ähnlichen Fall finden und ich würde gerne verstehen, woher das Problem kommt.Benötige ich tcp: // in der MQTT Brokeradresse?

Also habe ich einen Mosquitto MQTT Broker auf meinem Raspberry Pi eingerichtet, um Port 1883 zu hören. Ich habe auch Port Forwarding auf meinem Router eingerichtet, damit ich den Pi von außerhalb meines Heimnetzwerks erreichen kann (obwohl ich kann reproduzieren das Verhalten unten mit einem öffentlichen Server wie broker.hivemq.com als auch). Wenn ich die folgende Node.js execute Skript, kann ich an den Broker verbinden und abonnieren und Nachrichten veröffentlichen, es funktioniert perfekt:

const mqtt = require('mqtt') 
const client = mqtt.connect('tcp://my.address.net:1883') 
client.on('connect',() => {  
    console.log('Connected!') 
    client.subscribe("chat") 
}) 

var readline = require('readline'); 
var rl = readline.createInterface({ 
    input: process.stdin, 
    output: process.stdout, 
    terminal: false 
}); 

rl.on('line', function(line){ 
    client.publish('chat',line) 
}) 

client.on('message', (topic, message) => { 
    console.log('>> '+message) 
}) 

Allerdings, wenn ich das tcp:// Protokoll verlassen und haben

const client = mqtt.connect('my.address.net:1883') 

als Host-Adresse bekomme ich keine Verbindung, aber auch keine Fehlermeldung. Das Programm hängt einfach, bis ich es beende. Ich verstehe das nicht. Verwendet MQTT standardmäßig TCP nicht?

Hat das mit meinem Kunden oder mit meinem Broker zu tun? Könnte es etwas mit meinem System (OSX) zu tun haben?

Vielleicht hat dies nichts zu tun, aber ein ähnliches Verhalten, das ich bekomme, wenn ich verwende, um das Paho MQTT Paket in Python, und das ist eigentlich der wichtigere Fall für mich, weil ich hier nicht tun lass es überhaupt laufen. Das ist mein Code:

Mit dieser Version ohne Protokoll, bekomme ich keine Antwort. Das Programm wird eine Sekunde lang ausgeführt und dann beendet. Wenn ich das Protokoll

client.connect("tcp://my.address.net", 1883) 

verwenden erhalte ich die Fehler

socket.gaierror: [Errno 8] nodename nor servname provided, or not known 

Ich weiß nicht, was mir fehlt.

Kann jemand den Unterschied erklären, indem er das Protokoll tcp:// in der Adresse angibt, anstatt es auszulassen?

Antwort

1

Dies ist zwei Fragen.

Für den Python-Teil erwartet der Python-Client Host und Port getrennt als Verbindungsargumente. Es ist kein URI. Also kein TCP //.

Das Python-Programm macht genau das, was Sie fragen - verbinden, dann beenden. Sie müssen unter dem Verbindungsaufruf mehr Code hinzufügen, wenn Sie etwas anderes tun möchten. Was dieser Code ist hängt davon ab, was Sie tun möchten, aber loop_forever() ist ein guter Anfang.

Der andere Client erwartet einen URI. Ich glaube, dass es TCP/SSL verwendet, um zwischen unverschlüsselten und verschlüsselten Verbindungen zu unterscheiden.

+0

Vielen Dank für die Erklärung mit der URI. Der Python-Code hat tatsächlich funktioniert, wie du gesagt hast! Sobald ich den loop_forever() hinzugefügt habe, wurden auch die Nachrichten "connected" und "disconnected" angezeigt, was mich in erster Linie so verwirrt hat. – Nejesis

0

Die 2 Bibliotheken erfordern unterschiedliche Dinge.

Die NodeJS Bibliothek ist für eine fragen, die

  1. ein Schema ("tcp: //") enthält
  2. ein Hostname/IP-Adresse ("localhost")
  3. eine Portnummer (": 1883")

Der Host und der Port können leicht daraus analysiert werden.

Wo, wie die Python-Bibliothek explizit für 2 getrennte Dinge zu fragen ist

  1. der Hostname
  2. der Port

diese als separate Variablen getroffen werden.

Dies ist nur auf verschiedene Autoren Auswahl verschiedener Ansätze zum Sammeln von Informationen.

+0

Danke für deine Antwort, jetzt weiß ich, worum es bei einer URI geht :) – Nejesis