Microsoft Developer Roadshow Dec 2015 – Azure IoT

Microsoft Developer Roadshow Dec 2015 – Azure IoT
december 3, 2015 Kristofer Nissbrandt

Azure är utan tvekan en av Microsofts stora utvecklarsatsningar. Så i decembers upplaga av Developer Roadshow så var det Azure som gällde, tillsammans med det “nya” buzzwordet IoT(Internet of Things). För de som inte har koll på Azure så det Microsofts molnplattform. Dagen var uppdelad i 2 pass, en generell introduktionsworkshop om Azure och en IoT lab om hur man kopplar upp en Raspberry Pi 2 till Azure. Jag kommer att fokusera på det senare passet.

Sensors everywhere!!

Uppgiften i IoT workshopen var att använda en Raspberry för att mäta temperatur och ljusstyrka som man sedan skickade upp till Azure. Ett typiskt IoT sensor scenario. För att realisera detta så körde vi Windows 10 IoT Core på Raspberryn med en GHI Electronics FEZ HAT shield. FEZ HAT är ett addon till Raspberryn som har full support för IoT Core och har bra drivrutiner i C#. För att komma igång med Windows 10 IoT Core så är det enklast gå till https://dev.windows.com/en-us/iot.

DSC_1135

FEZ HAT var lätt att komma igång med. Man börjar med att skapa ett Universal App projekt i Visual Studio. Därefter så installerar man GHI Drivrutinerna via nuget.

Package Manager Console

PM> Install-Package GHIElectronics.UWP.Shields.FEZHAT

För att koppla upp för hämta ut temperatur och ljus så räcker det med koden nedan.

Kodexempel FEZ HAT

using GHIElectronics.UWP.Shields;
...
FEZHAT hat = await FEZHAT.CreateAsync();

var currentTemperature = hat.GetTemperature();
var currentLightLevel = hat.GetLightLevel();

Azure Event Hub

Den andra delen av workshopen var att konsumera datan som Raspberryn gav ifrån sig. För detta använde vi flera av Azures SaaS komponenter. Eftersom vi inte hade något krav på att kunna kontrollera våran enhet från Azure så körde vi med Azure Event Hub. Event Hub är en form av kö som dit man kan skicka events för temporär lagring, inte helt olikt konceptet Event Sourcing. Hubben sparar events i 24 timmar om man kör med standardinställningarna.

I Azure finns det mängder med tjänster man kan koppla ihop med Event Hub. Om man vill koppla upp sig i kod så finns det ett trevligt nuget paket man kan använda.

Package Manager Console

PM> Install-Package Microsoft.Azure.ServiceBus.EventProcessorHost 

En mycket intressant feature med Event Hub är att meddelandena inte försvinner när man konsumerar dem. För att hantera detta så finns koncepten Consumer Groups och Checkpoints.
I koden nedan så använder vi EventProcessorHost paketet för att koppla upp oss mot Azure. Här måste man ange sin Consumer Group och ett Storage Account för uppkopplingen. Till host instansen registrerar vi sedan vår implementation av en EventProcessor.

Kodexempel Event Hub 1

var eventProcessorHost = new EventProcessorHost(
    "Namn på din ProcessorHost, 
    "Namn på din Event Hub",
    "Namn då din ConsumerGroup",
    "Azure ServiceBus ConnectionString",
    "Azure StorageAccount ConnectionString");

// Registrerar EventProcessorn
eventProcessorHost.RegisterEventProcessorAsync<EventProcessor>().Wait();
...
eventProcessorHost.UnregisterEventProcessorAsync().Wait();

StorageAccount används för att spara ner Checkpoints för vår angivna Consumer Group. Checkpoints är ett sparat state för vilken position i meddelandeflödet som har lästs av en specifik Consumer Group. I koden nedan har jag implementerat en EventProcessor(Interfacet IEventProcessor finns i EventProcessorHost paketet). Metoden CloseAsync används av EventProcessorHost när man avregistrerar EventProcessorn. Så i fallet nedan så vill jag sätta en Checkpoint i Azure när jag stänger ner min applikation. Nästa gång vi startar upp applikationen så fortsätter den från samma position i meddelandeflödet.

Kodexempel Event Hub 2

public class EventProcessor : IEventProcessor
{
 public async Task OpenAsync(PartitionContext context) 
 {
  // Startup kod...
 }

 public async Task CloseAsync(PartitionContext context, CloseReason reason)
 {
  if (reason == CloseReason.Shutdown)
  {
   await context.CheckpointAsync();
  }
 }

 public async Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)
 {
   // Hantera dina meddelande här...
 }
}

Azure Stream Analytics

En annan trevlig teknik som användes var Stream Analytics. Det är en tjänst där man kan använda SQL Query liknande syntax för att selektera, filtrera och gruppera data på en dataström. Så i ena änden konfigurera man en input för att konsumera meddelanden från vår Event Hub. Den kopplar man upp på liknade sätt som i kodexemplet ovan, dvs mot en Consumer Group, Event Hub namn och Service Bus inställningar. I output så kopplar man på en annan tjänst eller endpoint som ska få de behandlade meddelanden.

I IoT labben så använde vi Stream Analytics för aggregera över eventströmen som kom från Raspberryn. Vi använde en query för att samla ihop de senaste 10 värdena till ett medelvärde över både temperatur och ljusstyrka. Det skickades senare till en Power BI instans, vilket är Microsofts molnbaserade Business Intelligence lösning.

Stream Analytics Query

SELECT
    displayname,
    location,
    guid,
    measurename,
    unitofmeasure,
    MAX(timecreated) timecreated,
    Avg(value) AvgValue
INTO
    [PowerBI]
FROM
    [TelemetryHUB] TIMESTAMP by timecreated
GROUP BY 
    displayname, location, guid, measurename, unitofmeasure, 
    TumblingWindow(Second, 10)

DSC_1137

Tankar om eventet

Även om jag bara var på IoT-delen av eventet så tyckte jag att det var riktigt bra och lärorikt. Ett bra trovärdigt problem och lösning. En liten intressant notis var att under passet så släppte Microsoft den nya Azure Portalen i General Availability (https://portal.azure.com/). En rejäl ökning i prestanda och responsivitet.

0 Kommentarer

Lämna ett svar

E-postadressen publiceras inte. Obligatoriska fält är märkta *

*

Denna webbplats använder Akismet för att förhindra skräppost. Lär sig hur dina kommentardata behandlas.