Одним из самых дорогих сервисов в стандартном IoT решении от Azure является Stream Analytic. Для того, чтобы обойти этот дорогой сервис, больше подходящий для разработки Enterprise решений можно воспользоваться возможностями Azure Functions.
Как можно создать IoT хаб и подключить к нему Arduino я уже писал раньше. Теперь, давайте удешевим решение. Заменим Stream Analytic на Azure Functions.
Под катом вы найдете мануал How-To
Сначала зайдем в конечные точки нашего IoT хаба и возьмем из конечной точки под названием Events имя совместимое с концентратором событий.
Скопируем и сохраним. Понадобится позднее.
Теперь создадим новую функцию
Планом размещения экономнее будет выбрать «План потребления», если количество вызовов вашей функции не особо велико. Стоимость 20 центов за миллион запусков функции.
Далее создаем пользовательскую функцию типа IoT Hub (Event Hub)
В качестве языка я выбрал C#, но вы можете выбрать другой более близкий вам язык
В строку Event Hub name вводим то значение, которое мы скопировали из IoT Hub.
Кликнув на «новое» задаем значение подключению.
Следующий код будет автоматически создан в качестве шаблонного кода функции:
using System;
public static void Run(string myIoTHubMessage, TraceWriter log)
{
log.Info($"C# IoT Hub trigger function processed a message: {myIoTHubMessage}");
}
Запустим функцию и включим девайс из прошлой статьи. Если все настроено верно, то в окне журнала получим следующий лог:
2017-12-17T16:20:40.486 Function started (Id=63b0dbda-1624-4e2c-b381-47442e69b853)
2017-12-17T16:20:40.486 C# IoT Hub trigger function processed a message: {«deviceId»:«ArduinoAzureTwin», «iotdata»:581}
2017-12-17T16:20:40.486 Function completed (Success, Id=63b0dbda-1624-4e2c-b381-47442e69b853, Duration=0ms)
Функция работает, но нам необходимо сохранить данные в базу данных. В качестве базы данных я использую базу SQL Server. Вы же можете использовать какой-либо другой тип базы данных. Зайдем в существующую базу данных или создадим новую. В пункте меню «Строки подключения» возьмем строку ADO.NET.
Теперь в нашей функции заходим в «Параметры приложения».
Мы ведь не собираемся хранить нашу строку подключения в коде C#? Сохраняем ее в строках подключения приложения, не забывая изменить логин и пароль.
Теперь осталось изменить нашу функцию, чтобы она могла записать данные из JSON в базу данных. Довольно стандартный вариант кода выглядит так:
#r "System.Configuration"
#r "System.Data"
#r "Newtonsoft.Json"
using System;
using System.Configuration;
using System.Data.SqlClient;
using System.Threading.Tasks;
using System.Net;
using Newtonsoft.Json;
public static async Task Run(string myIoTHubMessage, TraceWriter log)
{
log.Info($"Message: {myIoTHubMessage}");
var e = JsonConvert.DeserializeObject<EventData>(myIoTHubMessage);
var str = ConfigurationManager.ConnectionStrings["SQLServerDB_connection"].ConnectionString;
using (SqlConnection conn = new SqlConnection(str))
{
conn.Open();
var text = "INSERT INTO [dbo].[SensorData] (DeviceName, SensorValue) Values (@deviceId, @iotdata);";
using (SqlCommand cmd = new SqlCommand(text, conn))
{
cmd.Parameters.AddWithValue("@iotdata", e.iotdata);
cmd.Parameters.AddWithValue("@deviceId", e.deviceId);
var result = await cmd.ExecuteNonQueryAsync();
log.Info($"Inserted: {result.ToString()}");
}
}
}
public class EventData
{
public string deviceId { get; set; }
public int iotdata { get; set; }
}
В результате мы довольно быстро получили облачное IoT решение снимающее данные с устройства и сохраняющее их в облачную базу данных. Дополнительно можно создать бесплатное Azure Web App приложение для визуализации данных.
Цена решения — чуть больше чем стоимость базы данных. То есть, если использовать базу размером 2 Gb, то получится чуть больше 5-ти долларов в месяц. Ничто нам не мешает использовать какую-то другую облачную базу данных или даже какую-то локальную базу, расположенную на вашем сервере.