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温度および湿度センサー

Source: https://habr.com/ru/post/J282912/


All Articles