myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Netzwerktechnologien » MQTT Subscriber: wie gehe ich vor, wenn ich mehrere Topics abonnieren will?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

MQTT Subscriber: wie gehe ich vor, wenn ich mehrere Topics abonnieren will?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
scoobidoobi scoobidoobi ist männlich
myCSharp.de-Mitglied

Dabei seit: 07.08.2019
Beiträge: 7
Entwicklungsumgebung: C#
Herkunft: München


scoobidoobi ist offline

MQTT Subscriber: wie gehe ich vor, wenn ich mehrere Topics abonnieren will?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo zusammen,

ich bin noch relativ neu auf dem MQTT Gebiet und hätte da ein paar Fragen.

Ich habe einen MQTT Subscriber in WinForm geschrieben und es funktioniert soweit ganz gut. Aber eines verstehe ich noch nicht ganz: wie gehe ich vor, wenn ich mehrere Topics abbonieren will?
Z.B: Topic2 soll in Textbox3 geschrieben werden.
ich habe schon einiges probiert aber alles ohne Erfolg.
Hat zufällig jemand eine Idee?

Hier mein bisheriger Ansatz

C#-Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;


namespace MQTT_002
{
    public partial class Form1 : Form
    {
        MqttClient client;

        string clientId;


        public Form1()
        {
            InitializeComponent();

            string BrokerAddress = "10.14.9.114";

            client = new MqttClient(BrokerAddress);

            client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;

            clientId = Guid.NewGuid().ToString();

            client.Connect(clientId);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string Topic = "WO3/KmSollE1";
            string Topic2 = "WO3/KmSollE2";

            // in Textbox schreiben
            client.Subscribe(new string[] { Topic }, new byte[] { 0 });
            textBox2.Text = "";

        }

        private void button1_Click(object sender, EventArgs e)
        {
            client.Disconnect();
        }

        private void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
        {
            string ReceivedMessage = Encoding.UTF8.GetString(e.Message);

            {

                textBox2.Invoke((MethodInvoker)delegate
                {
                    textBox2.Text = ReceivedMessage;
                });
            }
        }
    }

}

Wäre für jeden Vorschlag sehr dankbar!
07.08.2019 14:02 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
pinki
myCSharp.de-Mitglied

avatar-4072.jpg


Dabei seit: 24.08.2008
Beiträge: 675
Herkunft: OWL


pinki ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo und willkommen scoobidoobi,

bei der Behandlung der empfangenen Nachricht kannst du das Topic auslesen und anhand dessen die TextBox zum Hineinschreiben der Nachricht wählen.
07.08.2019 14:33 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
scoobidoobi scoobidoobi ist männlich
myCSharp.de-Mitglied

Dabei seit: 07.08.2019
Beiträge: 7
Entwicklungsumgebung: C#
Herkunft: München

Themenstarter Thema begonnen von scoobidoobi

scoobidoobi ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo pinki,

danke für die schnelle Antwort. Ich abe mich leider etwas zu undeutlich ausgedrückt. Ich meinte
Topic = "WO3/KmSollE1" -> Ihnalt der Nachricht steht in TextBox2 (z.B: 1234). Wie bekomme ich das hin den Inhalt von Topic2 = "WO3/KmSollE2" in TextBox3 zu schreiben?
07.08.2019 14:42 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
pinki
myCSharp.de-Mitglied

avatar-4072.jpg


Dabei seit: 24.08.2008
Beiträge: 675
Herkunft: OWL


pinki ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Du schaust, wenn eine neue Nachricht empfangen wurde, an welches Topic diese gesendet wurde.
Ist das Topic "WO3/KmSollE1", dann schreibst du den Inhalt in textBox2, ist das Topic "WO3/KmSollE2", dann schreibst du es in textBox3.

Das Topic gibt's als eigene Eigenschaft in den  Ereignisargumenten.
07.08.2019 14:48 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
scoobidoobi scoobidoobi ist männlich
myCSharp.de-Mitglied

Dabei seit: 07.08.2019
Beiträge: 7
Entwicklungsumgebung: C#
Herkunft: München

Themenstarter Thema begonnen von scoobidoobi

scoobidoobi ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ja das Verstehe ich. Aber wenn ich das so versuche dann steht erst der wert von Topic für 0,2sec in beiden Textboxen und dann sofort der Wert von Topic2.
Was mache ich da falsch?
hast Du vielleicht mal einen Ansatz wie ich vorgehen müsste?
07.08.2019 15:13 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
pinki
myCSharp.de-Mitglied

avatar-4072.jpg


Dabei seit: 24.08.2008
Beiträge: 675
Herkunft: OWL


pinki ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wie hast du es denn bisher versucht?
07.08.2019 16:34 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
scoobidoobi scoobidoobi ist männlich
myCSharp.de-Mitglied

Dabei seit: 07.08.2019
Beiträge: 7
Entwicklungsumgebung: C#
Herkunft: München

Themenstarter Thema begonnen von scoobidoobi

scoobidoobi ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich stelle es morgen rein, da ich jetzt der Rechner nicht dabei habe.
07.08.2019 17:03 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
scoobidoobi scoobidoobi ist männlich
myCSharp.de-Mitglied

