2017-09-06 3 views
0

このjsonファイルを自分のIotHubからAzureBlobストレージにアップロードする必要があります。 これまでのところ、IoT HUbにリンクされたストレージアカウントとコンテナがあります。 私は3つのプラットフォームプロジェクト(Android、iOS、UWP)にリンクされたPCLプロジェクトを持っています。 私のPCLプロジェクトでは、テレメトリデータを送信するdeviceClientがあります。Azureにファイルをアップロードする方法Xamarin PCLプロジェクトからIOTハブを介してBlobストレージ

私はhttps://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-csharp-csharp-file-upload

private static async void SendToBlobAsync() 
{ 
    string fileName = "data.json"; 
    Console.WriteLine("Uploading file: {0}", fileName); 
    var watch = System.Diagnostics.Stopwatch.StartNew(); 

    using (var sourceData = new FileStream(@"image.jpg", FileMode.Open)) 
    { 
     await deviceClient.UploadToBlobAsync(fileName, sourceData); 
    } 

    watch.Stop(); 
    Console.WriteLine("Time to upload file: {0}ms\n",batch.ElapsedMilliseconds); 
} 

からのコードのこの部分を使用してみました。しかし、私はインテリセンスのメソッド「UploadToBlobAsync」を得ることはありません。

私はVS2017を使用しています。

NuGetパッケージを追加しました:Microsoft.Azure.Devices.Client.PCL

私IOTHubHelperクラスはMicrosoft.Azure.Devices.Clientへの参照を持っています。 Microsoft.Azure.Devices.Client.PCL

をしかし、私はインテリセンスのメソッド "UploadToBlobAsync" を得ることはありません:

答えて

0

NuGetパッケージを追加しました。 Microsoft.Azure.Devices.ClientためsrouceコードAzure/azure-iot-sdk-csharpとして

DeviceClient.cs次のように定義される:

#if !PCL 
     /// <summary> 
     /// Uploads a stream to a block blob in a storage account associated with the IoTHub for that device. 
     /// If the blob already exists, it will be overwritten. 
     /// </summary> 
     /// <param name="blobName"></param> 
     /// <param name="source"></param> 
     /// <returns>AsncTask</returns> 
     public Task UploadToBlobAsync(String blobName, System.IO.Stream source) 
     { 
      if (String.IsNullOrEmpty(blobName)) 
      { 
       throw Fx.Exception.ArgumentNull("blobName"); 
      } 
      if (source == null) 
      { 
       throw Fx.Exception.ArgumentNull("source"); 
      } 
      if (blobName.Length > 1024) 
      { 
       throw Fx.Exception.Argument("blobName", "Length cannot exceed 1024 characters"); 
      } 
      if (blobName.Split('/').Count() > 254) 
      { 
       throw Fx.Exception.Argument("blobName", "Path segment count cannot exceed 254"); 
      } 

      HttpTransportHandler httpTransport = null; 

#if !WINDOWS_UWP 
      //We need to add the certificate to the fileUpload httpTransport if DeviceAuthenticationWithX509Certificate 
      if (this.Certificate != null) 
      { 
       Http1TransportSettings transportSettings = new Http1TransportSettings(); 
       transportSettings.ClientCertificate = this.Certificate; 
       httpTransport = new HttpTransportHandler(null, iotHubConnectionString, transportSettings); 
      } 
      else 
      { 
       httpTransport = new HttpTransportHandler(iotHubConnectionString); 
      } 
#else 
      httpTransport = new HttpTransportHandler(iotHubConnectionString); 
#endif 
      return httpTransport.UploadToBlobAsync(blobName, source); 
     } 
#endif 

注:UploadToBlobAsync機能はPCLライブラリでサポートされていないが。 PCLを.NET標準ライブラリに移行し、Azure BlobストレージにファイルをアップロードするためにMicrosoft.Azure.Devices.Clientを使用すると仮定しました。さらに、.NET標準のXamarin.Forms Appsを構築することについては、tutorialに従うことができます。

