Forum: Mikrocontroller und Digitale Elektronik Arduino Programm wird nicht compiliert. Bootcamp.hpp aus C't


von Fritz B. (kleinfritzchen)


Angehängte Dateien:

Lesenswert?

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.
1
#include <Basecamp.hpp>
2
3
Basecamp iot;
4
#define LED_pin 16
5
6
void setup() {
7
  // put your setup code here, to run once:
8
  iot.begin();
9
  pinMode(LED_pin, OUTPUT);
10
  Serial.begin(115200);
11
  iot.mqtt.onConnect(mqttConnected);
12
  iot.mqtt.onMessage(mqttMessage);
13
}
14
void mqttConnected(bool sessionPresent) {
15
  iot.mqtt.subscribe("example1/led");
16
}
17
18
void mqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len,
19
                 size_t index, size_t total) {
20
  payload[len] = '\0';
21
  String strTopic = String(topic);
22
  String strPayload = String((char * ) payload);
23
24
  if (strTopic == "example1/led") {
25
    if (strPayload == "off" || strPayload == "0" || strPayload == "false") digitalWrite(LED_pin, LOW);
26
    if (strPayload == "on" || strPayload == "1" || strPayload == "true") digitalWrite(LED_pin, HIGH);
27
  }
28
}
29
30
void loop() {
31
  // put your main code here, to run repeatedly:
32
33
}

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

: Verschoben durch User
von Dr. Sommer (Gast)


Lesenswert?

Den 2. Parameter "qos" an die Funktion "subscribe" übergeben. Warum 
umgehen und nicht lösen?

von inMV (Gast)


Lesenswert?

Hast einen Schreibfehler: examplel/led ist nicht example1/led...

von Markus F. (mfro)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Markus F. (mfro)


Lesenswert?

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 ;)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

In der aktuellen c't gibt es ab Seite 158 einige Hinweise auf 
Übersetzungsprobleme, die bei "basecamp" und Co. auftreten können.

von Markus F. (mfro)


Lesenswert?

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.

von Fritz B. (kleinfritzchen)


Lesenswert?

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

von Markus F. (mfro)


Lesenswert?

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?

von Stefan F. (Gast)


Lesenswert?

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

von Michael U. (amiga)


Lesenswert?

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

von Nop (Gast)


Lesenswert?

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)

von Fritz B. (kleinfritzchen)


Lesenswert?

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

von Markus F. (mfro)


Lesenswert?

Fritz B. schrieb:
> Ja wenn man es so sieht hab ich nicht unbedingt programmiert.

Was Fritzchen nicht lernt, lernt Fritz nimmermehr.

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.