İşleri zamanlama ve yayınlama (.NET)

Milyonlarca cihazı güncelleştiren işleri zamanlamak ve izlemek için Azure IoT Hub kullanın. İşleri kullanarak:

  • İstenen özellikleri güncelleştirme

  • Etiketleri güncelleştirme

  • Doğrudan yöntemleri çağırma

İş, bu eylemlerden birini sarmalar ve bir cihaz ikizi sorgusu tarafından tanımlanan bir cihaz kümesine göre yürütmeyi izler. Örneğin bir arka uç uygulaması, cihazları yeniden başlatan 10.000 cihazda doğrudan yöntem çağırmak için bir iş kullanabilir. Cihaz ikizi sorgusuyla cihaz kümesini belirtir ve işi gelecekteki bir zamanda çalışacak şekilde zamanlarsınız. İş, cihazların her biri yeniden başlatma doğrudan yöntemini aldığında ve yürütürken ilerleme durumunu izler.

Bu özelliklerin her biri hakkında daha fazla bilgi edinmek için bkz:

Not

Bu makalede açıklanan özellikler yalnızca standart IoT Hub katmanında kullanılabilir. Temel ve standart/ücretsiz IoT Hub katmanları hakkında daha fazla bilgi için bkz. Çözümünüz için doğru IoT Hub katmanı seçme.

Bu makalede iki .NET (C#) konsol uygulamasının nasıl oluşturulacağı gösterilmektedir:

  • Arka uç uygulaması tarafından çağrılabilen LockDoor adlı doğrudan bir yöntem uygulayan SimulateDeviceMethods cihaz uygulaması.

  • İki iş oluşturan ScheduleJob adlı bir arka uç uygulaması. Bir iş lockDoor doğrudan yöntemini çağırır ve başka bir iş istenen özellik güncelleştirmelerini birden çok cihaza gönderir.

Not

Hem cihaz hem de arka uç uygulamaları oluşturmak için kullanılabilen SDK araçları hakkında daha fazla bilgi için bkz. Azure IoT SDK'ları .

Önkoşullar

  • Visual Studio.

  • IoT hub'ı. CLI veya Azure portal ile bir tane oluşturun.

  • Kayıtlı bir cihaz. Azure portal bir tane kaydedin.

  • Güvenlik duvarınızda 8883 numaralı bağlantı noktasının açık olduğundan emin olun. Bu makaledeki cihaz örneği, 8883 numaralı bağlantı noktası üzerinden iletişim kuran MQTT protokollerini kullanır. Bu bağlantı noktası bazı kurumsal ve eğitim ağ ortamlarında engellenebilir. Bu sorunu çözmenin daha fazla bilgi ve yolları için bkz. IoT Hub bağlanma (MQTT).

Sanal cihaz uygulaması oluşturma

Bu bölümde, çözüm arka ucu tarafından çağrılan doğrudan bir yönteme yanıt veren bir .NET konsol uygulaması oluşturacaksınız.

  1. Visual Studio'da Yeni proje oluştur'u ve ardından Konsol Uygulaması (.NET Framework) proje şablonunu seçin. Devam etmek için İleri seçeneğini belirleyin.

  2. Yeni projenizi yapılandırın bölümünde projeyi SimulateDeviceMethods olarak adlandırın ve İleri'yi seçin.

    Visual Studio'da 'Yeni projenizi yapılandırın' açılan penceresinin ekran görüntüsü.

  3. .NET Framework varsayılan sürümünü kabul edin ve oluştur'u seçerek projeyi oluşturun.

  4. Çözüm Gezgini'da SimulateDeviceMethods projesine sağ tıklayıp NuGet Paketlerini Yönet'i seçin.

  5. NuGet Paket Yöneticisi'ndeGözat'ı seçin ve Microsoft.Azure.Devices.Client'ı arayın ve seçin. Yükle'yi seçin.

    Visual Studio'da NuGet Paket Yöneticisi'nin ekran görüntüsü.

    Bu adım Azure IoT cihaz SDK'sı NuGet paketini ve bağımlılıklarını indirir, yükler ve bunlara bir başvuru ekler.

  6. Aşağıdaki using deyimlerini Program.cs dosyasının üst kısmına ekleyin:

    using Microsoft.Azure.Devices.Client;
    using Microsoft.Azure.Devices.Shared;
    using Newtonsoft.Json;
    using System.Threading.Tasks;
    using System.Text;
    
  7. Program sınıfına aşağıdaki alanları ekleyin. Yer tutucu değerini önceki bölümde not ettiğiniz cihaz bağlantı dizesiyle değiştirin:

    static string DeviceConnectionString = "<yourDeviceConnectionString>";
    static DeviceClient Client = null;
    
  8. Cihazda doğrudan yöntemi uygulamak için aşağıdaki kodu ekleyin:

    static Task<MethodResponse> LockDoor(MethodRequest methodRequest, object userContext)
    {
        Console.WriteLine();
        Console.WriteLine("Locking Door!");
        Console.WriteLine("\nReturning response for method {0}", methodRequest.Name);
    
        string result = "'Door was locked.'";
        return Task.FromResult(new MethodResponse(Encoding.UTF8.GetBytes(result), 200));
    }
    
  9. Cihazda cihaz ikizleri dinleyicisini uygulamak için aşağıdaki yöntemi ekleyin:

    private static async Task OnDesiredPropertyChanged(TwinCollection desiredProperties, 
      object userContext)
    {
        Console.WriteLine("Desired property change:");
        Console.WriteLine(JsonConvert.SerializeObject(desiredProperties));
    }
    
  10. Son olarak, Aşağıdaki kodu Main yöntemine ekleyerek IoT hub'ınıza bağlantıyı açın ve yöntem dinleyicisini başlatın:

    try
    {
        Console.WriteLine("Connecting to hub");
        Client = DeviceClient.CreateFromConnectionString(DeviceConnectionString, 
          TransportType.Mqtt);
    
        Client.SetMethodHandlerAsync("LockDoor", LockDoor, null);
        Client.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertyChanged, null);
    
        Console.WriteLine("Waiting for direct method call and device twin update\n Press enter to exit.");
        Console.ReadLine();
    
        Console.WriteLine("Exiting...");
    
        Client.SetMethodHandlerAsync("LockDoor", null, null);
        Client.CloseAsync().Wait();
    }
    catch (Exception ex)
    {
        Console.WriteLine();
        Console.WriteLine("Error in sample: {0}", ex.Message);
    }
    
  11. Çalışmanızı kaydedin ve çözümünüzü oluşturun.

