Paho MQTT for C# ライブラリを使用して Alibaba Cloud IoT Platform に接続し、Thing Specification Language (TSL) モデルを使用してデータを交換します。
前提条件
IoT Platform でプロダクトとデバイスを作成し、[機能定義] タブでプロダクトの LightSwitch プロパティを定義しておく必要があります。
詳細については、「プロダクトの作成」、「単一デバイスの作成」、「単一プロダクトの TSL モデルの追加」をご参照ください。
背景情報
Paho MQTT for C# のオープンソースコードには、Visual Studio ソリューションプロジェクトが含まれています。ソリューション内の各プロジェクトは、異なる .NET プラットフォームをターゲットとして、対応するクラスライブラリを生成します。
この例では、ソリューション内にコンソールアプリケーションプロジェクトを作成し、Paho MQTT クラスライブラリを呼び出して Alibaba Cloud IoT Platform に接続します。
開発環境の準備
この例では、次のオペレーティングシステムと開発ツールを使用します。
-
オペレーティングシステム:Windows 10
-
統合開発環境 (IDE):Visual Studio 2019
開発環境をインストールします。
-
Visual Studio Community 2019 をダウンロードし、パッケージを解凍します。
-
Visual Studio Installer を開き、[.NET デスクトップ開発] を選択してから、[インストール] をクリックします。
Paho クライアントのダウンロード
Paho MQTT for C# のソースコードをダウンロードします。このソースコードには、Visual Studio ソリューションプロジェクトファイル M2Mqtt.sln が含まれています。このプロジェクトファイルを使用して、デバイスクライアントを開発できます。詳細については、「IoT Platform への接続」をご参照ください。
Paho のソースコードに関する詳細情報は、Eclipse Paho でもご確認いただけます。
このデモでは master ブランチを使用します。コミット ID は b2e64bc4485721a0bd5ae805d9f4917e8d040e81 です。
IoT Platform への接続
-
MqttSign.cs をダウンロードし、Alibaba Cloud が提供する MQTT 接続パラメーターを計算するためのソースコードを取得します。
MqttSign.cs ファイルでは、
MqttSignクラスが定義されています。-
プロトタイプ:
class MqttSign -
機能:
デバイスを MQTT 経由で IoT Platform に接続するために必要な username、password、clientid を計算します。
-
メンバー:
型定義
メソッドの説明
public bool
calculate(String productKey, String deviceName, String deviceSecret)デバイスの productKey、deviceName、deviceSecret に基づいて、MQTT 接続パラメーターの username、password、clientid を計算します。
public String
getUsername()MQTT 接続パラメーターの username を取得します。
public String
getPassword()MQTT 接続パラメーターの password を取得します。
public String
getClientid()MQTT 接続パラメーターの clientid を取得します。
-
-
Visual Studio を開き、Paho のソースコードから M2Mqtt.sln Visual Studio ソリューションファイルをインポートし、アプリケーションプロジェクトを作成します。
-
手順 1 でダウンロードした MqttSign.cs ファイルをアプリケーションプロジェクトにインポートします。
-
アプリケーションプロジェクトに、デバイスを IoT Platform に接続するためのプログラムファイルを追加します。
MqttSign.cs ファイル内の MqttSign クラスのインスタンスを生成して、デバイスを IoT Platform に接続するための MQTT 接続パラメーターを計算します。
以下に、開発の手順とコード例を示します。
-
MQTT 接続パラメーターの計算
MqttSign.cs で MqttSign を呼び出して、MQTT 接続パラメーターを計算します。
String productKey = "a1X2bEn****"; String deviceName = "example1"; String deviceSecret = "ga7XA6KdlEeiPXQPpRbAjOZXwG8y****"; // MQTT 接続パラメーターを計算します。 MqttSign sign = new MqttSign(); sign.calculate(productKey, deviceName, deviceSecret); Console.WriteLine("username: " + sign.getUsername()); Console.WriteLine("password: " + sign.getPassword()); Console.WriteLine("clientid: " + sign.getClientid()); -
Paho MQTT クライアントを使用した IoT Platform への接続
// Paho を使用して Alibaba Cloud IoT Platform に接続します。 int port = 443; String broker = productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com"; MqttClient mqttClient = new MqttClient(broker, port, true, MqttSslProtocols.TLSv1_2, null, null); mqttClient.Connect(sign.getClientid(), sign.getUsername(), sign.getPassword()); Console.WriteLine("Broker: " + broker + " Connected");説明コード
String broker = productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com";のエンドポイントを、ご使用のデバイスのインスタンスに対応するものに置き換えてください。パブリックインスタンスおよびEnterprise Editionインスタンスのエンドポイントとエンドポイントの形式の詳細については、「インスタンスのエンドポイントの表示」をご参照ください。
-
デバイスから IoT Platform へのデータレポート
次のサンプルコードは、LightSwitch の TSL モデルプロパティをレポートする方法を示しています。
// Paho MQTT クライアントを使用してメッセージを公開します。 String topic = "/sys/" + productKey + "/" + deviceName + "/thing/event/property/post"; String message = "{\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":0}}"; mqttClient.Publish(topic, Encoding.UTF8.GetBytes(message));TSL モデル通信のデータ形式については、「デバイスのプロパティ、イベント、サービス」をご参照ください。
カスタムトピックを使用して通信する場合は、「トピックとは」をご参照ください。
-
トピックをサブスクライブして IoT Platform からデータを受信
次の例では、デバイスは、プロパティ値をレポートした後に IoT Platform が返す確認メッセージを受信するために、トピックをサブスクライブします。
// Paho MQTT クライアントを使用してメッセージをサブスクライブします。 String topicReply = "/sys/" + productKey + "/" + deviceName + "/thing/event/property/post_reply"; mqttClient.MqttMsgPublishReceived += MqttPostProperty_MqttMsgPublishReceived; mqttClient.Subscribe(new string[] { topicReply }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE }); ... private static void MqttPostProperty_MqttMsgPublishReceived(object sender, uPLibrary.Networking.M2Mqtt.Messages.MqttMsgPublishEventArgs e) { Console.WriteLine("reply topic :" + e.Topic); Console.WriteLine("reply payload:" + System.Text.Encoding.UTF8.GetString(e.Message)); }
デバイス、サーバー、およびIoT Platformの通信方法については、「デバイス、IoT platform、およびサーバー間の通信の概要」をご参照ください。
-
-
プロジェクトをコンパイルします。
デモ
デモコードを使用して IoT Platform に接続します。
-
デモコードパッケージをダウンロードし、aiot-csharp-demo フォルダーに解凍します。
aiot-csharp-demo\paho.mqtt.m2mqtt-master\aiot-csharp-demo フォルダーには、デバイスを IoT Platform に接続し、TSL モデルのプロパティをレポートするための完全なプログラムが含まれています。
ファイル
説明
MqttSign.cs
Alibaba Cloud が提供する MQTT 接続パラメーターを生成するためのソースコード。実行時に、Program.cs はこのファイルで定義された MqttSign() コンストラクターを呼び出して、username、password、clientid の各パラメーターを計算します。
Program.cs
デバイスを IoT Platform に接続し、プロパティデータをレポートするためのロジックが含まれています。
-
Visual Studio Community 2019 を起動し、[プロジェクトまたはソリューションを開く] を選択して、aiot-csharp-demo\paho.mqtt.m2mqtt-master\M2Mqtt.sln ファイルを開きます。
これにより、aiot-csharp-demo プロジェクトファイルが Visual Studio にインポートされます。
-
Program.cs で、サンプルのデバイス情報を実際のデバイス情報に置き換えます。
-
次のコードで、productKey、deviceName、deviceSecret の値を実際のデバイスの認証情報に置き換えます。
String productKey = "${ProductKey}"; String deviceName = "${DeviceName}"; String deviceSecret = "${DeviceSecret}"; -
コード
String broker = productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com";のエンドポイントを修正します。詳細については、「IoT Platform への接続」セクションの手順 4 をご参照ください。
-
-
aiot-csharp-demo をスタートアッププロジェクトとして設定し、プロジェクトを実行してデバイスを IoT Platform に接続します。
username: lxxx3 password: E251xxx clientid: g1xxx|timestamp=1606810137987, _v=paho-c#-1.0.0, securemode=2, signmethod=hmacsha256| broker: iotxxxn Connected subscribe: /sys/gxxx/thing/event/property/post_reply publish: {"id":"1","version":"1.0","params":{"LightSwitch":0}} reply topic: /sys/gxxx/thing/event/property/post_reply reply payload:{"code":200,"data":{},"id":"1","message":"success","method":"thing.event.property.post","version":"1.0"}デバイスが接続されると、オンプレミスログに接続の成功、データレポート、メッセージのサブスクリプションが表示されます。
... broker: a1X2bEn****.iot-as-mqtt.cn-shanghai.aliyuncs.com Connected ... publish: {"id":"1","version":"1.0","params":{"LightSwitch":0}} ... subscribe: /sys/a1X2bEn****/example1/thing/event/property/post_reply ...IoT Platform コンソールにログインして、インスタンス内のデバイスのステータスとログを確認します。
を選択します。 [デバイス] ページには、デバイスがオンライン状態であることが表示されます。
を選択します。 次に、[クラウド実行ログ] または [デバイスローカルログ] タブをクリックしてログを表示します。 詳細については、「IoT Platformログ」および「ローカルデバイスログ」をご参照ください。
エラーコード
デバイスがIoT PlatformへのMQTT接続を確立できない場合は、エラーコードに基づいて問題をトラブルシューティングできます。 詳細については、「トラブルシューティング」をご参照ください。