ArduinoからAzure IoT Hubへのデータの送信









少し前に、私はGenuino MKR1000の誇り高い所有者になりました。 Resource Hackster.ioは、マイクロソフトと共同で、最高のアイデアを競います。 アイデアを実現し、コンテストの第2部に参加することはできませんでしたが、アイデアの実現に役立つ情報を共有できます。 Arduinoからクラウドにデータを送信する方法と、WiFiシールドまたはMKR1000がある場合のデータの読み取り方法に関するネコの下。



Azureを構成する



portal.azure.comに移動し、[+]をクリックして[モノのインターネット]-[IoTハブ]を選択し、ハブの名前を見つけます。 私は、ハブに単純かつ控えめに名前を付けることにしました-alexey。 価格カテゴリでは、無料のS1(デバイスごと)を選択しました。







実際、これでハブの設定は完了です。 それでも主キーを取得する必要がありますが、これは後で行うことができます。



Arduinoのセットアップ



必要なWiFi101ライブラリをインストールします。







0.8よりも高いバージョンが必要なので、古いライブラリが既にインストールされている場合は、更新してください。







Azure IoT Hubは、接続セキュリティにSSLを使用します。 ただし、ArduinoにはSSL証明書を格納するための十分なメモリがないため、WiFiチップに書き込む必要があります。 これを行うには、ファームウェアバージョンWiFi101を更新します。 リンクからWifi101_FirmwareUpdater_windows.zipファイルをダウンロードします



Arduino IDEで、スケッチファイル-例-WiFi101-FirmwareUpdaterを開きます。 MRK1000を接続し、スケッチをロードします。 これで、Arduinoボードは証明書付きのファームウェアを受け取る準備ができました。

先ほどwinc1500-uploader-gui.exeをダウンロードして実行したzipアーカイブWifi101_FirmwareUpdater_windowsを解凍します。 ハブのホストアドレスを入力します。







COMポートをクリックして選択し、「証明書のアップロード」をクリックします







証明書がダウンロードされるのを待つことは残ります







Microsoft Azure IoT Hubは、 共有アクセス署名を使用します。

これらは、パスワードなしでIoT Hubメッセージキューを操作するために使用できるアクセス署名です。 SASトークンを作成する必要があります。 Arduinoコードでこれを行わないために、デバイスエクスプローラユーティリティを使用できます

リンクからSetupDeviceExplorer.msiファイルをダウンロードします

インストールして実行します。 IoT HubのAzureポータルに移動し、右上隅のキーをクリックします。







リストからiothubownerを選択し、「接続文字列-主キー」をコピーします







この行をデバイスエクスプローラーアプリケーションの[構成]ブックマークウィンドウに入力し、[更新]ボタンをクリックします。







[管理]タブに移動します。 ここで、新しいデバイスを追加できます。 [作成]ボタンをクリックし、デバイスのID(デバイスにmyDeviceという名前を付けました)を見つけて、[作成]をクリックします。







デバイスがリストに表示されます。 それを含む行を選択して、SAS Token ...をクリックします

日数を入力して、「生成」をクリックします。 結果のトークンから、「SharedAccessSignature sr =」で始まる部分のみが必要です(テキストSharedAccessSignatureが2回行に表示されるため、慎重にコピーしてください)







Device Explorerの使用方法に関する英語のマニュアルは次のとおりです。

IoT Hubデバイス用のデバイスエクスプローラーの使用方法





Arduinoコード



Arduinoコードを検討してください。 私たちのタイトルは:



#include <SPI.h>

#include <WiFi101.h>



char hostname[] = "alexey.azure-devices.net"; // Azure IoT Hub

char authSAS[] = "SharedAccessSignature sr=alexey.azure-devices.net%2fdevices%2fmyDevice&sig=D7OxGEm98bqAQDYk33d0DzPB92EuGMkjkzKBCsBBksc%3d&se=1493799405"; // SAS token, Device Explorer

String deviceName = "myDevice"; // ID

char ssid[] = "myhomenet"; // wi-fi

char pass[] = "password123"; //

String uri = "/devices/myDevice/messages/events?api-version=2016-02-03";

int status = WL_IDLE_STATUS; //

WiFiSSLClient client;







uri文字列は、データの送信と受信で異なります。

データを受信する場合、行は次のようになります

/デバイス/ myDevice /メッセージ/ devicebound?api-version = 2016-02-03

