Autor |
Beitrag |
GoofiGoofi
Hält's aus hier
Beiträge: 4
|
Verfasst: Fr 15.02.19 19:13
Hallo zusammen,
vorerst muss ich sagen, dass ich mich auf dem Gebiet MQTT nicht besonders gut auskenne.
Mein Problem ist ich möchte von einem Mosquitto Broker einen string empfangen und diesen an einen label.text übergeben.
Kann mir bitte jemand sagen was ich falsch mache oder was ich übersehen habe? Oder ist das vielleicht ein komplett falscher Ansatz?
Ich bin für jeden Vorschlag sehr dankbar!
Das ist meine bisherige Vorgehensweise:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e) { MqttClient client = new MqttClient("10.14.9.205");
client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;
string clientId = Guid.NewGuid().ToString();
client.Connect(clientId);
client.Subscribe(new string[] { "/home/temperature" }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
label1.Text = clientId; }
static void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) { } } } |
Moderiert von Th69: C#-Tags hinzugefügt
|
|
Th69
Beiträge: 4785
Erhaltene Danke: 1055
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 15.02.19 19:36
Hallo und ,
könntest du bitte deinen Beitrag nochmal editieren und den Code in passende C#-Tags packen?
Unter MQTT Client gibt es Beispielcode dafür.
Für WinForms beachte den letzten Kommentar von "MarkJoel60" bzgl. Control.Invoke.
Für diesen Beitrag haben gedankt: GoofiGoofi
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 15.02.19 20:57
Die MqttClient Instanz an einer lokalen Variablen zu halten ist sicher keine gute Idee. Nach dem Ende der Form1_Load Methode wird die Instanz dereferenziert und wird an die Garbage Collection übergeben. Die wird also zu einem undefinierten Zeitpunkt danach ohne dein weiteres zutun zerstört. Die Variable sollte eine Klassenvariable sein. Wie übrigens auch in dem verlinkten Beispiel von Th69 gezeigt.
Den EventHandler client_MqttMsgPublishReceived statisch zu machen ist auch eher ungewöhnlich. Wenn du das schon in einer Form machst willst du bestimmt auch aus dem EventHandler auf die Form zugreifen können.
Und bitte kein Crossposting. Zumindest nicht heimlich.
Für diesen Beitrag haben gedankt: GoofiGoofi
|
|
GoofiGoofi
Hält's aus hier
Beiträge: 4
|
Verfasst: Fr 15.02.19 22:24
Vielen Dank für den Tip!
Wie schon gesagt ist das alles NOCH Neuland für mich.
Wie meinst du das „den EventHandler client_MqttMsgPublishReceived statisch zu machen„, wie muss ich da vorgehen? Funktioniert das so nicht auch?
Moderiert von Th69: C#-Tags hinzugefügt
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Sa 16.02.19 12:35
Im Moment hast du client_MqttMsgPublishReceived mit dem static Schlüsselwort markiert. Damit gehört der EventHandler nicht mehr zu einer bestimmten Instanz der Form1 Klasse und hat damit keinen Zugriff mehr auf die Instanzdaten. Zum Beispiel das Label in das du was schreiben möchtest ist Teil einer Instanz der Form1 Klasse und aus einer statischen Methode der Klasse nicht erreichbar.
|
|
GoofiGoofi
Hält's aus hier
Beiträge: 4
|
Verfasst: So 17.02.19 17:14
Hallo zusammen,
vielen Dank erst mal für euere Unterstütztung.
Ich bin dem Beispielcode gefolgt, habe aber immer noch ein Problem.
Wenn ich clientId an eine Ausgabe Variable (txtReceived.Text) übergebe bekomme ich nur wirres Zeug raus in etwa so "ft5456e-ezd5-465f-647ztee"
Was mache ich falsch?
hier mein neuer Code:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63:
| public partial class MainWindow : Window { MqttClient client; string clientId;
public MainWindow() { InitializeComponent();
string BrokerAddress = "10.14.9.205";
client = new MqttClient(BrokerAddress);
client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;
clientId = Guid.NewGuid().ToString();
client.Connect(clientId); } void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) { string ReceivedMessage = Encoding.UTF8.GetString(e.Message);
Dispatcher.Invoke(delegate { txtReceived.Text = ReceivedMessage; });
} protected override void OnClosed(EventArgs e)
{ client.Disconnect(); base.OnClosed(e); App.Current.Shutdown(); }
private void Button_Click(object sender, RoutedEventArgs e) { if (txtTopicSubscribe.Text != "") { string Topic = "/ElektorMyJourneyIoT/" + txtTopicSubscribe.Text + "/test";
client.Subscribe(new string[] { Topic }, new byte[] { 2 }); txtReceived.Text = clientId; } else { System.Windows.MessageBox.Show("You have to enter a topic to subscribe!"); } } } } |
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: So 17.02.19 17:23
Zitat: | Wenn ich clientId an eine Ausgabe Variable (txtReceived.Text) übergebe bekomme ich nur wirres Zeug raus in etwa so "ft5456e-ezd5-465f-647ztee"
Was mache ich falsch? |
Nichts du hast eine GUID in clientID reingeschrieben und so sieht halt eine GUID in Textdarstellung aus.
|
|
GoofiGoofi
Hält's aus hier
Beiträge: 4
|
Verfasst: So 17.02.19 17:39
Ok dann habe ich die Frage falsch gestellt.
Wo sehe ich den string den ich empfangen möchte? (Subscriber)
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: So 17.02.19 17:48
Voraussichtlich irgendwas aus den MqttMsgPublishEventArgs.
Im Moment zeigst du irgendwas in txtReceived aus diesen EventArgs an. Aber ob Message was relevantes ist oder etwas anderes aus den EventArgs wichtig ist solltest du dir aus der Doku anlesen. Vielleicht solltest du auch einfach mal deinen Code debuggen? Setze einen Breakpoint in deinen Received Event und schau dir im Deugger an was da alles in den EventArgs steckt wenn der Code aufgerufen wird.
|
|