Not

İşleri basit tutmak için bu makalede yeniden deneme ilkeleri uygulanmaz. Üretim kodunda, Geçici hata işlemede önerilen yeniden deneme ilkelerini (bağlantı yeniden denemesi gibi) uygulamanız gerekir.

IoT hub bağlantı dizesini alma

Bu makalede, bir cihazda doğrudan yöntem çağırmak için bir iş zamanlayan, cihaz ikizini güncelleştirmek için bir iş zamanlayan ve her işin ilerleme durumunu izleyen bir arka uç hizmeti oluşturacaksınız. Bu işlemleri gerçekleştirmek için hizmetinizin kayıt defteri okuma ve kayıt defteri yazma izinlerine sahip olması gerekir. Varsayılan olarak, her IoT hub'ı bu izinleri veren registryReadWrite adlı bir paylaşılan erişim ilkesiyle oluşturulur.

registryReadWrite ilkesinin IoT Hub bağlantı dizesini almak için şu adımları izleyin:

  1. Azure portalKaynak grupları'nı seçin. Hub'ınızın bulunduğu kaynak grubunu seçin ve ardından kaynak listesinden hub'ınızı seçin.

  2. Hub'ınızın sol tarafındaki bölmede Paylaşılan erişim ilkeleri'ni seçin.

  3. İlke listesinden registryReadWrite ilkesini seçin.

  4. Birincil bağlantı dizesini kopyalayın ve değeri kaydedin.

    Bağlantı dizesinin nasıl alındığını gösteren ekran görüntüsü

Paylaşılan erişim ilkeleri ve izinleri IoT Hub hakkında daha fazla bilgi için bkz. Erişim denetimi ve izinleri.

Doğrudan yöntem çağırmak ve cihaz ikizi güncelleştirmeleri göndermek için işleri zamanlama

