0

bpm180センサーを備えたラズベリーpi3があり、このように接続を初期化します

 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);

そして、次のようなメッセージを送信します。

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;
            }


        }

ただし、オブジェクト参照を取得していますが、エラーはコードではなくライブラリ(sdk)にあるようです

スタック トレースはこれです。

  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()
4

4 に答える 4

1

SAS トークンの有効期限が切れる可能性があります。

一方、Azure-IoT-SDKs はオープン ソースであるため、SDK のソース コードを直接参照してエラーを確認できます。

  1. プロジェクトのナゲット参照「Microsoft.Azure.Devices.Client」を削除します
  2. プロジェクトと並んで azure-iot-sdks リポジトリを複製する
  3. プロジェクトで Microsoft.Azure.Devices.Client.WinRT を参照します。

AmqpTransportHandler.SendAmqpMessageAsync ソース コードをデバッグして、実際の問題を確認できるはずです。

私自身、Windows IoT Core 14393 を搭載した RPi3 であなたの問題を再現できませんでした。

于 2016-11-01T03:10:30.470 に答える
1

非同期コードが実行されるまでに temperatureText が存在しなくなる可能性があるのではないかと思います。最初にそれを静的クラス変数にしてみて、何が起こるか見てみます。

于 2016-10-27T17:24:22.927 に答える