スポンサーリンク

M2Mqttを使用したMQTTのクライアントサンプル

IoT時代を支えるプロトコル「MQTT」(中編) (1/3):CodeZine.

上のCodeZineの記事を参考にしながら、C#でMQTTクライアントのサンプルを作って見ました。

サンプルのソースコードはGitHubで公開していますので、参考にしてください。

GitHub - ishisaka/m2mqttclientsample: M2Mqttを使用したMQTTクライアントのサンプル
M2Mqttを使用したMQTTクライアントのサンプル. Contribute to ishisaka/m2mqttclientsample development by creating an account on GitHub.

M2Mqtt

M2Mqtt

M2Mqttは.NET Framework用のクライアントライブラリで、.NET Fx(4.5)、.NET Compact Framewoprk、.NET Microframework 4.2/4.3、Mono向けに作られていて、Windows 8.1, Windows Phone 8.1のWinRT上での動作もサポートされています。ソースコードのライセンスはApatch Lincese 2.0となっています。

ライブラリの導入はNuGetの使用が便利です。

パブリッシュ(送信)側のサンプル

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
namespace CsPubClient
{
using System;
using System.Text;
using uPLibrary.Networking.M2Mqtt;
///MQTT Publishのサンプル
internal class Program
{
#region Methods
///MQTT Publishのサンプル.
///コマンドライン引数
private static void Main(string[] args)
{
var client = new MqttClient("test.mosquitto.org");
var ret = client.Connect(Guid.NewGuid().ToString());
Console.WriteLine("Connected with result code {0}", ret);
while (client.IsConnected)
{
var msg = "Test message from Publisher " + DateTime.Now;
client.Publish("test", Encoding.UTF8.GetBytes(msg), 0, true);
Console.WriteLine("Message published.");
System.Threading.Thread.Sleep(1500);
}
}
#endregion
}
}
namespace CsPubClient { using System; using System.Text; using uPLibrary.Networking.M2Mqtt; ///MQTT Publishのサンプル internal class Program { #region Methods ///MQTT Publishのサンプル. ///コマンドライン引数 private static void Main(string[] args) { var client = new MqttClient("test.mosquitto.org"); var ret = client.Connect(Guid.NewGuid().ToString()); Console.WriteLine("Connected with result code {0}", ret); while (client.IsConnected) { var msg = "Test message from Publisher " + DateTime.Now; client.Publish("test", Encoding.UTF8.GetBytes(msg), 0, true); Console.WriteLine("Message published."); System.Threading.Thread.Sleep(1500); } } #endregion } }
namespace CsPubClient
{
    using System;
    using System.Text;

    using uPLibrary.Networking.M2Mqtt;

    ///MQTT Publishのサンプル
    internal class Program
    {
        #region Methods

        ///MQTT Publishのサンプル.
        ///コマンドライン引数
        private static void Main(string[] args)
        {
            var client = new MqttClient("test.mosquitto.org");

            var ret = client.Connect(Guid.NewGuid().ToString());
            Console.WriteLine("Connected with result code {0}", ret);

            while (client.IsConnected)
            {
                var msg = "Test message from Publisher " + DateTime.Now;
                client.Publish("test", Encoding.UTF8.GetBytes(msg), 0, true);
                Console.WriteLine("Message published.");
                System.Threading.Thread.Sleep(1500);
            }
        }

        #endregion
    }
}

あんまり難しいコードではないので、CodeZineの記事を読んでいれば、説明はそれほどいらないと思いますが、17行でMQTTブローカーのホスト名を指定してクライアントのインスタンスを作ったら、19行でユニークなクライアントIDを指定して、ブローカに接続しています。

22行のwhileの中が、メッセージをブローカーのキューにメッセージを送信する処理で、1.5秒毎にメッセージを送信しています。実際の送信処理は25行です。ここでは第1の引数でTopic(キューの名前)を指定し、第2引数でデータのByte配列をしてします。M2MqttのPublishメソッドは送信データをByte型の配列で要求するので、テキストのデータでもByte配列に変換する必要があります。

サブスクライブ側のサンプル

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
namespace CsSubClient
{
using System;
using System.Text;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;
///MQTT Subscriptionサンプル
internal class Program
{
#region Methods
///MQTT Subscriptionサンプル
///コマンドライン引数
private static void Main(string[] args)
{
var client = new MqttClient("test.mosquitto.org");
client.MqttMsgPublishReceived += (sender, eventArgs) =>
{
var msg = Encoding.UTF8.GetString(eventArgs.Message);
var topic = eventArgs.Topic;
Console.WriteLine(topic + ", " + msg);
};
var ret = client.Connect(Guid.NewGuid().ToString());
Console.WriteLine("Connected with result code {0}", ret);
client.Subscribe(new[] { "test" }, new[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
while (client.IsConnected)
{
}
}
#endregion
}
}
namespace CsSubClient { using System; using System.Text; using uPLibrary.Networking.M2Mqtt; using uPLibrary.Networking.M2Mqtt.Messages; ///MQTT Subscriptionサンプル internal class Program { #region Methods ///MQTT Subscriptionサンプル ///コマンドライン引数 private static void Main(string[] args) { var client = new MqttClient("test.mosquitto.org"); client.MqttMsgPublishReceived += (sender, eventArgs) => { var msg = Encoding.UTF8.GetString(eventArgs.Message); var topic = eventArgs.Topic; Console.WriteLine(topic + ", " + msg); }; var ret = client.Connect(Guid.NewGuid().ToString()); Console.WriteLine("Connected with result code {0}", ret); client.Subscribe(new[] { "test" }, new[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE }); while (client.IsConnected) { } } #endregion } }
namespace CsSubClient
{
    using System;
    using System.Text;

    using uPLibrary.Networking.M2Mqtt;
    using uPLibrary.Networking.M2Mqtt.Messages;

    ///MQTT Subscriptionサンプル
    internal class Program
    {
        #region Methods

        ///MQTT Subscriptionサンプル
        ///コマンドライン引数
        private static void Main(string[] args)
        {
            var client = new MqttClient("test.mosquitto.org");
            client.MqttMsgPublishReceived += (sender, eventArgs) =>
                {
                    var msg = Encoding.UTF8.GetString(eventArgs.Message);
                    var topic = eventArgs.Topic;

                    Console.WriteLine(topic + ", " + msg);
                };

            var ret = client.Connect(Guid.NewGuid().ToString());
            Console.WriteLine("Connected with result code {0}", ret);
            client.Subscribe(new[] { "test" }, new[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });

            while (client.IsConnected)
            {
            }
        }

        #endregion
    }
}

18行でMQTTブローカーのホスト名を指定してクライアントのインスタンスを作ったら、19行からメッセージ受信時のイベント処理を記述しています。イベント受信毎にコンソールに受信したメッセージの内容を表示させています。

29行がサブスクライブの登録で、引数でサブスクライブするトピック、QOSのレベルを指定します。

その後、ブローカーから切断されるまでメッセージを受信し続けます。

まとめ

M2Mqttは荒削りな部分がありますが、現状ではだいぶ実用的なライブラリになっていますし、私としては試していませんが、.NET MFや.NET CFへの対応、MONOのサポートはMaker:的なIoTとの親和性も高そうです。

コメント

  1. […] .NET Frameworkで動作すると書いてあるので、お書きのWindowsもサポートされていると理解して良いです。 簡単なサンプルコードも紹介されています。 https://opcdiary.net/?p=28785 […]

タイトルとURLをコピーしました