C# SDK を使った接続
C# は、Microsoft が提供するオブジェクト指向プログラミング言語で、.NET Framework 上で動作します。
本記事では、C# プロジェクトで paho.mqtt.m2mqtt クライアントライブラリを使用して、クライアントから MQTT サーバーへの接続、サブスクライブ、パブリッシュ、メッセージ受信を行う方法を主に紹介します。
前提条件
- デプロイメントが作成されていること。接続に関する情報はデプロイメント概要で確認できます。デプロイメントのステータスが実行中であることを必ずご確認ください。また、WebSocket を使って MQTT サーバーへの接続テストも可能です。
- 接続認証のために、
Access Control
>Authentication
にてユーザー名とパスワードを設定していること。
本プロジェクトは .NET 5.0 を使って開発およびテストしています。以下のコマンドで .NET のバージョンを確認できます。
~ dotnet --version
5.0.301
MQTT クライアントの選択
paho.mqtt.m2mqtt は、MQTT v3.1 および v3.1.1 をサポートし、すべての .NET プラットフォームで利用可能な MQTT クライアントです。
.NET CLI での M2Mqtt インストール
プロジェクトのルートで以下のコマンドを実行し、M2Mqtt をインストールします。
dotnet add package M2Mqtt --version 4.3.0
接続
コンソールのデプロイメント概要で該当するアドレスとポート情報を確認してください。ベーシックエディションの場合、ポートは 1883 または 8883 ではない可能性がありますので、必ずポート番号をご確認ください。
MQTT ブローカーへの接続
本記事では、EMQX が提供する無料のパブリック MQTT ブローカーを使用します。このサービスはMQTT IoT クラウドプラットフォームをベースに作成されています。ブローカーの接続情報は以下の通りです:
- ブローカー: broker.emqx.io
- TCP ポート: 1883
- WebSocket ポート: 8083
M2Mqtt のインポート
using uPLibrary.Networking.M2Mqtt;
MQTT ブローカー接続のパラメータ設定
MQTT ブローカーのアドレス、ポート、トピックを設定します。同時に、C# の Guid.NewGuid()
を使ってランダムな uid を MQTT クライアント ID として生成します。
string broker = "broker.emqx.io";
int port = 1883;
string topic = "Csharp/mqtt";
string clientId = Guid.NewGuid().ToString();
// ブローカーが認証を要求する場合は、ユーザー名とパスワードを設定
string username = "emqx";
string password = "public";
MQTT 接続メソッドの作成
静的クラスメソッド ConnectMQTT
を作成し、MQTT クライアントを生成して指定したブローカーに接続します。クライアントの IsConnected
プロパティで接続成功を判定できます。最後にクライアントを返します。
static MqttClient ConnectMQTT(string broker, int port, string clientId, string username, string password)
{
MqttClient client = new MqttClient(broker, port, false, MqttSslProtocols.None, null, null);
client.Connect(clientId, username, password);
if (client.IsConnected)
{
Console.WriteLine("Connected to MQTT Broker");
}
else
{
Console.WriteLine("Failed to connect");
}
return client;
}
メッセージのパブリッシュ
while ループを定義し、その中で MQTT クライアントの Publish
メソッドを使って、指定したトピックに 1 秒ごとにメッセージをパブリッシュします。
static void Publish(MqttClient client, string topic)
{
int msg_count = 0;
while (true)
{
System.Threading.Thread.Sleep(1*1000);
string msg = "messages: " + msg_count.ToString();
client.Publish(topic, System.Text.Encoding.UTF8.GetBytes(msg));
Console.WriteLine("Send `{0}` to topic `{1}`", msg, topic);
msg_count++;
}
}
トピックのサブスクライブ
静的メソッド client_MqttMsgPublishReceived
を作成します。このメソッドはクライアントが MQTT ブローカーからメッセージを受信した際に呼ばれます。受信したメッセージのトピックとペイロードを表示します。
static void Subscribe(MqttClient client, string topic)
{
client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;
client.Subscribe(new string[] { topic }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE });
}
static void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
{
string payload = System.Text.Encoding.Default.GetString(e.Message);
Console.WriteLine("Received `{0}` from `{1}` topic", payload, e.Topic.ToString());
}
完全なコード
using System;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;
namespace csharpMQTT
{
class Program
{
static MqttClient ConnectMQTT(string broker, int port, string clientId, string username, string password)
{
MqttClient client = new MqttClient(broker, port, false, MqttSslProtocols.None, null, null);
client.Connect(clientId, username, password);
if (client.IsConnected)
{
Console.WriteLine("Connected to MQTT Broker");
}
else
{
Console.WriteLine("Failed to connect");
}
return client;
}
static void Publish(MqttClient client, string topic)
{
int msg_count = 0;
while (true)
{
System.Threading.Thread.Sleep(1*1000);
string msg = "messages: " + msg_count.ToString();
client.Publish(topic, System.Text.Encoding.UTF8.GetBytes(msg));
Console.WriteLine("Send `{0}` to topic `{1}`", msg, topic);
msg_count++;
}
}
static void Subscribe(MqttClient client, string topic)
{
client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;
client.Subscribe(new string[] { topic }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE });
}
static void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
{
string payload = System.Text.Encoding.Default.GetString(e.Message);
Console.WriteLine("Received `{0}` from `{1}` topic", payload, e.Topic.ToString());
}
static void Main(string[] args)
{
string broker = "broker.emqx.io";
int port = 1883;
string topic = "Csharp/mqtt";
string clientId = Guid.NewGuid().ToString();
string username = "emqx";
string password = "public";
MqttClient client = ConnectMQTT(broker, port, clientId, username, password);
Subscribe(client, topic);
Publish(client, topic);
}
}
}
動作確認
コードを実行すると、コンソールに以下のように出力されます。