none
VS2017で.NETを使用してデバイスをIoT Hubに接続することができない RRS feed

  • 質問

  • https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-csharp-csharp-getstarted

    このURLで説明されているように進めています。サンプルアプリはページ上部のGithubから複製したものを実行しています。

    「デバイスアプリの作成」セクションのSimulatedDeviceプロジェクトの、Program.csファイル内において、60行目前後にある、

                    await deviceClient.SendEventAsync(message);

    下線を引いた部分でエラーが出ます。「現在のコンテキストに'deviceClient'という名前は存在しません」というエラーが出ます。

    URLで支持されている、Microsoft.Azure.Device.ClientなどのNuGetパッケージはインストールしました。

    このURL以外のページで紹介されているサンプルを実行する際にも同じエラーが出ます。VSの機能で何か不足しているものがあるのでしょうか。それともコードで足りない部分があるのでしょうか。

    namespace SimulatedDevice
    {
        using System;
        using System.Text;
        using System.Threading.Tasks;
        using Microsoft.Azure.Devices.Client;
        using Newtonsoft.Json;
    
        public class Program
        {
            private const string IotHubUri = "UltraSonic.azure-devices.net";
            private const string DeviceKey = "RrYDtnJNyHWavxWmlc60AvRJa0nnWM/603pp3XjCG3s=";
            private const string DeviceId = "myFirstDevice";
            private const double MinTemperature = 20;
            private const double MinHumidity = 60;
            private static readonly Random Rand = new Random();
            private static DeviceClient _deviceClient;
            private static int _messageId = 1;
    
            private static async void SendDeviceToCloudMessagesAsync()
            {
                double minTemperature = 20;
                double minHumidity = 60;
                Random rand = new Random();
    
                while (true)
                {
                    double currentTemperature = minTemperature + rand.NextDouble() * 15;
                    double currentHumidity = minHumidity + rand.NextDouble() * 20;
    
                    var telemetryDataPoint = new
                    {
                        deviceId = "myFirstDevice",
                        temperature = currentTemperature,
                        humidity = currentHumidity
                    };
                    var messageString = JsonConvert.SerializeObject(telemetryDataPoint);
                    string levelValue;
    
                    if (rand.NextDouble() > 0.7)
                    {
                        if (rand.NextDouble() > 0.5)
                        {
                            messageString = "This is a critical message";
                            levelValue = "critical";
                        }
                        else
                        {
                            messageString = "This is a storage message";
                            levelValue = "storage";
                        }
                    }
                    else
                    {
                        levelValue = "normal";
                    }
    
                    var message = new Message(Encoding.ASCII.GetBytes(messageString));
                    message.Properties.Add("level", levelValue);
    
                    await deviceClient.SendEventAsync(message);
                    Console.WriteLine("{0} > Sent message: {1}", DateTime.Now, messageString);
    
                    await Task.Delay(1000);
                }
            }
    
            private static void Main(string[] args)
            {
                Console.WriteLine("Simulated device\n");
                _deviceClient = DeviceClient.Create(IotHubUri, new DeviceAuthenticationWithRegistrySymmetricKey(DeviceId, DeviceKey), TransportType.Mqtt);
                _deviceClient.ProductInfo = "HappyPath_Simulated-CSharp";
    
                SendDeviceToCloudMessagesAsync();
                Console.ReadLine();
            }
        }
    }
    

    2018年3月8日 2:30

すべての返信

  • こんにちは。

    ソース上だと deviceClient ではなく、 _deviceClient で定義されているようなので、
    そちらを使えば良いと思います。

    2018年3月8日 2:50
  • ありがとうございます。

    そのように書き換えたら実行できました。しかし変えた場所で別のエラーが出ました。

    Microsoft.Azure.Devices.Client.Exceptions.UnauthorizedException: 'CONNECT failed: RefusedNotAuthorized'

    何かしらの認証ができないのかと思い、AzureやMSのアカウントなどを確認しましたがこのエラーは消えません。なぜでしょうか。

    2018年3月8日 3:21
  • DeviceId と DeviceKey の値はどこから入手しましたか?
    URLに記載のあるとおり、Azure IoT Hubから認証情報を取得されましたでしょうか。
    2018年3月8日 3:55
  • Azure IoT Hub の、共有アクセスポリシーからiothubownwerを選択し、接続文字列―プライマリキーをクリップボードにコピーしました。

    それを、VSのCreateDeviceIdentityプロジェクト内のProgram.csの、ConnectionStringの部分へペーストしました。

    その後CreateDeviceIdentityを実行し、device keyを取得しました。それらを、ReadDeviceCloudMessagesとSimulatedDeviceの該当する部分へ書き込みました。

    2018年3月8日 4:18
  • 正しそうな気がしますね。

    では、DeviceIdはどうですか?正しそうですか?

    2018年3月8日 6:42