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?
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