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


von Rainer U. (r-u)


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
1
mosquitto_pub -h localhost -t test -m "bin allhier"
schreiben, und in einem anderen Fenster, wo ich das topic subscribed 
habe mit
1
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:
1
#include <ESP8266WiFi.h>
2
#include <PubSubClient.h>
3
 
4
const char* ssid = "meine_ssid"; // Enter your WiFi name
5
const char* password =  "mein_passwort"; // Enter WiFi password
6
const char* mqttServer = "192.168.178.114";
7
const int mqttPort = 1883;
8
const char* mqttUser = "";
9
const char* mqttPassword = "";
10
 
11
WiFiClient espClient;
12
PubSubClient client(espClient);
13
 
14
void setup() {
15
 
16
  Serial.begin(115200);
17
 
18
  WiFi.begin(ssid, password);
19
  while (WiFi.status() != WL_CONNECTED) {
20
    delay(500);
21
    Serial.println("Connecting to WiFi..");
22
  }
23
  Serial.println("Connected to the WiFi network");
24
  Serial.println('\n');
25
  Serial.print("IP address:\t");
26
  Serial.println(WiFi.localIP()); 
27
 
28
  client.setServer(mqttServer, mqttPort);
29
  client.setCallback(callback);
30
 
31
  while (!client.connected()) {
32
    Serial.println("Connecting to MQTT...");
33
 
34
    if (client.connect("ESP8266Client", mqttUser, mqttPassword )) {
35
 
36
      Serial.println("connected");  
37
 
38
    } else {
39
 
40
      Serial.print("failed with state ");
41
      Serial.print(client.state());
42
      delay(2000);
43
 
44
    }
45
  }
46
...

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

von kast (Gast)


Lesenswert?

if (client.connect("ESP8266Client")

von Rainer U. (r-u)


Lesenswert?

kast schrieb:
> if (client.connect("ESP8266Client")

Hatte ich auch schon probiert, hilft nicht, gleiches Ergebnis:
1
Connecting to WiFi..
2
Connected to the WiFi network
3
4
5
IP address:  192.168.178.49
6
Connecting to MQTT...
7
failed with state -2Connecting to MQTT...
8
failed with state -2Connecting to MQTT...
9
failed with state -2Connecting to MQTT...
10
failed with state -2Connecting to MQTT...

Kann das jemand nachvollziehen?

von Klaus (Gast)


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)


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)


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)


Lesenswert?

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

von Rainer U. (r-u)


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)


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)


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)


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)


Lesenswert?

Freut mich.

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.