送信と受信に加えてメッセージを完了/拒否またはリセットすることができます。

セットアップでは、標準のWi-Fi接続のみを行います



void setup() {

Serial.begin(9600);

Serial.println("Setup begin");

// check for the presence of the shield:

if (WiFi.status() == WL_NO_SHIELD) {

Serial.println(" Arduino WiFi ");

while (true); //

}

// Wifi:

while ( status != WL_CONNECTED) {

Serial.print(" ");

Serial.println(ssid);

status = WiFi.begin(ssid, pass);

delay(10000); // 10

}

Serial.println("Connected to Wi-Fi");

}







HTTP経由でノードにPOSTリクエストを含むテキスト行を送信するメソッドが必要です。 わざわざ1行のテキストを送信することはありませんが、通常例ではjsonを生成して送信しています。



void httpPost(String content)

{

client.stop(); // ,

if (client.connectSSL(hostname, 443)) {

client.print("POST ");

client.print(uri);

client.println(" HTTP/1.1");

client.print("Host: ");

client.println(hostname);

client.print("Authorization: ");

client.println(authSAS);

client.println("Connection: close");

client.print("Content-Type: ");

client.println("text/plain");

client.print("Content-Length: ");

client.println(content.length());

client.println();

client.println(content);

delay(200);

} else {

Serial.println("HTTP POST ");

}

}







テキストの行を送信するには、メソッドを呼び出します



httpPost("Some message from Arduino");







しかし、データが安全に受信されるようにするための答えも考慮します



httpPost("Some message from Arduino");

String response = "";

char c;

while (client.available()) {

c = client.read();

response.concat(c);

}

if (!response.equals(""))

{

if (response.startsWith("HTTP/1.1 204")) {

Serial.println(" Azure");

} else {

Serial.println("");

Serial.println(response);

}

}







githubからダウンロードできるすべてのコード



IoT Hubメッセージキューからデータを読み取るコンソールアプリケーション



コンソールアプリケーションを作成します。

NuGetパッケージマネージャーを開き、 WindowsAzure.ServiceBusを探してインストールします。

名前空間のペアを追加します。



 using Microsoft.ServiceBus.Messaging; using System.Threading;
      
      





そして発表:



 static string connectionString = "HostName=alexey.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=xrzUfBj8gaq2i310MhRCcSEs08t3lk7zbCNI4Tltqp4="; static string iotHubD2cEndpoint = "messages/events"; static EventHubClient eventHubClient;
      
      





ここで、connectionString値を使用して、Azureポータルから受け取った値を入力したことに気付くことができます-これは「接続文字列-主キー」です 次のメソッドを追加します。



 private static async Task ReceiveMessagesFromDeviceAsync(string partition, CancellationToken ct) { var eventHubReceiver = eventHubClient.GetDefaultConsumerGroup().CreateReceiver(partition, DateTime.UtcNow); while (true) { if (ct.IsCancellationRequested) break; EventData eventData = await eventHubReceiver.ReceiveAsync(); if (eventData == null) continue; string data = Encoding.UTF8.GetString(eventData.GetBytes()); Console.WriteLine("Message received. Partition: {0} Data: '{1}'", partition, data); } }
      
      





最後に、Mainにコードを追加します。



 Console.WriteLine(" . Ctrl-C  .\n"); eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, iotHubD2cEndpoint); var d2cPartitions = eventHubClient.GetRuntimeInformation().PartitionIds; CancellationTokenSource cts = new CancellationTokenSource(); System.Console.CancelKeyPress += (s, e) => { e.Cancel = true; cts.Cancel(); Console.WriteLine("..."); }; var tasks = new List<Task>(); foreach (string partition in d2cPartitions) { tasks.Add(ReceiveMessagesFromDeviceAsync(partition, cts.Token)); } Task.WaitAll(tasks.ToArray());
      
      





このコンソールアプリケーションを実行すると、付属のArduinoボードから送信されたメッセージを読むことができます。



更新:このHTTPを使用した送信は理想からはほど遠いため、Arduino用のAzure IoT Hubライブラリと呼ばれるArduino SDKポートを使用することをお勧めします



便利なリンク:



.NETを使用してAzure IoTを開始する

HTTPを使用したMKR1000 Azure IoT Hubインターフェイス

MKR1000温度および湿度センサー



All Articles