Bu bölümde, LockDoor doğrudan yöntemini çağırmak ve istenen özellik güncelleştirmelerini birden çok cihaza göndermek için işleri kullanan bir .NET konsol uygulaması (C# kullanarak) oluşturacaksınız.

  1. Visual Studio'da Dosya>Yeni Proje'yi> seçin. Yeni proje oluştur bölümünde Konsol Uygulaması (.NET Framework) öğesini ve ardından İleri'yi seçin.

  2. Yeni projenizi yapılandırın bölümünde projeyi ScheduleJob olarak adlandırın ve Oluştur'u seçin.

    ScheduleJob projenizi adlandırma ve yapılandırma

    Visual Studio'da bir ad eklediğiniz 'Yeni projenizi yapılandırın' açılan penceresinin ekran görüntüsü.

  3. .NET Framework varsayılan sürümünü kabul edin ve oluştur'u seçerek projeyi oluşturun.

  4. Çözüm Gezgini'da ScheduleJob projesine sağ tıklayıp NuGet Paketlerini Yönet'i seçin.

  5. NuGet Paket Yöneticisi'ndeGözat'ı seçin, Microsoft.Azure.Devices araması yapın ve seçin, ardından Yükle'yi seçin.

    Bu adım Azure IoT hizmeti SDK'sı NuGet paketini ve bağımlılıklarını indirir, yükler ve bunlara bir başvuru ekler.

  6. Aşağıdaki using deyimlerini Program.cs dosyasının üst kısmına ekleyin:

    using Microsoft.Azure.Devices;
    using Microsoft.Azure.Devices.Shared;
    
  7. Varsayılan deyimlerde zaten yoksa aşağıdaki using deyimi ekleyin.

    using System.Threading;
    using System.Threading.Tasks;
    
  8. Program sınıfına aşağıdaki alanları ekleyin. Yer tutucuları Daha önce IoT hub bağlantı dizesini alma bölümünde kopyaladığınız IoT Hub bağlantı dizesiyle ve cihazınızın adıyla değiştirin.

    static JobClient jobClient;
    static string connString = "<yourIotHubConnectionString>";
    static string deviceId = "<yourDeviceId>";
    
  9. Program sınıfına aşağıdaki yöntemi ekleyin:

    public static async Task MonitorJob(string jobId)
    {
        JobResponse result;
        do
        {
            result = await jobClient.GetJobAsync(jobId);
            Console.WriteLine("Job Status : " + result.Status.ToString());
            Thread.Sleep(2000);
        } while ((result.Status != JobStatus.Completed) && 
          (result.Status != JobStatus.Failed));
    }
    
  10. Program sınıfına aşağıdaki yöntemi ekleyin:

    public static async Task StartMethodJob(string jobId)
    {
        CloudToDeviceMethod directMethod = 
          new CloudToDeviceMethod("LockDoor", TimeSpan.FromSeconds(5), 
          TimeSpan.FromSeconds(5));
    
        JobResponse result = await jobClient.ScheduleDeviceMethodAsync(jobId,
            $"DeviceId IN ['{deviceId}']",
            directMethod,
            DateTime.UtcNow,
            (long)TimeSpan.FromMinutes(2).TotalSeconds);
    
        Console.WriteLine("Started Method Job");
    }
    
  11. Program sınıfına başka bir yöntem ekleyin:

    public static async Task StartTwinUpdateJob(string jobId)
    {
        Twin twin = new Twin(deviceId);
        twin.Tags = new TwinCollection();
        twin.Tags["Building"] = "43";
        twin.Tags["Floor"] = "3";
        twin.ETag = "*";
    
        twin.Properties.Desired["LocationUpdate"] = DateTime.UtcNow;
    
        JobResponse createJobResponse = jobClient.ScheduleTwinUpdateAsync(
            jobId,
            $"DeviceId IN ['{deviceId}']", 
            twin, 
            DateTime.UtcNow, 
            (long)TimeSpan.FromMinutes(2).TotalSeconds).Result;
    
        Console.WriteLine("Started Twin Update Job");
    }
    

    Not

    Sorgu söz dizimi hakkında daha fazla bilgi için bkz. IoT Hub sorgu dili.

  12. Son olarak, Main yöntemine aşağıdaki satırları ekleyin:

    Console.WriteLine("Press ENTER to start running jobs.");
    Console.ReadLine();
    
    jobClient = JobClient.CreateFromConnectionString(connString);
    
    string methodJobId = Guid.NewGuid().ToString();
    
    StartMethodJob(methodJobId);
    MonitorJob(methodJobId).Wait();
    Console.WriteLine("Press ENTER to run the next job.");
    Console.ReadLine();
    
    string twinUpdateJobId = Guid.NewGuid().ToString();
    
    StartTwinUpdateJob(twinUpdateJobId);
    MonitorJob(twinUpdateJobId).Wait();
    Console.WriteLine("Press ENTER to exit.");
    Console.ReadLine();
    
  13. Çalışmanızı kaydedin ve çözümünüzü oluşturun.

Uygulamaları çalıştırma

Şimdi uygulamaları çalıştırmaya hazırsınız.

  1. Visual Studio Çözüm Gezgini çözümünüze sağ tıklayıp Başlangıç Projelerini Ayarla'yı seçin.

  2. Ortak Özellikler>Başlangıç Projesi'ni ve ardından Birden çok başlangıç projesi'ni seçin.

  3. listenin en üstünde ve ardından ScheduleJoböğesinin olduğundan emin SimulateDeviceMethods olun. Her iki eylemi de Başlangıç olarak ayarlayın ve Tamam'ı seçin.

  4. Başlat'a tıklayarak projeleri çalıştırın veya Hata Ayıkla menüsüne gidin ve Hata Ayıklamayı Başlat'a tıklayın.

    Hem cihaz hem de arka uç uygulamalarından gelen çıkışı görürsünüz.

    İşleri zamanlamak için uygulamaları çalıştırma

Sonraki adımlar

Bu makalede, işleri doğrudan bir yöntem çalıştıracak ve cihaz ikizinin özelliklerini güncelleştirecek şekilde zamanlamıştınız.

IoT Hub ve cihaz yönetimi desenlerini keşfetmeye devam etmek için Raspberry Pi 3 B+ Başvuru Görüntüsünü kullanarak Azure IoT Hub öğreticisi için Cihaz Güncelleştirmesi'nde bir görüntüyü güncelleştirin.