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

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

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

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

https://github.com/ishisaka/m2mqttclientsample

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の使用が便利です。

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

namespace CsPubClient
{
    using System;
    using System.Text;

    using uPLibrary.Networking.M2Mqtt;

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

        /// <summary>MQTT Publishのサンプル.</summary>
        /// <param name="args">コマンドライン引数</param>
        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配列に変換する必要があります。

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

namespace CsSubClient
{
    using System;
    using System.Text;

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

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

        /// <summary>MQTT Subscriptionサンプル</summary>
        /// <param name="args">コマンドライン引数</param>
        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との親和性も高そうです。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください