IoT時代を支えるプロトコル「MQTT」(中編) (1/3):CodeZine.
上のCodeZineの記事を参考にしながら、C#でMQTTクライアントのサンプルを作って見ました。
サンプルのソースコードはGitHubで公開していますので、参考にしてください。
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; ///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配列に変換する必要があります。
サブスクライブ側のサンプル
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との親和性も高そうです。
コメント
[…] .NET Frameworkで動作すると書いてあるので、お書きのWindowsもサポートされていると理解して良いです。 簡単なサンプルコードも紹介されています。 https://opcdiary.net/?p=28785 […]