Visual Studio for Mac(C#)でAWS IoTへ接続してみた。

AWS IoT では、インターネットに接続された各種デバイスからMQTTを使用してデータを送受信できます。また、受信したデータは、ルールを設定することで、LambdaやDynamoDBなど各種AWSサービスへ連携することができます。 今回はC#でAWSIoTへのパブリッシュとサブスクライブを行うサンプルを作成してみました。
2018.07.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

AWS IoT では、インターネットに接続された各種デバイスからMQTTを使用してデータを送受信できます。また、受信したデータは、ルールを設定することで、LambdaやDynamoDBなど各種AWSサービスへ連携することができます。

そして、AWSコンソールからは、OSと言語を選択するだけで、超簡単に雛形を構築することも可能です。

しかし、残念ながら、上記雛形では、MacやC#の選択はありません。そこで、今回はC#でAWSIoTへのパブリッシュとサブスクライブを行うサンプルを作成してみました。

使用した環境は、Visula Studio for Mac(C#) + M2Mqtt です。


MQTT Client Library Encyclopedia – M2Mqtt
Visual Studio for Mac

※AWS SDK for .NETでも、AWS IoT Coreへの対応クラスが提供されていますが、ちょっと情報が少なくて使いきれなかったので、こちらは、次回挑戦とさせて頂きました。

2 モノの作成

最初に、AWSコンソールで、モノの作成を行い、証明書を発行しておきます。

また、ルート証明も取得しておきます。

$ curl https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem > root-CA.crt

3 PKCS12

プログラムから使用するために、証明書と秘密鍵をPKCS12にしておきます。

$ openssl pkcs12 -export -out MonoAWSIotSample.pfx -inkey MonoAWSIotSample.private.key -in MonoAWSIotSample.cert.pem -certfile root-CA.crt
Enter Export Password:XXX
Verifying - Enter Export Password:XXX

4 プロジェクト作成

Visual Studip for Macで その他 > .NET > コンソールプロジェクトで新規プロジェクトを作成します。

プロジェクト名は、MonoAWSIotSampleとしました。

5 パッケージの追加

ソリューションのパッケージを右クリックして、パッケージを追加します。

追加するパッケージは、M2Mqtt 及び、 Plt.M2Mqtt の2つです。

6 実装

下記が、今回作成したサンプルです。AWSIotクラスにPublishとSubscribeの機能を実装しました。

using System;
using System.Text;
using System.Security.Cryptography.X509Certificates;

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

namespace MonoAWSIotSample
{
    class MainClass
    {

        const string endpoint = "xxxxxxxx.iot.us-east-1.amazonaws.com";

        const string clientCertFile = "MonoAWSIotSample.pfx";
        const string clientCertPassword = "xxxxxx";
        const string rootCaFile = "root-CA.crt";

        const string topic = "sample_topic";

        public static void Main(string[] args) {
            var clientCert = new X509Certificate2(clientCertFile, clientCertPassword);
            var rootCa = X509Certificate.CreateFromCertFile(rootCaFile);

            AWSIot iot = new AWSIot(endpoint, clientCert, rootCa);

            // Subscribe
            iot.Recv += Recv;
            iot.Subscribe(topic);

            // Publish
            iot.Publish(topic, "MonoAWSIotSampleからのメッセージ!");

            Console.ReadLine();
        }

        static void Recv(string message) {
            Console.WriteLine(message);
        }
    }

    delegate void RevcHandler(string message);

    class AWSIot{
        public event RevcHandler Recv = null;

        // AWS IoTでは、TLS1.2ポートが使用されている
        private const int BrokerPort = 8883;
        MqttClient client;

        public AWSIot(string endpoint, X509Certificate2 clientCert, X509Certificate rootCa) {

            client = new MqttClient(endpoint, BrokerPort, true, rootCa, clientCert, MqttSslProtocols.TLSv1_2);
            client.Connect("clientid1");
            if (client.IsConnected) {
                Console.WriteLine("AWSIot Connected.");
            }
            client.MqttMsgPublishReceived += MessageReceived;
        }

        public void Subscribe(string Topic) {
            client.Subscribe(new[] { Topic }, new[] { MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE }); 
        }

        public void Publish(string Topic,string message) {
            client.Publish(Topic, Encoding.UTF8.GetBytes(message));
        }

        void MessageReceived(object sender, uPLibrary.Networking.M2Mqtt.Messages.MqttMsgPublishEventArgs e) {
            Recv(new String(Encoding.UTF8.GetChars(e.Message)));
        }
    }
}

7 動作確認

動作確認している様子です。AWSコンソール(AWS ToI)の、テスト画面を使用してパブリッシュとサブスクライブを確認しています。

8 最後に

今回は、Mac + C# + AWS IoTという、ちょっと誰得なサンプルでした。が、これ個人的には、結構重宝しているのです。C#は好きだけど身近にWindowsが無いって言う環境では。

ちなみに、今回使用しませんでしたが、最初に書いたようにAWSSDK.IoTもNuGetで簡単にインストールできるので、是非、試してみたいと思います。また、mono若しくは、.NET CoreでRaspberryPiにも載せてれるのでは?と考えています。