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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *