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. 删除您的项目 nuget 参考“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

SAS 令牌很可能已过期,但 AMQP 库没有为您提供有用的错误。要确认这一点,请使用带有 SharedAccessKey 的连接字符串:

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

如果可行,您需要考虑更新您的 SAS 令牌(不要将 SharedAccessKey 留在产品代码中!)。如果这给您同样的错误,则问题出在代码的其他地方。

于 2016-10-28T18:48:48.623 回答
1

我想知道在异步代码运行时 temperatureText 是否可能不再存在。我会首先尝试将其设为静态类变量,然后看看会发生什么。

于 2016-10-27T17:24:22.927 回答
0

发生这种情况是因为 TPM 库中有一个错误,我提交了一个问题并修复了拉取请求。

这是该问题的链接:https ://github.com/ms-iot/security/issues/11

SAS 令牌立即过期。它工作一段时间的唯一原因是物联网中心允许一些时钟偏差。我仍在等待 NuGet 上的新版本 Microsoft.Devices.Tpm。

于 2017-02-02T20:21:51.143 回答