Skip to content

Instantly share code, notes, and snippets.

@cwschroeder
Last active May 27, 2024 15:58
Show Gist options
  • Save cwschroeder/7b5117dca561c01def041e7d4c6d2771 to your computer and use it in GitHub Desktop.
Save cwschroeder/7b5117dca561c01def041e7d4c6d2771 to your computer and use it in GitHub Desktop.
Example of a C# MQTT client
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
// including the M2Mqtt Library
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
MqttClient client;
string clientId;
// this code runs when the main window opens (start of the app)
public MainWindow()
{
InitializeComponent();
string BrokerAddress = "test.mosquitto.org";
client = new MqttClient(BrokerAddress);
// register a callback-function (we have to implement, see below) which is called by the library when a message was received
client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;
// use a unique id as client id, each time we start the application
clientId = Guid.NewGuid().ToString();
client.Connect(clientId);
}
// this code runs when the main window closes (end of the app)
protected override void OnClosed(EventArgs e)
{
client.Disconnect();
base.OnClosed(e);
App.Current.Shutdown();
}
// this code runs when the button "Subscribe" is clicked
private void btnSubscribe_Click(object sender, RoutedEventArgs e)
{
if (txtTopicSubscribe.Text != "")
{
// whole topic
string Topic = "/ElektorMyJourneyIoT/" + txtTopicSubscribe.Text + "/test";
// subscribe to the topic with QoS 2
client.Subscribe(new string[] { Topic }, new byte[] { 2 }); // we need arrays as parameters because we can subscribe to different topics with one call
txtReceived.Text = "";
}
else
{
System.Windows.MessageBox.Show("You have to enter a topic to subscribe!");
}
}
// this code runs when the button "Publish" is clicked
private void btnPublish_Click(object sender, RoutedEventArgs e)
{
if (txtTopicPublish.Text != "")
{
// whole topic
string Topic = "/ElektorMyJourneyIoT/" + txtTopicPublish.Text + "/test";
// publish a message with QoS 2
client.Publish(Topic, Encoding.UTF8.GetBytes(txtPublish.Text), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, true);
}
else
{
System.Windows.MessageBox.Show("You have to enter a topic to publish!");
}
}
// this code runs when a message was received
void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
{
string ReceivedMessage = Encoding.UTF8.GetString(e.Message);
Dispatcher.Invoke(delegate { // we need this construction because the receiving code in the library and the UI with textbox run on different threads
txtReceived.Text = ReceivedMessage;
});
}
}
}
@BeginnerRaffe
Copy link

Hello, I got an error for this line:

        Dispatcher.Invoke(delegate {              // we need this construction because the receiving code in the library and the UI with textbox run on different threads
            txtReceived.Text = ReceivedMessage;  

"name dispatcher does not exist", what to do?

@MarkJoel60
Copy link

@BeginnerRaffe: Are you using WPF or Winforms? Is you are using winforms, you can replace

  Dispatcher.Invoke(delegate {              // we need this construction because the receiving code in the library and the UI with textbox run on different threads
            txtReceived.Text = ReceivedMessage; 

with:

txtReceived.Invoke((MethodInvoker)(() => txtReceived.Text = ReceivedMessage));

@monikharajs
Copy link

Hii, My error is Severity Code Description Project File Line Suppression State
Error CS0246 "The type or namespace name 'uPLibrary' could not be found" (are you missing a using directive or an assembly reference?) First C:\Users\Home\source\repos\First\First\MainWindow.xaml.cs 18 Active
I am using 2019 version, Can you plss say the solution for this??

@BrkDalkiran
Copy link

BrkDalkiran commented Aug 6, 2019

Hi Christian, i need uPLibrary same as a dll. can i use it that way

@kum-ashok
Copy link

Hi,
I am using M2qtt service and client for my window application. due to some reason my client is getting disconnected from the service. but in server side,the service is running correctly. If I restart my client application, it is again started working correctly. Is there any way in which I can trace the reason of disconnecting my client from service? How how to fire the disconnect event if my client is getting disconnect from service?
Thanks, Ashok

@TANNY786
Copy link

using System;
using System.Text;
// including the M2Mqtt Library
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;

namespace IOTWEBSITE
{
public partial class Default : System.Web.UI.Page
{
delegate void SetTextCallback(string text);
MqttClient client;
string clientId;
protected void Page_Load(object sender, EventArgs e)
{

        client = new MqttClient("broker.hivemq.com");
        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);
        //TextBox2.Text = ReceivedMessage;       
        SetText(ReceivedMessage);

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        string Topic = "testtopic/tanny";
        client.Publish(Topic, Encoding.UTF8.GetBytes(TextBox1.Text), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, true);
    }
    protected void Button2_Click(object sender, EventArgs e)
    {
        string Topic = "testtopic/tanny";
        client.Subscribe(new string[] { Topic }, new byte[] { 0 });
        SetText("");

    }
    private void SetText(string text)
    {

        SetTextCallback d = new SetTextCallback(SetText);
        this.Invoke(d, new object[] { text });                                      /// Invoke Error Occured  (How to Remove)
        TextBox3.Text = text;

    }
}

}

same thing windows application working fine
but when use web application then invoke error occured
(message send on hive mqtt broker but did not receive any message )
last 3 days finding solution
please help ................

@cwschroeder
Copy link
Author

cwschroeder commented Sep 14, 2020 via email

@Poteis
Copy link

Poteis commented Sep 14, 2020

Ye my bad. Read that shortly after too. Although all the examples I saw started with the root "/"... Quiet the reason why i deleted that comment as it was unnecessary and wrong at that point. Sorry

@tyriong
Copy link

tyriong commented Feb 17, 2021

hi I got error at txtTopicSubscribe.Text and other .Text like txtReceived, txtPublish and others. It says the name does not exist. Did I miss any using library? I only install m2mqtt Nuget package.

i tried this https://gist.github.com/cwschroeder/7b5117dca561c01def041e7d4c6d2771#gistcomment-2790033 but still same error.

@tyriong
Copy link

tyriong commented Feb 22, 2021

hi I got error at txtTopicSubscribe.Text and other .Text like txtReceived, txtPublish and others. It says the name does not exist. Did I miss any using library? I only install m2mqtt Nuget package.

i tried this https://gist.github.com/cwschroeder/7b5117dca561c01def041e7d4c6d2771#gistcomment-2790033 but still same error.

in reply to this, i learned that those supposed .Text is where textbox should be linked. Sorry I'm a self-learnt newbie, just thought it would be useful to share here too

@kamleshjha2020
Copy link

kamleshjha2020 commented Mar 26, 2021

protected override void OnClosed(EventArgs e)
{
client.Disconnect();

        base.OnClosed(e);
        App.Current.Shutdown();
      
    }

In the above code App does not exist how to solve it please tell me.

@tyriong
Copy link

tyriong commented Mar 31, 2021

protected override void OnClosed(EventArgs e)
{
client.Disconnect();

        base.OnClosed(e);
        App.Current.Shutdown();
      
    }

In the above code App does not exist how to solve it please tell me.

I think if you dont use any app in your program you can just exclude the code

@TomerHaber84
Copy link

if my broker return object ? how to handle this in the callback event ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment