Skip to content

Instantly share code, notes, and snippets.

@cwschroeder
Last active October 13, 2023 09:50
Show Gist options
  • Star 27 You must be signed in to star a gist
  • Fork 13 You must be signed in to fork a gist
  • 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;
});
}
}
}
@JovanYong
Copy link

Hi cwschroeder , i would like to ask if it possible that your code be able to convert to web application for visual studio?

@Head-Scratcher
Copy link

Haven't got it displaying anything yet, but at least I have no errors with yours, which is a massive step up from most of the other code I have spent hours on time trying to get to work. Many thanks for sharing.

@Head-Scratcher
Copy link

Got it working :D
Issue was in the renaming of private void btnSubscribe_Click(object sender, RoutedEventArgs e) to private void BtnSubscribe_Click(object sender, RoutedEventArgs e) had to capitalize the B to make VS happy with the naming convention, but that broke the Button event. Had to recreate new buttons and it works fine.

@ccoenen
Copy link

ccoenen commented May 21, 2018

Thanks for the example!

@PravinPravin
Copy link

PravinPravin commented Jul 14, 2018

Hi,
I have created my free trial login on azure and I want to use my own Broker address instead of test.mosquitto.org. can you please help me to set up my new broker. I am new on azure.

@SyedAkramAhmed
Copy link

i have created a windows application with same piece of code getting error while connecting the client.

A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 37.187.106.16:1883

Any idea what to do ?

@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

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