MQTTメッセージを受信

今回はポンコツ2人組がWPFでMQTTメッセージを受信するプログラムに挑戦してみました。 開発環境はVisualStudio2019です。MQTTのライブラリは「M2Mqtt」でバージョンは「4.3.0」です。NuGetでインストールして下さい。 MQTTはmosquittoをインストールしてメッセージを送信しています。

※この記事は2023/11/15時点の情報です。

MainWindow.xaml
受信したMQTTメッセージを表示するためのTextBoxを配置しています。

<Window x:Class="WpfMqttReceiver.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MQTT Receiver" Height="350" Width="525"
        Closing="Window_Closing">
    <Grid>
        <StackPanel>
            <TextBlock Text="Received Messages:" FontWeight="Bold" Margin="10"/>
            <TextBox x:Name="ReceiveTextBox" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" IsReadOnly="True" Height="200" Margin="10"/>
        </StackPanel>
    </Grid>
</Window>

ReceiveData.cs
受信したJSONデータをデシリアライズするためのクラスです。

using System.Runtime.Serialization;

[DataContract]
public class ReceiveData
{
    [DataMember(Name = "message")]
    public string Message { get; set; }
}

MainWindow.xaml.cs
MQTTブローカーに接続し、指定したトピックをサブスクライブしてメッセージを受信します。 MQTTブローカーのアドレスは string brokerAddress = "localhost"; で指定しています。 トピックは string topic = "test/topic"; で指定しています。環境にあわせて変更してください。

using System;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Windows;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;

namespace WpfMqttReceiver
{
    public partial class MainWindow : Window
    {
        private MqttClient mqttClient;

        public MainWindow()
        {
            InitializeComponent();

            // MQTT Broker の接続情報を設定
            string brokerAddress = "localhost"; // MQTTブローカーのアドレス
            mqttClient = new MqttClient(brokerAddress);

            // MQTT メッセージを受信したときのイベントハンドラを設定
            mqttClient.MqttMsgPublishReceived += MqttClientOnMqttMsgPublishReceived;

            // 接続
            string clientId = Guid.NewGuid().ToString();
            mqttClient.Connect(clientId);

            // トピックをサブスクライブ
            string topic = "test/topic"; // 受信したいトピック
            mqttClient.Subscribe(new string[] { topic }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
        }

        private void MqttClientOnMqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
        {
            // メッセージを受信したときの処理
            string jsonMessage = Encoding.UTF8.GetString(e.Message);

            // JSONデシリアライズ
            ReceiveData receiveData;
            using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonMessage)))
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(ReceiveData));
                receiveData = (ReceiveData)serializer.ReadObject(stream);
            }

            // UIに表示
            Dispatcher.Invoke(() => { ReceiveTextBox.Text += $"Received Message: {receiveData.Message}\n"; });
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            // アプリケーションが終了するときに MQTT ブローカーとの接続を切断
            if (mqttClient.IsConnected)
            {
                mqttClient.Disconnect();
            }
        }
    }
}

以下がアプリケーションを実行した画面です。mosquittoから下記コマンドで送信したメッセージを受信できました。
"c:\Program Files\mosquitto\mosquitto_pub.exe" -h localhost -t test/topic -m "{\"message\": \"Hello, MQTT!\"}"

C#のWPFでMQTTメッセージを受信してみた!

管理人情報