Dabei seit: 07.08.2019
Beiträge: 7
Entwicklungsumgebung: C#
Herkunft: München

Themenstarter Thema begonnen von scoobidoobi

scoobidoobi ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

hier ist mein letzter Versuch.

C#-Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;


namespace MQTT_002
{
    public partial class Form1 : Form
    {
        MqttClient client;

        string clientId;


        public Form1()
        {
            InitializeComponent();

            string BrokerAddress = "10.14.9.114";

            client = new MqttClient(BrokerAddress);

            client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;

            clientId = Guid.NewGuid().ToString();

            client.Connect(clientId);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string Topic = "WO3/KmSollE1";
            string Topic2 = "WO3/KmSollE2";

            // in Textbox schreiben
            client.Subscribe(new string[] { Topic, Topic2 }, new byte[] { 2, 2 });
            textBox2.Text = "";
            textBox3.Text = "";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            client.Disconnect();
        }

        private void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
        {
            string ReceivedMessage = Encoding.UTF8.GetString(e.Message);

            {
                textBox2.Invoke((MethodInvoker)delegate
                {
                    textBox2.Text = ReceivedMessage;
                });
            }

            string ReceivedMessage2 = Encoding.UTF8.GetString(e.Message);

            {
                textBox3.Invoke((MethodInvoker)delegate
                {
                    textBox3.Text = ReceivedMessage2;
                });
            }

        }
    }

}
08.08.2019 06:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
pinki
myCSharp.de-Mitglied

avatar-4072.jpg


Dabei seit: 24.08.2008
Beiträge: 675
Herkunft: OWL


pinki ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo scoobidoobi,

du schreibst die empfangene Nachricht jedes Mal in beide TextBoxen.

client_MqttMsgPublishReceived wird jedes Mal aufgerufen, wenn eine Nachricht zu einem abonnierten Topic empfangen wurde. Der Übergabeparameter e enthält dabei die Details zu den empfangenen Daten (genauer Aufbau siehe  hier).

Im Moment wandelst du den Inhalt der empfangenen Nachricht zu einem String und schreibst diesen in textBox2. Danach wandelst du den Inhalt der selben empfangenen Nachricht erneut zu einem String (unnötig, weil das hast du ja bereits gemacht) und schreibst ihn in textBox3.

Was dir fehlt, ist dass du dir das Topic der empfangenen Nachricht ansiehst und anhand des Topics entscheidest, in welche TextBox dein String geschrieben werden soll. Das Topic steht in den Ereignisargumenten (siehe Link von oben).
08.08.2019 07:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
scoobidoobi scoobidoobi ist männlich
myCSharp.de-Mitglied

Dabei seit: 07.08.2019
Beiträge: 7
Entwicklungsumgebung: C#
Herkunft: München

Themenstarter Thema begonnen von scoobidoobi

scoobidoobi ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi, habe vieles probiert aber ich kapiere das irgendwie nicht. Der Knoten in meinem Kopf ist zu groß. Hast du noch einen Ansatz wie ich das angehen soll?
08.08.2019 15:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Taipi88 Taipi88 ist männlich
myCSharp.de-Mitglied

avatar-3220.jpg


Dabei seit: 02.02.2010
Beiträge: 989
Entwicklungsumgebung: VS 2010
Herkunft: Mainz


Taipi88 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi,

ich hab zwar noch nie mit MQTT gearbeitet - allerdings hat pinki dir alles geliefert was es braucht...

Du erhälst innerhalb von "client_MqttMsgPublishReceived" das Argument "MqttMsgPublishEventArgs e", wobei e neben der Message eben auch noch ein Topic hat. (unter Anderem)

Je nachdem welches Topic - musst du doch jetzt nur noch per switch oder if oder oder oder die richtige Textbox aussuchen.

LG
08.08.2019 15:51 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.253
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

I.d.R. sollte man pro Subscription einen Listener erstellen, auf den man reagieren kann.
Das gilt allgemein für das Messaging; egal ob AMQP oder MQTT oder... macht den Umgang einfach um Welten einfacher.

Ich geh davon aus, dass der zu sehende Code einfach nur Wegwerf-Code darstellt;
trotzdem auch hier der Hinweis auf  [Artikel] Drei-Schichten-Architektur

Sofern Messages in einer Desktop-UI angezeigt werden soll (egal ob WPF, WinForms..) lässt sich das super via Reactive Extensions kombinieren.
08.08.2019 18:12 Beiträge des Benutzers | zu Buddylist hinzufügen
scoobidoobi scoobidoobi ist männlich
myCSharp.de-Mitglied

Dabei seit: 07.08.2019
Beiträge: 7
Entwicklungsumgebung: C#
Herkunft: München

Themenstarter Thema begonnen von scoobidoobi

scoobidoobi ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ja jetzt hab ich's auch mal gecheckt.

Vielen Dank an Alle vorallem an Pinki !!!
09.08.2019 08:39 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 4 Monate.
Der letzte Beitrag ist älter als 4 Monate.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 12.12.2019 20:09