Quantcast
Channel: かずきのBlog@hatena
Viewing all articles
Browse latest Browse all 1387

UWPでAzureのイベントハブにデータを突っ込む

$
0
0

抱かれたい男No1様にとてもお世話になりました。

Windows 10 IoT Core(UWP)でSASトークンを生成buchizo.wordpress.com

ServiceBusの名前空間をokazukihub-nsで作成して、イベントハブ名をokazukihubで作成して、送信の権限を持った口をInputという名前で作りました。ここに、データを突っ込むコードは以下のようになりました。

private async void button_Click(object sender, RoutedEventArgs e)
{
    var client = new HttpClient();
    var content = new ObjectContent<DeviceInfo>(new DeviceInfo
        {
            Id = 0,
            Value = 100,
        },
        new JsonMediaTypeFormatter());

    var sas = this.CreateToken("https://okazukihub-ns.servicebus.windows.net/okazukihub/messages", "Input", "p6U8m6dqSEsCb+3McnCOwsb8L7mcIm0tWmhVIL0u8vg=");
    client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", sas);
    content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/atom+xml")
    {
        CharSet = "utf-8",
    };
    content.Headers.ContentType.Parameters.Add(new System.Net.Http.Headers.NameValueHeaderValue("type", "entry"));
    var result = await client.PostAsync("https://okazukihub-ns.servicebus.windows.net/okazukihub/messages", content);
}

privatestring CreateToken(string resourceUri, string keyName, string key)
{
    TimeSpan sinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1);
    var expiry = Convert.ToString((int)sinceEpoch.TotalSeconds + 3600); //EXPIRES in 1h string stringToSign = WebUtility.UrlEncode(resourceUri) + "\n" + expiry;
    var signature = ComputeSignature(stringToSign, key);
    var sasToken = String.Format(CultureInfo.InvariantCulture,
        "SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}",
        WebUtility.UrlEncode(resourceUri), WebUtility.UrlEncode(signature), expiry, keyName);

    return sasToken;
}

publicstring ComputeSignature(string content, string key, BinaryStringEncoding encoding = BinaryStringEncoding.Utf8)
{
    var algorithmProvider = MacAlgorithmProvider.OpenAlgorithm(MacAlgorithmNames.HmacSha256);
    var contentBuffer = CryptographicBuffer.ConvertStringToBinary(content, encoding);
    var keyBuffer = CryptographicBuffer.ConvertStringToBinary(key, encoding);
    var signatureKey = algorithmProvider.CreateKey(keyBuffer);
    var signedBuffer = CryptographicEngine.Sign(signatureKey, contentBuffer);
    return CryptographicBuffer.EncodeToBase64String(signedBuffer);
}

下の2メソッドは抱かれたい男No1様のページのコードになります。ボタンクリックで各種データを作ってサーバーに投げています。DeviceInfoクラスは、自作のIdとValueだけもったクラスになります。

ちょっとはまったのがAuthorizationヘッダーの設定がなかなかうまくいかなかった点です。HttpContent(ObjectContent)のHeadersに追加するとうまく追加できなくて、HttpCLientのDefaultRequestHeadersに追加するとうまくいきました。謎い。

client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", sas);

これで次のステップに進める…。


Viewing all articles
Browse latest Browse all 1387

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>