Azure Event Hub Ingest; Universal App

image Azure Event Hub ist ein weiterer Service innhalb der Azure Service Bus Familie und ist konzipiert für den Daten Ingest mit hoher  Skalierung und Verfügbarkeit. Ein einzelner Event Hub kann z. B. Daten von bis zu 1 Mega Byte (!) pro Sekunde aufnehmen und für weitere Analyse bzw. Bearbeitung speichern.

Das Azure Service Bus SDK macht es einfach Daten in einen Event Hub zu posten bzw. diese zur weiteren Verarbeitung abzurufen. Verwendet man jedoch eine Universal App (Windows Phone, Windows Store App) steht das entsprechende SDK zum aktuellen Zeitpunkt nicht zur Verfügung. Dies stellt jedoch keine große Problematik dar, da Azure Event Hub für den Daten Ingest neben AMQP auch ein REST API zur Verfügung stellt. So kann mit einfachen HTTP Posts ebenfalls ein Daten Ingest durchgeführt werden.

Um den HTTP Post am Event Hub zu autorisieren, muss dieser im Header mit einer Shared Access Signature ausgestattet werden. Hierzu kann die beigefügte Methode CreateServiceBusSASToken() verwendet werden:

private string CreateServiceBusSASToken(string eventHubSASKeyName, string eventHubSASKey, string serviceBusUri)
{
    int expirySeconds = (int)DateTime.UtcNow.AddMinutes(20).Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
    string stringToSign = WebUtility.UrlEncode(serviceBusUri) + „n“ + expirySeconds.ToString();
    string signature = HmacSha256(eventHubSASKey, stringToSign);
    return String.Format(„sr={0}&sig={1}&se={2}&skn={3}“, WebUtility.UrlEncode(serviceBusUri), WebUtility.UrlEncode(signature), expirySeconds, eventHubSASKeyName);
}

public  string HmacSha256(string eventHubSASKey, string serviceBusUriExpiry)
{
    var keyStrm = CryptographicBuffer.ConvertStringToBinary(eventHubSASKey, BinaryStringEncoding.Utf8);
    var valueStrm = CryptographicBuffer.ConvertStringToBinary(serviceBusUriExpiry, BinaryStringEncoding.Utf8);

    MacAlgorithmProvider macAlgorithmProvider = MacAlgorithmProvider.OpenAlgorithm(MacAlgorithmNames.HmacSha256);
    CryptographicHash cryptographicHash = macAlgorithmProvider.CreateHash(keyStrm);
    cryptographicHash.Append(valueStrm);

    return CryptographicBuffer.EncodeToBase64String(cryptographicHash.GetValueAndReset());
}

Der vollständige Code um einen HTTP Post Ingest in EventHub durchzuführen, sieht folgendermaßen aus:

public async Task<bool> TelemetryIngest(Telemetry telemetry)
{

    string serviceBusNamespace = „iotmc-ns“;
    string serviceBusUri = string.Format(„{0}.servicebus.windows.net“, serviceBusNamespace);
    string eventHubName = „IoTMC“;
    string eventHubSASKeyName = „Device01“;
    string eventHubSASKey = „t0JK19v94H3R8yAZ1uVkGcIUFi8zmGmBts4N09aNI0s=“;

    using (HttpClient httpClient = new HttpClient())
    {
        httpClient.BaseAddress = new Uri(String.Format(„
https://{0}“, serviceBusUri));
        httpClient.DefaultRequestHeaders.Accept.Clear();

        string sBToken = CreateServiceBusSASToken(eventHubSASKeyName, eventHubSASKey, serviceBusUri);
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(„SharedAccessSignature“, sBToken);
        HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(telemetry), Encoding.UTF8);
        httpContent.Headers.ContentType = new MediaTypeHeaderValue(„application/json“);

        string ingestPath = String.Format(„/{0}/publishers/device01/messages“, eventHubName);
        var response =  await httpClient.PostAsync(ingestPath, httpContent);
        if (response.IsSuccessStatusCode)
        {
            return true;
        }

        return false;
    }
}

Mit Hilfe eines HTTP Post ist es einfach möglich, von einer Universal App, sowohl Windows Phone als auch Windows Store App, Daten an einen EventHub zu senden.

IoT; Themenschwerpunkt dotnetpro

dotnetpro 02/2015In der aktuellen dotnetpro findet sich ein Themenschwerpunkt rund um IoT (Internet of Things). Zum Thema durfte ich ebenfalls einen Artikel zusteuern, der die Funktionalität von Microsoft Azure Event Hubs näher beleuchtet. Im Artikel werden Code Snippets sowohl für den Ingest von Sensordaten als auch für die nachgelagerte Verarbeitung zur Verfügung gestellt. In der nächsten dotnetpro Ausgabe findet sich dann ein Folgeartikel, der erläutert, wie in einem IoT Szenario Ingest Daten mittels Azure Stream Analytics weiterverarbeitet werden können.

Wer noch einen Schritt weiter gehen möchte, findet unter meinem GitHub Account ein einfaches End-To-End Beispiel das als Grundlage für eigene IoT Anwendungen Verwendung finden kann. Nachfolgend eine Übersicht der jeweiligen Projekte im Repository:

MC_PowerShellScripts Anlage eines Azure Service Bus als Host Namespace für einen Event Hub mittels Powershell Script
MC_AdminConsole Anlage eines Azure Event Hub mit SAS Token für Daten Ingest von Sensoren. 
MC_SensorDotNet Daten Ingest in einen Event Hub von managed Code (C#) aus
MC_FieldGateway Daten Sammlung (http Server) + Daten Ingest in Event Hub in Node.js zur Ausführung auf einem Field Gateway
MC_SensorNetduino Daten Ingest von einem Netduino 2 Plus zum Field Gateway. Entwicklung und Debugging in VS 2013 möglich (!)
MC_EventConsumer Auslesen  von Daten aus einem Event Hub in managed Code (C#)
MC_EventConsumerAnalyse Auslesen und Verarbeiten bzw. Analyse von Daten aus einem Event Hub in managed Code (C#).
MC_StreamAnalytics Auslesen und Verarbeiten von Daten aus einem Event Hub bei Benützung von Azure Stream Analytics (identische Funktionalität wie MC_EventConsumerAnalyse)

Viel Spaß beim Entwickeln von eigenen IoT Lösungen.