mikrocontroller.net

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


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.
Autor: Fritz B. (kleinfritzchen)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
Youtube-Video "IoT-Projekte mit Basecamp und dem ESP32 – Pi and More 10½ - Uni Stuttgart - 24. Februar 2018" bei 11 Minuten.
#include <Basecamp.hpp>

Basecamp iot;
#define LED_pin 16

void setup() {
  // put your setup code here, to run once:
  iot.begin();
  pinMode(LED_pin, OUTPUT);
  Serial.begin(115200);
  iot.mqtt.onConnect(mqttConnected);
  iot.mqtt.onMessage(mqttMessage);
}
void mqttConnected(bool sessionPresent) {
  iot.mqtt.subscribe("example1/led");
}

void mqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len,
                 size_t index, size_t total) {
  payload[len] = '\0';
  String strTopic = String(topic);
  String strPayload = String((char * ) payload);

  if (strTopic == "example1/led") {
    if (strPayload == "off" || strPayload == "0" || strPayload == "false") digitalWrite(LED_pin, LOW);
    if (strPayload == "on" || strPayload == "1" || strPayload == "true") digitalWrite(LED_pin, HIGH);
  }
}

void loop() {
  // put your main code here, to run repeatedly:

}

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 Moderator
Autor: Dr. Sommer (Gast)
Datum:

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

Autor: inMV (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast einen Schreibfehler: examplel/led ist nicht example1/led...

Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias S. (Firma: matzetronics) (mschoeldgen)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fritz B. (kleinfritzchen)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefanus F. (Firma: Äppel) (stefanus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nop (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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)

Autor: Fritz B. (kleinfritzchen)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus F. (mfro)
Datum:

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

Was Fritzchen nicht lernt, lernt Fritz nimmermehr.

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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