
少し前に、私は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温度および湿度センサー