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