0

メソッドMicrosoft.Azure.Devices.Client.DeviceClient.UploadToBlobAsyncは、基本的に、Azure IoT Hub経由でBLOBアップロードセッションのREST API呼び出しをラッパーします。このセッションのシーケンスは、 ステップ1のような3つのステップに分かれています。 Azure IoT Hub(公開セッション)からアップロード情報のリファレンスを入手してください ステップ2。受信した参照情報に基づいてブロブをアップロードする ステップ3。アップロードプロセスの結果を投稿するセッションを閉じます。

次のコードスニペットは、PCLプロジェクトで実現上記の手順の一例を示す:許可ヘッダの

private async Task UploadToBlobAsync(string blobName, Stream source, string iothubnamespace, string deviceId, string deviceKey) 
    { 
     using(HttpClient client = new HttpClient()) 
     { 
      // create authorization header 
      string deviceSasToken = GetSASToken($"{iothubnamespace}.azure-devices.net/devices/{deviceId}", deviceKey, null, 1); 
      client.DefaultRequestHeaders.Add("Authorization", deviceSasToken); 

      // step 1. get the upload info 
      var payload = JsonConvert.SerializeObject(new { blobName = blobName }); 
      var response = await client.PostAsync($"https://{iothubnamespace}.azure-devices.net/devices/{deviceId}/files?api-version=2016-11-14", new StringContent(payload, Encoding.UTF8, "application/json"));     
      var infoType = new { correlationId = "", hostName = "", containerName = "", blobName = "", sasToken = "" }; 
      var uploadInfo = JsonConvert.DeserializeAnonymousType(await response.Content.ReadAsStringAsync(), infoType); 

      // step 2. upload blob 
      var uploadUri = $"https://{uploadInfo.hostName}/{uploadInfo.containerName}/{uploadInfo.blobName}{uploadInfo.sasToken}"; 
      client.DefaultRequestHeaders.Add("x-ms-blob-type", "blockblob"); 
      client.DefaultRequestHeaders.Remove("Authorization"); 
      response = await client.PutAsync(uploadUri, new StreamContent(source)); 

      // step 3. send completed 
      bool isUploaded = response.StatusCode == System.Net.HttpStatusCode.Created; 
      client.DefaultRequestHeaders.Add("Authorization", deviceSasToken); 
      payload = JsonConvert.SerializeObject(new { correlationId = uploadInfo.correlationId, statusCode = isUploaded ? 0 : -1, statusDescription = response.ReasonPhrase, isSuccess = isUploaded }); 
      response = await client.PostAsync($"https://{iothubnamespace}.azure-devices.net/devices/{deviceId}/files/notifications?api-version=2016-11-14", new StringContent(payload, Encoding.UTF8, "application/json")); 
     } 
    } 

我々はsasTokenを必要とするので、次のコードは、その実装を示しています。

private string GetSASToken(string resourceUri, string key, string keyName = null, uint hours = 24) 
    { 
     var expiry = Convert.ToString((int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds + 3600 * hours); 
     string stringToSign = System.Net.WebUtility.UrlEncode(resourceUri) + "\n" + expiry; 
     HMACSHA256 hmac = new HMACSHA256(Convert.FromBase64String(key)); 

     var signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign))); 
     var sasToken = keyName == null ? 
      String.Format(CultureInfo.InvariantCulture, "SharedAccessSignature sr={0}&sig={1}&se={2}", System.Net.WebUtility.UrlEncode(resourceUri), System.Net.WebUtility.UrlEncode(signature), expiry) : 
      String.Format(CultureInfo.InvariantCulture, "SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}", System.Net.WebUtility.UrlEncode(resourceUri), System.Net.WebUtility.UrlEncode(signature), expiry, keyName); 
     return sasToken; 
    } 

上記の実装では、手順2の再試行メカニズムは処理されません。

関連する問題