Відправляємо дані з Arduino в Azure IoT Hub



Не так давно я став щасливим володарем Genuino MKR1000. Ресурс Hackster.io спільно з Microsoft проводив конкурс на найкращу ідею. Нехай я не встиг втілити свою ідею в життя і взяти участь у другій частині конкурсу, але я можу поділитися з вами інформацією, яка допоможе вам здійснити свої задуми. Під катом про те, як відправити дані з Arduino в хмару і як їх рахувати, якщо у вас є WiFi шилд або MKR1000.

Налаштування Azure

Заходимо на portal.azure.com натискаємо «+», вибираємо «Інтернет речей» — «IoT Hub» і придумуємо назву нашому хабу. Я вирішив назвати хаб просто і скромно – alexey. Цінову категорію я вибрав безкоштовну S1 (на один пристрій).



Власне, на цьому конфігурація хаба завершена. Необхідно ще отримати первинний ключ, але це можна зробити пізніше.

Налаштування Arduino

Встановимо необхідну бібліотеку WiFi101:



Нам необхідна версія вище ніж 0.8, так що якщо у вас вже встановлена стара бібліотека, то оновіть її.



Azure IoT Hub використовує SSL для безпеки підключення. Але так як у Arduino недостатньо пам'яті для того, щоб зберігати в ній сертифікат SSL, то нам необхідно записати його в чіп WiFi. Для цього потрібно оновити версію Firmware WiFi101. Викачуємо посилання файл Wifi101_FirmwareUpdater_windows.zip

Arduino IDE відкриваємо скетч Файл – Приклади – WiFi101 – FirmwareUpdater. Підключаємо MRK1000 і завантажуємо скетч. Тепер плата Arduino готова до отримання прошивки з сертифікатом.
Розпаковуємо zip архів Wifi101_FirmwareUpdater_windows, який ми нещодавно завантажили і запускаємо winc1500-uploader-gui.exe. Вводимо адресу сайту нашого хаба.



Клікаємо і виділяємо COM порт, після чого натискаємо «Upload certificate»



Залишається дочекатися завантаження сертифіката



Microsoft Azure IoT Hub використовує Shared Access Signatures.
Це сигнатури доступу, які можуть бути використані для роботи з чергою повідомлень IoT Hub-а без пароля. Нам необхідно створити SAS token. Для того щоб не робити це в коді Arduino можна використовувати утиліту Device Explorer
Викачуємо посилання файл SetupDeviceExplorer.msi
Встановлюємо і запускаємо. Заходимо на портал Azure IoT Hub і натискаємо на ключик у правому верхньому кутку:



Вибираємо зі списку iothubowner і копіюємо Рядок підключення – первинний ключ»



Цю рядок вводимо в вікно закладки Configuration програми Device Explorer і натискаємо кнопку Update



Переходимо на закладку Management. Тут ми можемо додати новий пристрій. Кнопка Create, придумуємо ID нашого девайсу (я назвав свій пристрій myDevice) і натискаємо Create.



У списку з'явиться наш пристрій. Виділяємо рядок з ним і натискаємо SAS Token…
Вводимо проміжок днів і натискаємо Generate. З отриманого сертифіката нам потрібна тільки частина починається з «SharedAccessSignature sr=» (копіюйте акуратно, так як текст SharedAccessSignature зустрічається у рядку 2 рази)



Англомовний мануал про те, як користуватися Device Explorer знаходиться тут:
How to use Device Explorer for IoT Hub devices


Код 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 буде різна для відправки і отримання даних.
Якщо б ми отримували дані, то рядок була б
/devices/myDevice/messages/devicebound?api-version=2016-02-03
Крім відправки і одержання існує можливість завершити/відхилити або скинути повідомлення.
В setup ми тільки робимо стандартне підключення до мережі 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");
 
}
 

Нам потрібен метод, який буде відправляти рядок тексту запитом POST по протоколу HTTP на наш сайт. Я не заморочуюся і відправляю рядок тексту, хоча зазвичай в прикладах генерують і відправляють 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©;
 
}
 
if (!response.equals("")) 
 
{
 
if (response.startsWith("HTTP/1.1 204")) {
 
Serial.println("Рядок була відправлена в Azure"); 
 
} else {
 
Serial.println("Помилка");
 
Serial.println(response);
 
}
 
}
 

Весь код ви можете завантажити github

Консольний додаток, що зчитує дані з черги повідомлень IoT Hub

Створюємо консольний додаток.
Відкриваємо NuGet Package Manager, шукаємо WindowsAzure.ServiceBus і встановлюємо.
Додаємо пару namespace:

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 in partition d2cPartitions)
{
tasks.Add(ReceiveMessagesFromDeviceAsync(partition, cts.Token));
} 
Task.WaitAll(tasks.ToArray());

Якщо ви запустите це консольний додаток, то зможете вважати повідомлення, надіслані включеної платою Arduino.

Корисні посилання:

Приступаючи до роботи з центром Azure IoT з використанням .NET
MKR1000 Azure IoT Hub Interface Using HTTP
MKR1000 Temp and Humidity Sensor

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.