ESP 8266 /MQTT und Textfilter

Hallo zusammen,
ich bin blutiger Anfänger und versuche mich gerad in ein Projekt zu stürzen und hoffe mal ich hab mich für den Anfang nicht übernommen. Leider habe ich mit goolge oder in dem Forum nicht die Lösung gefunden (oder ich habe sie überlesen… Dann Sorry…:wink:

Zu meinem Problem:

Ich möchte über ein MQTT broker Informationen lesen. Diese habe ich auch schon auf dem ESP im Serial Monitor gesehen. Heißt die Verbindung klappt und es werden Texte Empfangen. Das hat mich auch überrascht dass ich das hinbekommen hab :slight_smile: .

Nun würde ich gerne aus dem Text gewirr ein paar Zeilen Filtern:

Hintergrund ist der: ich möchte aus einer Modellbahn software (Rocrail) eine Blockbelegung auf einem LCD oder Oled anzeigen lassen. Also z.b. wenn der Block reserviert wird soll im Display stehen um welche Lok es sich handelt.

Der ESP gibt mir im Text bereits folgendes aus:

rocrail/service/info<bk id="Block 4" masterid="" reserved="true" locid="Taurus" fifoids="" acceptident="false" platform="" embeddedfbplus="false" embeddedfbmin="false"/>

Nun wäre die 1 Mio € Frage die ich nicht beantworten kann: Wie bekomme ich das hin, dass ich dem ESP sage er soll nach dem "Block 4 " (also die “bk id”) suchen und dort die variable “locid” im Display anzeigen wenn der Block reserviert ist. :confused:

Kann mir da jemand helfen?

Gruß aus Köln!

Simon

Ich würde es mit strstr auf einem char-Array machen, Du evtl. mit String.find(...) und substr(...). Einfach mal die Referenzen lesen.

Gruß Tommy

Auf einem ESP32 probiert:

void setup() {
  Serial.begin(115200);
  delay(2000);
  Serial.println("\nAnfang");
  getData();
}

void getData() {
  char rcv[] = "rocrail/service/info<bk id=\"Block 4\" masterid=\"\" reserved=\"true\" locid=\"Taurus\" fifoids=\"\" acceptident=\"false\" platform=\"\" embeddedfbplus=\"false\" embeddedfbmin=\"false\"/>";
  Serial.println(rcv);
  char * pid;
  pid = strstr(rcv, "Block ") + strlen("Block ");
  int block = atoi(pid);

  Serial.println(pid);
  Serial.println(block);
}

void loop() {}

Lesestoff: strstr

Eventuell lohnt sich eine kleine Funktion, die sowas erledigt.

Müssen sich Tommy und agmue jetzt die Million teilen oder bekommt jeder eine??

Gruß

Scherheinz:
Müssen sich Tommy und agmue jetzt die Million teilen oder bekommt jeder eine??

Wikinger sind nicht fürs Teilen bekannt, da bleibt wohl nichts für mich übrig ;D

Er teil aber auch so viel Wissen hier wie kein Wikinger vor ihm, denke du würdest was bekommen... :wink:

Wow danke für die Tipps:) das teste ich doch gleich Mal. Also da war wohl ein Tippfehler: meinte die Melonen Frage.... :slight_smile: :slight_smile: besten dank euch!

Sooo nachdem ich den Code von “agmue” getestet habe (Danke dafür!!) offenbart sich ein neues Problem;-)
Der ESP scheint die ganzen alten Befehle vom server auszuwerten. Daher bekomme ich immer wieder die Ausgabe obwohl die sich geändert hat…:

Anfang
rocrail/service/info<bk id="Block 4" masterid="" 
reserved="true" locid="Taurus" fifoids="" acceptident="false" 
platform="" embeddedfbplus="false" embeddedfbmin="false"/>
4" 
masterid="" reserved="true" locid="Taurus" fifoids="" 
acceptident="false" platform="" embeddedfbplus="false" 
embeddedfbmin="false"/>
4

Anfang
rocrail/service/info<bk
 id="Block 4" masterid="" reserved="true" locid="Taurus" fifoids="" 
acceptident="false" platform="" embeddedfbplus="false" 
embeddedfbmin="false"/>
4" masterid="" reserved="true" 
locid="Taurus" fifoids="" acceptident="false" platform="" 
embeddedfbplus="false" embeddedfbmin="false"/>
4

Anfang
rocrail/service/info<bk
 id="Block 4" masterid="" reserved="true" locid="Taurus" fifoids="" 
acceptident="false" platform="" embeddedfbplus="false" 
embeddedfbmin="false"/>
4" masterid="" reserved="true" 
locid="Taurus" fifoids="" acceptident="false" platform="" 
embeddedfbplus="false" embeddedfbmin="false"/>
4

Anfang
rocrail/service/info<bk
 id="Block 4" masterid="" reserved="true" locid="Taurus" fifoids="" 
acceptident="false" platform="" embeddedfbplus="false" 
embeddedfbmin="false"/>
4" masterid="" reserved="true" 
locid="Taurus" fifoids="" acceptident="false" platform="" 
embeddedfbplus="false" embeddedfbmin="false"/>
4

Habe da mal ein delay eingabaut um das zu sehen. Der Server senet wohl immer wieder die selben sachen oft hintereinander… Leider kann ich in der Software keinen eindeutigen Befehl senden. Daher muss ich das leider so machen…

Hat da noch jemand ne Idee bzw ne quelle wo ich das finden kann? Bin auf jeden fall Lernwilig;-)


derfreek:
(Danke dafür!!)

Bitte gerne!

derfreek:
Hat da noch jemand ne Idee bzw ne quelle wo ich das finden kann?

Leider verstehe ich Deine Frage nicht :confused:

Ich kann das leider nicht so genau ausdrücken: Wenn ich die Suche so nutze, dann findet der immer wieder den Block auch wenn das nicht mehr zutrifft. Das Problem könnte sein, dass der ESP "alte" code Zeilen findet. Die aktuellen werden ignoriert bzw. es wird nicht aktuellisiert... (kann man das verstehen?:wink:
Heist der MQTT Server überschreibt die Codes nicht sondern lässt die dastehen. Leider kann ich aber auch keinen anderen MQTT pfad wählen...