Forum: Compiler & IDEs Arduino mit ESP8266 und MQTT - Netzwerkfehler warum?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Rainer U. (r-u)


Bewertung
0 lesenswert
nicht lesenswert
Liebe alle,

ich habe gerade einen ESP8266 D1 mini zum Basteln hier, und auf einem 
Laptop habe ich mosquitto installiert. Mosquitto selbst funktioniert auf 
dem Laptop und benötigt keine Authentifizierung, also ich kann in einem 
Fenster
mosquitto_pub -h localhost -t test -m "bin allhier"
schreiben, und in einem anderen Fenster, wo ich das topic subscribed 
habe mit
mosquitto_sub -h localhost -t test
Kommt dieser Text auch an.

Nun möchte ich mich gerne vom ESP8266 im gleichen Netzwerk aus an diesem 
Mosquitto verbinden, aber das gelingt nicht (Fehler -2). Warum nicht / 
hat jemand Ideen? Firewall ist aus, die WiFi-Verbindung funktioniert 
sofort.. wenn ich mosquitto -v auf dem Laptop laufen lasse, kommt nichts 
an.  Testprogramm:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
 
const char* ssid = "meine_ssid"; // Enter your WiFi name
const char* password =  "mein_passwort"; // Enter WiFi password
const char* mqttServer = "192.168.178.114";
const int mqttPort = 1883;
const char* mqttUser = "";
const char* mqttPassword = "";
 
WiFiClient espClient;
PubSubClient client(espClient);
 
void setup() {
 
  Serial.begin(115200);
 
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting to WiFi..");
  }
  Serial.println("Connected to the WiFi network");
  Serial.println('\n');
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP()); 
 
  client.setServer(mqttServer, mqttPort);
  client.setCallback(callback);
 
  while (!client.connected()) {
    Serial.println("Connecting to MQTT...");
 
    if (client.connect("ESP8266Client", mqttUser, mqttPassword )) {
 
      Serial.println("connected");  
 
    } else {
 
      Serial.print("failed with state ");
      Serial.print(client.state());
      delay(2000);
 
    }
  }
...

Hab ich das mit dem Mosquitto client und -Broker falsch verstanden?

von kast (Gast)


Bewertung
0 lesenswert
nicht lesenswert
if (client.connect("ESP8266Client")

von Rainer U. (r-u)


Bewertung
0 lesenswert
nicht lesenswert
kast schrieb:
> if (client.connect("ESP8266Client")

Hatte ich auch schon probiert, hilft nicht, gleiches Ergebnis:
Connecting to WiFi..
Connected to the WiFi network


IP address:  192.168.178.49
Connecting to MQTT...
failed with state -2Connecting to MQTT...
failed with state -2Connecting to MQTT...
failed with state -2Connecting to MQTT...
failed with state -2Connecting to MQTT...

Kann das jemand nachvollziehen?

von Klaus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Rainer U. schrieb:
> mosquitto_sub -h localhost

Ich vermute es liegt an localhost.
Gib mal am Notebook die IP des Servers an.

von Rainer U. (r-u)


Bewertung
0 lesenswert
nicht lesenswert
Klaus schrieb:
> Gib mal am Notebook die IP des Servers an.

Auf dem Laptop funktioniert es ja.. Welchen Server meinst Du?

von Klaus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Localhost lässt nur Verbindungen innerhalb des Computers zu.
Daher können 2 Prozesse auf deinem Notebook miteinander kommunizieren.
Localhost ist normalerweise so konfiguriert dass die IP4 Adresse 
127.0.0.1 genutzt wird.
Die ist nur intern in deinem Computer sichtbar.

Du must beim Mosquitto Aufruf eine von außen zugreifbare IP Adresse 
angeben.

von Klaus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Prüf mal in der mosquitto.conf die Parameter
* bind_address address
* bind_interface device

von Rainer U. (r-u)


Bewertung
0 lesenswert
nicht lesenswert
Klaus schrieb:
> Du must beim Mosquitto Aufruf eine von außen zugreifbare IP Adresse
> angeben

Ah ok, jetzt habe ich verstanden, was Du meinst. Das werde ich 
probieren.

von Joachim S. (oyo)


Bewertung
0 lesenswert
nicht lesenswert
Probier doch mal, ob der Fehler mglw. damit zusammen hängt:
https://github.com/knolleary/pubsubclient/issues/138#issuecomment-326113915
(Kurz zusammengefasst: Vor "WiFi.begin()" noch ein 
"WiFi.mode(WIFI_STA);" einfügen.)

Wenn Du eh Arduino verwendest, würde ich an Deiner Stelle übrigens erst 
einmal kurz einen der PubSubClient-Beispiel-Sketche verwenden, und 
lediglich die entsprechenden Parameter (WiFi-Passwort, IP-Adresse des 
Brokers etc.) ändern. Bei diesen mitgelieferten Sketchen weisst Du, dass 
sie funktionieren sollten, und kannst so schnell eingrenzen, ob das 
Problem nun an Deinem Code oder am MQTT-Broker liegt.

von Klaus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Alternativ nutz mal testweise einen anderen Client:
anderer PC oder Smartphone mit MQTT Client App.
Dann kannst Du den Fehler besser einkreisen.

von Rainer U. (r-u)


Bewertung
0 lesenswert
nicht lesenswert
Klaus schrieb:
> bind_address address

Treffer!

bind_address <die_IP_vom_Laptop>

hat ausgereicht. Ist etwas seltsam, weil in der Muster- mosquitto.conf 
drinsteht, dass er ohne diesen Eintrag auf alle interfaces hört, naja.

Aber jetzt geht alles. Danke!

von Klaus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Freut mich.

Der Kommentar hat mich auch gewundert. Vielleicht wurde das Verhalten 
aus Security gründen geändert und die Doku nicht nachgezogen...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.