スポンサーリンク

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
<span class="hljs-keyword">namespace</span> <span class="hljs-title">CsPubClient</span>
{
<span class="hljs-keyword">using</span> System;
<span class="hljs-keyword">using</span> System.Text;
<span class="hljs-keyword">using</span> uPLibrary.Networking.M2Mqtt;
<span class="hljs-comment"><span class="hljs-doctag">///</span>MQTT Publishのサンプル</span>
<span class="hljs-keyword">internal</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Program</span>
{
<span class="hljs-meta">#<span class="hljs-meta-keyword">region</span> Methods</span>
<span class="hljs-comment"><span class="hljs-doctag">///</span>MQTT Publishのサンプル.</span>
<span class="hljs-comment"><span class="hljs-doctag">///</span>コマンドライン引数</span>
<span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Main</span>(<span class="hljs-params"><span class="hljs-keyword">string</span>[] args</span>)</span>
{
<span class="hljs-keyword">var</span> client = <span class="hljs-keyword">new</span> MqttClient(<span class="hljs-string">"test.mosquitto.org"</span>);
<span class="hljs-keyword">var</span> ret = client.Connect(Guid.NewGuid().ToString());
Console.WriteLine(<span class="hljs-string">"Connected with result code {0}"</span>, ret);
<span class="hljs-keyword">while</span> (client.IsConnected)
{
<span class="hljs-keyword">var</span> msg = <span class="hljs-string">"Test message from Publisher "</span> + DateTime.Now;
client.Publish(<span class="hljs-string">"test"</span>, Encoding.UTF8.GetBytes(msg), <span class="hljs-number">0</span>, <span class="hljs-literal">true</span>);
Console.WriteLine(<span class="hljs-string">"Message published."</span>);
System.Threading.Thread.Sleep(<span class="hljs-number">1500</span>);
}
}
<span class="hljs-meta">#<span class="hljs-meta-keyword">endregion</span></span>
}
}
<span class="hljs-keyword">namespace</span> <span class="hljs-title">CsPubClient</span> { <span class="hljs-keyword">using</span> System; <span class="hljs-keyword">using</span> System.Text; <span class="hljs-keyword">using</span> uPLibrary.Networking.M2Mqtt; <span class="hljs-comment"><span class="hljs-doctag">///</span>MQTT Publishのサンプル</span> <span class="hljs-keyword">internal</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Program</span> { <span class="hljs-meta">#<span class="hljs-meta-keyword">region</span> Methods</span> <span class="hljs-comment"><span class="hljs-doctag">///</span>MQTT Publishのサンプル.</span> <span class="hljs-comment"><span class="hljs-doctag">///</span>コマンドライン引数</span> <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Main</span>(<span class="hljs-params"><span class="hljs-keyword">string</span>[] args</span>)</span> { <span class="hljs-keyword">var</span> client = <span class="hljs-keyword">new</span> MqttClient(<span class="hljs-string">"test.mosquitto.org"</span>); <span class="hljs-keyword">var</span> ret = client.Connect(Guid.NewGuid().ToString()); Console.WriteLine(<span class="hljs-string">"Connected with result code {0}"</span>, ret); <span class="hljs-keyword">while</span> (client.IsConnected) { <span class="hljs-keyword">var</span> msg = <span class="hljs-string">"Test message from Publisher "</span> + DateTime.Now; client.Publish(<span class="hljs-string">"test"</span>, Encoding.UTF8.GetBytes(msg), <span class="hljs-number">0</span>, <span class="hljs-literal">true</span>); Console.WriteLine(<span class="hljs-string">"Message published."</span>); System.Threading.Thread.Sleep(<span class="hljs-number">1500</span>); } } <span class="hljs-meta">#<span class="hljs-meta-keyword">endregion</span></span> } }
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
<span class="hljs-keyword">namespace</span> <span class="hljs-title">CsSubClient</span>
{
<span class="hljs-keyword">using</span> System;
<span class="hljs-keyword">using</span> System.Text;
<span class="hljs-keyword">using</span> uPLibrary.Networking.M2Mqtt;
<span class="hljs-keyword">using</span> uPLibrary.Networking.M2Mqtt.Messages;
<span class="hljs-comment"><span class="hljs-doctag">///</span>MQTT Subscriptionサンプル</span>
<span class="hljs-keyword">internal</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Program</span>
{
<span class="hljs-meta">#<span class="hljs-meta-keyword">region</span> Methods</span>
<span class="hljs-comment"><span class="hljs-doctag">///</span>MQTT Subscriptionサンプル</span>
<span class="hljs-comment"><span class="hljs-doctag">///</span>コマンドライン引数</span>
<span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Main</span>(<span class="hljs-params"><span class="hljs-keyword">string</span>[] args</span>)</span>
{
<span class="hljs-keyword">var</span> client = <span class="hljs-keyword">new</span> MqttClient(<span class="hljs-string">"test.mosquitto.org"</span>);
client.MqttMsgPublishReceived += (sender, eventArgs) =>
{
<span class="hljs-keyword">var</span> msg = Encoding.UTF8.GetString(eventArgs.Message);
<span class="hljs-keyword">var</span> topic = eventArgs.Topic;
Console.WriteLine(topic + <span class="hljs-string">", "</span> + msg);
};
<span class="hljs-keyword">var</span> ret = client.Connect(Guid.NewGuid().ToString());
Console.WriteLine(<span class="hljs-string">"Connected with result code {0}"</span>, ret);
client.Subscribe(<span class="hljs-keyword">new</span>[] { <span class="hljs-string">"test"</span> }, <span class="hljs-keyword">new</span>[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
<span class="hljs-keyword">while</span> (client.IsConnected)
{
}
}
<span class="hljs-meta">#<span class="hljs-meta-keyword">endregion</span></span>
}
}
<span class="hljs-keyword">namespace</span> <span class="hljs-title">CsSubClient</span> { <span class="hljs-keyword">using</span> System; <span class="hljs-keyword">using</span> System.Text; <span class="hljs-keyword">using</span> uPLibrary.Networking.M2Mqtt; <span class="hljs-keyword">using</span> uPLibrary.Networking.M2Mqtt.Messages; <span class="hljs-comment"><span class="hljs-doctag">///</span>MQTT Subscriptionサンプル</span> <span class="hljs-keyword">internal</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Program</span> { <span class="hljs-meta">#<span class="hljs-meta-keyword">region</span> Methods</span> <span class="hljs-comment"><span class="hljs-doctag">///</span>MQTT Subscriptionサンプル</span> <span class="hljs-comment"><span class="hljs-doctag">///</span>コマンドライン引数</span> <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Main</span>(<span class="hljs-params"><span class="hljs-keyword">string</span>[] args</span>)</span> { <span class="hljs-keyword">var</span> client = <span class="hljs-keyword">new</span> MqttClient(<span class="hljs-string">"test.mosquitto.org"</span>); client.MqttMsgPublishReceived += (sender, eventArgs) => { <span class="hljs-keyword">var</span> msg = Encoding.UTF8.GetString(eventArgs.Message); <span class="hljs-keyword">var</span> topic = eventArgs.Topic; Console.WriteLine(topic + <span class="hljs-string">", "</span> + msg); }; <span class="hljs-keyword">var</span> ret = client.Connect(Guid.NewGuid().ToString()); Console.WriteLine(<span class="hljs-string">"Connected with result code {0}"</span>, ret); client.Subscribe(<span class="hljs-keyword">new</span>[] { <span class="hljs-string">"test"</span> }, <span class="hljs-keyword">new</span>[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE }); <span class="hljs-keyword">while</span> (client.IsConnected) { } } <span class="hljs-meta">#<span class="hljs-meta-keyword">endregion</span></span> } }
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をコピーしました