簡體   English   中英

你調用的對象是空的。 使用TPM設備客戶端發送消息時

[英]Object reference not set to an instance of an object. when sending messages with TPM Device client

我們有一個帶有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;
            }


        }

但是我們正在獲取和objecct參考,但是錯誤似乎在庫(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()

我想知道在異步代碼運行時,是否可能不存在temperatureText。 我首先嘗試使其成為靜態類變量,然后看看會發生什么。

SAS令牌很可能已過期,但是AMQP庫沒有給您帶來有用的錯誤。 要確認這一點,請使用帶有SharedAccessKey的連接字符串:

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

如果可行,則需要考慮更新SAS令牌(不要將SharedAccessKey留在產品代碼中!)。 如果那給您同樣的錯誤,則問題出在代碼的其他地方。

SAS令牌可能會過期。

另一方面,由於Azure-IoT-SDK是開源的,因此您可以直接引用sdk源代碼來檢查錯誤。

  1. 刪除項目nuget參考“ Microsoft.Azure.Devices.Client”
  2. 與您的項目並排克隆azure-iot-sdks存儲庫
  3. 在您的項目中引用Microsoft.Azure.Devices.Client.WinRT。

您應該能夠調試AmqpTransportHandler.SendAmqpMessageAsync源代碼,以查看問題的實質。

我本人沒有運氣用Windows IoT核心版14393在RPi3上重現您的問題。

發生這種情況是因為TPM庫中存在一個錯誤,我提出了一個問題並修復了請求請求。

這是問題的鏈接: https : //github.com/ms-iot/security/issues/11

SAS令牌立即過期。 它之所以能夠工作一段時間的唯一原因是因為IoT中心允許一些時鍾偏斜。 我仍在等待NuGet上Microsoft.Devices.Tpm的新版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM