Hallo, ich brauche etwas Unterstützung,
Ich bin auf Home-Assistant zur Haussteuerung gestoßen und versuche,
meine Sensor/Actor Module dort einzubinden. HASSIO sowie den MQTT-Broker
(Mosqitto) habe ich in VMWARE (Host: win 7) zum laufen gebracht.
Meine Sensor/Actor Systeme basieren auf Arduino-Controllerplatinen, die
ich mittels ATMEL Studio in Ansi-C programmiere. C++ verwende ich nicht,
da ich davon und allgemein von der OOP keine bzw. nicht viel Ahnung
habe.
Um mal schnell etwas zum Spielen zu bekommen habe ich ein ESB8266-Modul
unter Verwendung der Arduino-Plattform und der PubSubClient-Library mit
"Q&D Programmiermethode" testweise zum Spielen gebracht. Leider ist
diese Lib nur unter C++ verwendbar und nicht unter ANSI-C. Einen
Versuch, sie nach ANSI-C zu portieren habe ich gleich abgebrochen, die
Lib ist riesengroß.
Nach weiterer längerer Web-Suche stieß ich auf die MQTT-C Lib von Liam
Bindle bei GITHUB, aber leider sind keine brauchbaren Anwendungs-Dokus
oder gar brauchbare Beispiele zu finden. Es gelingt mir bis dato nicht,
mein System mit dem MQTT Broker zu verbinden oder gar Daten hoch zu
senden.
Wäre supertoll, falls hier jemand Ahnung von dieser Library hätte und
ggf. Beispiele / Links nennen könnte. Vielleicht gibt es auch eine
besser dokumentierte ANSI-C Library?
Danke in Voraus!
Yogy
jemand schrieb:> https://mqtt.org/software/> Eine davon vielleicht?
Über diese Seite bin ich ja zu meinem MQTT-C von Liam Bindle gekommen.
Diese Lib ist relativ "schmal" aber wohl für mich zu komplex im einsatz.
Ich werde mir wohl hier eine andere Lib aussuchen müssen.
VG Yogy
Vielleicht solltest du dich mal beschäftigen wie die ESP Firmware
aufgebaut ist.
Es gibt ein SDK, das beinhaltet FreeRTOS, LwIP und Treiber für WLAN und
BT.
Und einiges an Libraries.
https://github.com/espressif/ESP8266_RTOS_SDK
Das ist alles in C geschrieben.
Darauf aufbauend gibt es das Arduino Core, dass einen ermöglich Arduino
Sketche für den ESP zu erstellen.
Verwenden viele muss man aber nicht.
Es gibt hier auch eine MQTT Lib die direkt auf dem SDK aufbaut und kein
Arduino Core braucht.
https://github.com/espressif/esp-mqtt
Die ist in C geschrieben.
Hallo zusammen,
ich habe mir die anderen Libs angeschaut und eigentlich keine einzige
gefunden habe, die auf meinem System, das ohne weitere Firmware oder
Betriebssystem arbeitet, ohnen weiteres ohne größerer Arbeiten
einsetzbar wäre. Ich habe mich dann weiter mit der Liam Bindle MQTT-C
Lib beschäftigt und diese nun fast zu Spielen gebracht. Publish funzt.
Ursache der Probleme war/ist das Zusammenspiel mit „meinen“ anderen
SW-Routinen sowie meiner relativen Unkenntnis der Pointersystematic bei
C.
Schlußendlich scheitere ich an folgendem Problem:
Ich nutze auch die Client-Subscriber Funktion. Kommt eine Antwort vom
Broker, dann ruft die MQTT-C -Lib die empfangenen Daten ab mit dem
Funktionsaufruf:
So weit. So gut. Die Implementierung der Funktion ist meine Aufgabe, sie
muß dazu „meine“ Routine (socket-read aus der W5500 Lib) aufrufen.
Nun scheitere ich daran, meine gelesenen Daten an den „buf“ zu
übergeben.
Meine Routine derzeit:
Pointerarithmetik benötigt eine definierte Größe des Datentyps auf den
gezeigt wird, und void hat keine definierte Größe.
Statt der for-Schleife würde ich memcpy(buf,recv_buff,rv); return rv;
benutzen.
Rätselhaft bleibt warum *(U8*)buf++ = recv_buff[i]; nicht auch Fehler
generiert, *(U8*)buf++ wird ja als *(U8*)(buf++) ausgewertet und buf++
ist wiederum verbotene void*-Arithmetik ...
LG, Sebastian
Sebastian W. schrieb:> Rätselhaft bleibt warum *(U8*)buf++ = recv_buff[i]; nicht auch Fehler> generiert, *(U8*)buf++ wird ja als *(U8*)(buf++) ausgewertet und buf++> ist wiederum verbotene void*-Arithmetik ...
Pointer-Arithmetik auf void Pointern ist eine gcc Erweiterung.
Sebastian W. schrieb:> Pointerarithmetik benötigt eine definierte Größe des Datentyps auf den> gezeigt wird, und void hat keine definierte Größe.>> Statt der for-Schleife würde ich memcpy(buf,recv_buff,rv); return rv;> benutzen.>> Rätselhaft bleibt warum *(U8*)buf++ = recv_buff[i]; nicht auch Fehler> generiert, *(U8*)buf++ wird ja als *(U8*)(buf++) ausgewertet und buf++> ist wiederum verbotene void*-Arithmetik ...>> LG, Sebastian
Ja, danke, mit memcopy funktioniert es. Nur, warum es nicht mit der
for-Schleife funktioniert ist mir immer noch schleierhaft.
Übrigens kann ich nach memcopy den inhalt von buf korect auslesen mit:
1
for(U8i=0;i<rv;i++)
2
{
3
PutcService(*(U8*)(buf+i));
4
}
(PutcService gibt bei mir ein Zeichen seriell aus)
Auf jeden Fall danke für den Tip.
Viele Grüße, Yogy
Hanns-Jürgen M. schrieb:> Nur, warum es nicht mit der> for-Schleife funktioniert ist mir immer noch schleierhaft.
1
*(U8*)buf++
entspricht
1
*(U8*)(buf++)
und das ist void-Pointer-Arithmetik. Besser vermeiden.
1
*buf++
ist void-Pointer-Arithmetik und dazu noch
void-Pointer-Dereferenzierung. Das ist in jedem Fall ein Fehler.
1
buf[i]
ist auch void-Pointer-Arithmetik und dazu noch
void-Pointer-Dereferenzierung. Das ist auch in jedem Fall ein Fehler.
1
(U8)buf[i]
ist dasselbe, und dann castest du void noch in U8. Ich glaube das geht
nicht, man kann nur void-Pointer in andere Pointer casten, aber nicht
void selbst. Ausserdem, selbst wenn das ginge, ist das Resultat nach dem
cast ein Wert und kein lvalue.
Bei
1
(U8*)buf[i]
castest du void in einen U8-Pointer. Das ist noch falscher.
Funktionieren müssten eigentlich
Das Spiel funktioniert anderes herum... Du prüfst das Emfangsregister
und übergibst dann die Daten an den MQTT Teil.
Die Tücke beim w5500 ist das beim auslesen auch weitere Pakete im Buffer
liegen können.
Den Code verstehe ich nicht, da fehlen mir die Zusammenhänge.
Es sei denn deine Library benutz Funktionspointer für den Ethernet
Stack. Dann musst du dafür sorgen das die Daten so übergeben werden.
Eine eigene Frage?
Dieser Thread ist über 5 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.