2016-10-27 4 views
0

우리는 bpm180 센서와 라즈베리 PI3을 가지고 우리는이개체 참조가 개체의 인스턴스로 설정되지 않았습니다. TPM 장치 클라이언트로 메시지를 보낼 때

TpmDevice myDevice = new TpmDevice(0); // Use logical device 0 on the TPM 
       string hubUri = myDevice.GetHostName(); 
       string deviceId = myDevice.GetDeviceId(); 
       string sasToken = myDevice.GetSASToken(); 

       deviceClient = DeviceClient.Create(
        hubUri, 
        Microsoft.Azure.Devices.Client.AuthenticationMethodFactory. 
         CreateAuthenticationWithToken(deviceId, sasToken), Microsoft.Azure.Devices.Client.TransportType.Amqp); 

같은 연결을 initializze 그리고 우리는이 같은 메시지를 보낼 :

public async void Bpm180Tick(object state) 
     { 
      string temperatureText; 
      try 
      { 
       var sensorData = await _bmp180.GetSensorDataAsync(Bmp180AccuracyMode.UltraHighResolution); 
       temperatureText = sensorData.Temperature.ToString(""); 
       temperatureText += "°C"; 
       var temperatureDataPoint = new 
       { 
        deviceId = Global.GlobalTemperature, 
        valor = sensorData.Temperature, 
        fecha = DateTime.Now 
       }; 
       //// actualizaciones de la interfaz de usuario... deben ser invocados en el subproceso de interfaz de usuario 
       var messageString = JsonConvert.SerializeObject(temperatureDataPoint); 
       var message = new Microsoft.Azure.Devices.Client.Message(Encoding.ASCII.GetBytes(messageString)); 
       //message.Properties["Ambiente"] = ambiente; 
       //autoResetEvent.WaitOne(); 
       await deviceClient.SendEventAsync(message); 
       //autoResetEvent.Set(); 
       var task = this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
       { 
        Txt_Temperaura.Text = temperatureText; 
       }); 
      } 
      catch (Exception ex) 
      { 
       var a = ex.StackTrace; 
       temperatureText = "Sensor Error: " + ex.Message; 
      } 


     } 

그러나 우리가 점점 objecct 참조하지만, 오류가 보이는 것은 라이브러리 (SDK)에있을, 아니 우리의 코드에

스택 추적은 thisÑ

at Microsoft.Azure.Devices.Client.Transport.AmqpTransportHandler.<SendAmqpMessageAsync>d__27.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.Azure.Devices.Client.Transport.AmqpTransportHandler.<SendEventAsync>d__19.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.Azure.Devices.Client.Transport.ErrorDelegatingHandler.<>c__DisplayClass13_0.<<ExecuteWithErrorHandlingAsync>b__0>d.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.Azure.Devices.Client.Transport.ErrorDelegatingHandler.<ExecuteWithErrorHandlingAsync>d__14`1.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.Azure.Devices.Client.Transport.GateKeeperDelegatingHandler.<SendEventAsync>d__11.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.GetResult() 
    at ActiveSense.Tempsense.Sensor.MainPage.<Bpm180Tick>d__23.MoveNext() 
+0

예외가 발생한 줄은 무엇입니까? –

+0

이벤트를 비동기로 보내는 라인. –

답변

1

비동기 코드가 실행될 때까지 temperatureText가 더 이상 존재하지 않을 수도 있습니다. 나는 먼저 정적 클래스 변수로 만들고 어떤 일이 일어나는지 살펴볼 것입니다.

+0

디버깅 중이며 존재하지 않습니다. – gina

+0

변수가 클로저에 캡처되고 계속 유효합니다. – arturl

1

대부분의 경우 SAS 토큰이 만료되었지만 AMQP 라이브러리가 도움이되는 오류를 제공하지 않습니다. 이를 확인하기 위해, SharedAccessKey와 연결 문자열을 사용

DeviceClient.CreateFromConnectionString("...;SharedAccessKey=xyz;...", TransportType.Amqp); 

을 그 작동하는 경우, 당신은 당신의 SAS 토큰을 갱신으로 볼 필요 (제품 코드에 SharedAccessKey을 두지 않습니다!). 동일한 오류가 발생하면 문제는 코드의 다른 부분에서 발생합니다.

1

SAS 토큰이 만료되었을 수 있습니다.

반면 Azure-IoT-SDK는 오픈 소스이기 때문에 sdk 소스 코드를 직접 참조하여 오류를 확인할 수 있습니다.

  1. 는 저장소 나란히 프로젝트
  2. 참조하는 Microsoft.Azure.Devices과 프로젝트 nuget 참조 "Microsoft.Azure.Devices.Client"
  3. 복제 푸른-IOT-SDK를 제거합니다. 프로젝트의 Client.WinRT.

AmqpTransportHandler.SendAmqpMessageAsync 소스 코드를 디버깅하여 문제가 실제로 무엇인지 확인할 수 있어야합니다.

은 나 자신은 윈도우의 IoT 코어 14393.

+0

많은 정보 주셔서 감사합니다. –

0

내가 문제와에 대한 풀 요청을 고정을 제기 TPM 라이브러리에 버그가 있기 때문에이 문제가 발생와 RPi3에 문제를 재현 운이 없어. https://github.com/ms-iot/security/issues/11

는 SAS 토큰 즉시 만료 : 여기

이 문제에 대한 링크입니다. IoT Hub가 일부 시계 왜곡을 허용하기 때문에 잠시 동안 작동하는 유일한 이유입니다. 아직 NuGet에서 Microsoft.Devices.Tpm의 새로운 버전을 기다리고 있습니다.