Hallo,
Ich versuche ein kleines Testprogramm für ESP32 zu schreiben in dem über
den IOBroker eine Led geschaltet werden kann.
Beim Compilieren ist ein Fehler aufgetreten (siehe Screenschot).
Ich weis hier nicht weiter, das Programm ist aus einem Video:
https://www.youtube.com/watch?v=9tmRT5n7CjY bei 11 Minuten.
Folgende Fehlermeldung ist gekommen:
/home/fritz/Arduino/esp32_stromzaehler/esp32_stromzaehler.ino: In
function 'void mqttConnected(bool)':
esp32_stromzaehler:15: error: no matching function for call to
'AsyncMqttClient::subscribe(const char [13])'
iot.mqtt.subscribe("examplel/led");
^
In file included from
/home/fritz/Arduino/libraries/async-mqtt-client-master/src/AsyncMqttClie
nt.h:4:0,
from
/home/fritz/Arduino/libraries/Basecamp/Basecamp.hpp:23,
from
/home/fritz/Arduino/esp32_stromzaehler/esp32_stromzaehler.ino:1:
/home/fritz/Arduino/libraries/async-mqtt-client-master/src/AsyncMqttClie
nt.hpp:68:12: note: candidate: uint16_t
AsyncMqttClient::subscribe(const char*, uint8_t)
uint16_t subscribe(const char* topic, uint8_t qos);
^
/home/fritz/Arduino/libraries/async-mqtt-client-master/src/AsyncMqttClie
nt.hpp:68:12: note: candidate expects 2 arguments, 1 provided
Mehrere Bibliotheken wurden für "WiFi.h" gefunden
Benutzt:
/home/fritz/Downloads/arduino-1.8.5/hardware/espressif/esp32/libraries/W
iFi
Nicht benutzt: /home/fritz/Downloads/arduino-1.8.5/libraries/WiFi
exit status 1
no matching function for call to 'AsyncMqttClient::subscribe(const char
[13])'
Weis jemand was ich hier machen muss oder wie ich mit dem Fehler umgehen
muss?
MfG Fritz
Fritz B. schrieb:> Folgende Fehlermeldung
die Du lesen (und verstehen) solltest.
>esp32_stromzaehler:15: error: no matching function for call to>'AsyncMqttClient::subscribe(const char [13])'> iot.mqtt.subscribe("examplel/led");
...
Fritz B. schrieb:> /home/fritz/Arduino/libraries/async-mqtt-client-master/src/AsyncMqttClie> nt.hpp:68:12: note: candidate: uint16_t> AsyncMqttClient::subscribe(const char*, uint8_t)> uint16_t subscribe(const char* topic, uint8_t qos);> ^
...
Fritz B. schrieb:> /home/fritz/Arduino/libraries/async-mqtt-client-master/src/AsyncMqttClie> nt.hpp:68:12: note: candidate expects 2 arguments, 1 provided
Abgesehen davon, dass bei dem Compilerlauf ein Tippfehler drin war, den
Du offensichtlich in deinen Quellen bereits korrigiert hast, sagt der
Compiler dir hier ganz deutlich was falsch ist: es gibt keine
Member-Funktion AsyncMqttClient::subscribe(const char *). Er weist dich
sogar darauf hin, dass es eine ähnliche Funktion
AsyncMqttClient::subscribe(const char *, uint8_t) gibt, die Du meinen
könntest.
Offensichtlich wurde an dem API nach dem Video noch etwas verändert (ein
Parameter qos wurde zusätzlich aufgenommen oder ein Default-Parameter
ist weggefallen). Jetzt musst Du nur noch rausfinden, wozu dieser
Parameter gut sein könnte und wie er in deinem Fall gesetzt sein sollte.
Markus F. schrieb:> wozu dieser> Parameter gut sein könnte
Man könnte wilde Vermutungen anstellen, das 'qos' für 'Quality of
Service' steht und man der Funktion eine Zahl übergeben soll, die die
gewünschte Qualität einstellt.
Matthias S. schrieb:> Man könnte wilde Vermutungen anstellen,
Das könnte man. Man könnte den TO aber auch zum selber Denken (oder
wenigstens Googlen) anregen ;)
Rufus Τ. F. schrieb:> In der aktuellen c't gibt es ab Seite 158 einige Hinweise auf> Übersetzungsprobleme, die bei "basecamp" und Co. auftreten können.
Der angesprochene Fall kommt da nicht vor (zumindest beim kurz
Drüberlesen). Google mit "MQTT+QOS" bringt aber beim ersten Treffer eine
Lösung.
Hallo,
danke an alle die geantwortet haben!
Ich mach das nicht allzu oft mit dem Programmieren und wenn dann solche
Fehler kommen bin ich dann meist erst mal ziemlich Ratlos...
Es war auch tatsächlich nur der qos Wert der gefehlt hat. ich hab da mal
0 reingesetzt und schon ging das kompilieren. Natürlich hab ich mir auch
noch die C'T gekauft... (war aber in diesem Fall ziemlich sinnfrei...)
danke erst mal an alle
MfG Fritz
Fritz B. schrieb:> Es war auch tatsächlich nur der qos Wert der gefehlt hat. ich hab da mal> 0 reingesetzt und schon ging das kompilieren
Hast Du auch rausgefunden, was die 0 bedeutet?
> Ich mach das nicht allzu oft mit dem Programmieren> (qos) ich hab da mal 0 reingesetzt
Warum 0?
Du hast nicht wirklich programmiert, sondern Copy&Paste gemacht.
Programmieren bedeutet, sich zuerst eine Struktur und Ablaufplan zu
erstellen. Tutorials und Beispielprogramme, helfen dabei, geeignete
Objekte und Methoden zu finden. Dazu liest man dann die Anleitungen,
woher die Werte für die Funktions-Argumente kommen sollen bzw. ob und
welche hardcodierten Werte Sinnvoll sind. Wenn Du auch nur einen
einzigen Buchstaben kopierst, ohne seine Bedeutung zu verstehen, sind
ernste Probleme zu erwarten.
Du hast da offensichtlich eine Library ohne verständliche, passende und
vollständige Anleitung verwendet. Das war schon eine grobe
Fehlentscheidung, die ich auch im Beruf mehrfach erlebt habe.
Hallo,
Markus F. schrieb:> Fritz B. schrieb:>> Es war auch tatsächlich nur der qos Wert der gefehlt hat. ich hab da mal>> 0 reingesetzt und schon ging das kompilieren>> Hast Du auch rausgefunden, was die 0 bedeutet?
falls jemand hier nur reinstolpert:
QoS 0 - es wird gesendet ohne irgendeine Kontrolle ob es beim Broker
ankommt („Fire-and-Forget“).
QoS 1 - der Broker quittiert den Empfang
QoS 2 - wie 1, zusätzlich stellt der Broker aber sicher, daß genau diese
Message nur einmal zum Client geschickt wird.
Es ist prinziell möglich, daß der Broker eine Message mehrfach sendet,
weil eine der Quittungen scheinbar nicht durchkam. Wenn das zum Beipsiel
ein Lichtschalter mit Toggle ist, würde das Licht angehen und dann
wieder ausgehen...
Die Entwickler von MQTT haben damals einiges an Gehirnschmalz
investiert.
Man sollte es also schon etwas überlegt einsetzen auch retain und
lastWill sollte man mit etwas Überlegung einsetzen. Es sind sehr
praktische Sachen, die viele eigene Protokollgeschichten ersparen
können, aber auch fpr nette Überraschungen sorgen können.
Gruß aus Berlin
Michael
Stefanus F. schrieb:>> Ich mach das nicht allzu oft mit dem Programmieren>>> (qos) ich hab da mal 0 reingesetzt>> Warum 0?>> Du hast nicht wirklich programmiert, sondern Copy&Paste gemacht.
"It compiles - ship it!"(tm)
Ja wenn man es so sieht hab ich nicht unbedingt programmiert. Ich habe
auch nur ein paar Kenntnisse von Java und halt ein bisschen C. Vieles
von dem was da passiert und was ich im Programm hab verstehe ich nicht.
Aber ich sehe das wie das erlernen in der Kindheit; Deutsch hab ich auch
nicht durch pauken sondern durch überlegen und zuhören erlernt. Gut beim
programmieren ist es sicherlich einfacher wenn man alles versteht, aber
für einen der nur gelegentlich mal was programmieren muss und ansonsten
nichts oder nicht viel mit Elektronik zu tun hat ist copy und paste eine
buchbare Methode. Für die Probleme doie dann auftreten können sind diese
Foren eine sehr gute Hilfe und ich muss sagen aus Fehlern hab ich in
meinem Leben noch am meisten gelernt.
MfG Fritz