IoT Hub (.NET) ile buluttan cihaza iletiler gönderme

Azure IoT Hub, milyonlarca cihaz ve bir çözüm arka ucu arasında güvenilir ve güvenli çift yönlü iletişimin etkinleştirilmesine yardımcı olan tam olarak yönetilen bir hizmettir.

Bu makale, şunları nasıl yapacağınızı gösterir:

  • IoT Hub aracılığıyla çözüm arka ucunuzdan tek bir cihaza buluttan cihaza (C2D) iletiler gönderme

  • Cihazda buluttan cihaza iletileri alma

  • IoT Hub'den bir cihaza gönderilen iletiler için çözüm arka ucunuzdan teslim bildirimi (geri bildirim) isteme

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 makalenin sonunda iki .NET konsol uygulaması çalıştıracaksınız.

  • MessageReceiveSample: IoT hub'ınıza bağlanan ve buluttan cihaza iletileri alan .NET için Microsoft Azure IoT SDK'sına dahil edilen örnek bir cihaz uygulaması.

  • SendCloudToDevice: IoT Hub aracılığıyla cihaz uygulamasına buluttan cihaza ileti gönderen ve ardından teslim bildirimini alan bir hizmet uygulaması.

Not

IoT Hub, Azure IoT cihaz SDK'ları aracılığıyla birçok cihaz platformu ve dili (C, Java, Python ve JavaScript) için SDK desteğine sahiptir.

D2C ve IoT Hub ile C2D Mesajlaşma'da buluttan cihaza iletiler hakkında daha fazla bilgi bulabilirsiniz.

Önkoşullar

  • Azure aboneliği. Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

  • Azure aboneliğinizdeki bir IoT hub'ı. Henüz bir hub'ına sahip değilseniz IoT hub'ı oluşturma makalesindeki adımları izleyebilirsiniz.

  • IoT hub'ınıza kayıtlı bir cihaz. Henüz bir cihaz kaydetmediyseniz Azure portal bir cihaz kaydedin.

  • Bu makalede C# için Azure IoT SDK'sından alınan örnek kod kullanılmaktadır.

    • SDK deposunu GitHub'dan geliştirme makinenize indirin veya kopyalayın.
    • Geliştirme makinenizde .NET Core 3.0.0 veya üzerinin yüklü olduğundan emin olun. .NET'i çalıştırarak dotnet --version sürümünüzü denetleyin ve gerekirse indirin.
  • 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).

  • Visual Studio.

Cihaz bağlantı dizesini alma

Bu makalede, IoT Hub aracılığıyla gönderilen buluttan cihaza iletileri alan bir cihazın benzetimini yapan örnek bir uygulama çalıştıracaksınız. .NET için Microsoft Azure IoT SDK'sına dahil edilen MessageReceiveSample örnek uygulaması, IoT hub'ınıza bağlanır ve simülasyon cihazınız olarak görev yapar. Örnek, IoT hub'ınızdaki kayıtlı cihazın birincil bağlantı dizesini kullanır.

IoT hub'ınıza kayıtlı bir cihazın birincil 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. IoT hub'ınızın sol tarafındaki bölmede, Cihaz Yönetimi altında Cihazlar'ı seçin.

  3. Cihaz listesinden uygun cihazı seçin.

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

    Azure portal IoT hub'ınıza kayıtlı bir cihaz için birincil bağlantı dizesinin nasıl alındığını gösteren ekran görüntüsü.

Cihaz uygulamasında ileti alma

Bu bölümde IoT hub'ınız aracılığıyla gönderilen C2D iletilerini almak için MessageReceiveSample örnek cihaz uygulamasını çalıştırın. Yeni bir komut istemi açın ve Azure IoT C# SDK'sını genişlettiğiniz klasörün altında azure-iot-sdk-csharp\iothub\device\samples\getting started\MessageReceiveSample klasörüne gidin. Yer tutucu değerini IoT hub'ınızdaki kayıtlı cihazdan kopyaladığınız cihaz bağlantı dizesiyle değiştirerek {Your device connection string} aşağıdaki komutları çalıştırın.

dotnet restore
dotnet run --c "{Your device connection string}"

Aşağıdaki çıkış, başarıyla başlatıldıktan ve IoT hub'ınıza bağlandıktan sonra örnek cihaz uygulamasından alınmaktadır:

5/22/2023 11:13:18 AM> Press Control+C at any time to quit the sample.
     
5/22/2023 11:13:18 AM> Device waiting for C2D messages from the hub...
5/22/2023 11:13:18 AM> Use the Azure Portal IoT hub blade or Azure IoT Explorer to send a message to this device.
5/22/2023 11:13:18 AM> Trying to receive C2D messages by polling using the ReceiveAsync() method. Press 'n' to move to the next phase.

Örnek cihaz uygulaması ReceiveAsync ve CompleteAsync yöntemlerini kullanarak iletileri yoklar. ReceiveC2dMessagesPollingAndCompleteAsync yöntemi, cihaz iletiyi aldığında alınan iletiyi zaman uyumsuz olarak döndüren yöntemini kullanırReceiveAsync. ReceiveAsync , belirtilebilen bir zaman aşımı döneminden sonra null döndürür. Bu örnekte varsayılan olarak bir dakika kullanılır. Cihaz null aldığında yeni iletileri beklemeye devam etmelidir. Bu gereksinim, örnek uygulamanın yönteminde aşağıdaki kod ReceiveC2dMessagesPollingAndCompleteAsync bloğunu içermesinin nedenidir:

   if (receivedMessage == null)
   {
      continue;
   }

yöntemine yapılan CompleteAsync çağrı, IoT Hub iletinin başarıyla işlendiğini ve iletinin cihaz kuyruğundan güvenli bir şekilde kaldırılabildiğini bildirir. Cihaz, kullandığı protokolden bağımsız olarak işlemi başarıyla tamamlandığında bu yöntemi çağırmalıdır.

AMQP ve HTTPS protokolleri ile, ancak MQTT protokolüyle değil, cihaz şunları da yapabilir:

  • bir iletiden vazgeçin, bu da IoT Hub gelecekte kullanılmak üzere iletinin cihaz kuyruğunda tutulmasına neden olur.
  • İletiyi reddederek iletiyi cihaz kuyruğundan kalıcı olarak kaldırır.

Cihazın iletiyi tamamlamasını, bırakmasını veya reddetmesini engelleyen bir şey olursa IoT Hub, sabit bir zaman aşımı süresinden sonra iletiyi teslim için yeniden kuyruğa alır. Bu nedenle, aynı iletiyi birden çok kez almak aynı sonucu vermesi için cihaz uygulamasındaki ileti işleme mantığının bir kez etkili olması gerekir.

Buluttan cihaza ileti yaşam döngüsü ve IoT Hub buluttan cihaza iletileri nasıl işlediği hakkında daha fazla bilgi için bkz. IoT hub'ından buluttan cihaza iletiler gönderme.

Not

Aktarım olarak MQTT veya AMQP yerine HTTPS kullanıldığında, ReceiveAsync yöntem hemen döndürür. HTTPS ile buluttan cihaza iletiler için desteklenen desen, iletileri seyrek denetleyan aralıklı olarak bağlı cihazlardır (en az 25 dakikada bir). Daha fazla HTTPS verilmesi, istekleri azaltmaya IoT Hub sonuç alır. MQTT, AMQP ve HTTPS desteği arasındaki farklar hakkında daha fazla bilgi için bkz. Buluttan cihaza iletişim kılavuzu ve İletişim protokolü seçme.

IoT hub bağlantı dizesini alma

Bu makalede, IoT Hub aracılığıyla buluttan cihaza iletiler göndermek için bir arka uç hizmeti oluşturacaksınız. Buluttan cihaza iletiler göndermek için hizmetinizin hizmet bağlama iznine sahip olması gerekir. Varsayılan olarak, her IoT Hub bu izni veren hizmet adlı bir paylaşılan erişim ilkesiyle oluşturulur.

Hizmet 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. IoT hub'ınızın sol tarafındaki bölmede Paylaşılan erişim ilkeleri'ni seçin.

  3. İlke listesinden hizmet ilkesini seçin.

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

Azure portal bağlantı dizesini IoT Hub alma işlemini 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.

Buluttan cihaza ileti gönderme

Bu bölümde, sanal cihaz uygulamasına buluttan cihaza iletiler gönderen bir .NET konsol uygulaması oluşturacaksınız. Cihazınızdan cihaz kimliğine ve IoT hub bağlantı dizenize ihtiyacınız vardır.

  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. Projeye SendCloudToDevice adını verin ve İleri'yi seçin.

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

  3. .NET Framework en son sürümünü kabul edin. Projeyi oluşturmak için Oluştur'u seçin.

  4. Çözüm Gezgini'da yeni projeye sağ tıklayın ve ardından NuGet Paketlerini Yönet'i seçin.

  5. NuGet Paketlerini Yönet'teGözat'ı seçin ve ardından Microsoft.Azure.Devices'ı arayıp seçin. Yükle'yi seçin.

    Bu adım Azure IoT hizmeti SDK'sı NuGet paketini indirir, yükler ve buna bir başvuru ekler.

  6. usingAşağıdaki deyimi Program.cs dosyasının en üstüne ekleyin.

    using Microsoft.Azure.Devices;
    
  7. Program sınıfına aşağıdaki alanları ekleyin. {iot hub connection string} Yer tutucu değerini Daha önce IoT hub bağlantı dizesini alma bölümünde not ettiğiniz IoT hub bağlantı dizesiyle değiştirin. {device id} Yer tutucu değerini IoT hub'ınızdaki kayıtlı cihazın cihaz kimliğiyle değiştirin.

    static ServiceClient serviceClient;
    static string connectionString = "{iot hub connection string}";
    static string targetDevice = "{device id}";
    
  8. Cihazınıza ileti göndermek için Program sınıfına aşağıdaki yöntemi ekleyin.

    private async static Task SendCloudToDeviceMessageAsync()
    {
         var commandMessage = new
          Message(Encoding.ASCII.GetBytes("Cloud to device message."));
         await serviceClient.SendAsync(targetDevice, commandMessage);
    }
    
  9. Son olarak Main yöntemine aşağıdaki satırları ekleyin.

    Console.WriteLine("Send Cloud-to-Device message\n");
    serviceClient = ServiceClient.CreateFromConnectionString(connectionString);
    
    Console.WriteLine("Press any key to send a C2D message.");
    Console.ReadLine();
    SendCloudToDeviceMessageAsync().Wait();
    Console.ReadLine();
    
  10. Örnek hizmet uygulamanızı başlatmak için F5 tuşuna basın. SendCloudToDevice penceresini seçin ve Enter tuşuna basın. Aşağıdaki çıkış örneğinde gösterildiği gibi örnek cihaz uygulaması tarafından alınan iletiyi görmeniz gerekir.

    5/22/2023 11:13:18 AM> Press Control+C at any time to quit the sample.
    
    5/22/2023 11:13:18 AM> Device waiting for C2D messages from the hub...
    5/22/2023 11:13:18 AM> Use the Azure Portal IoT hub blade or Azure IoT Explorer to send a message to this device.
    5/22/2023 11:13:18 AM> Trying to receive C2D messages by polling using the ReceiveAsync() method. Press 'n' to move to the next phase.
    5/22/2023 11:15:18 AM> Polling using ReceiveAsync() - received message with Id=
    5/22/2023 11:15:18 AM> Received message: [Cloud to device message.]
            Content type:
    
    5/22/2023 11:15:18 AM> Completed C2D message with Id=.
    

Teslim geri bildirimi alma

Her buluttan cihaza ileti için IoT Hub teslim (veya süre sonu) bildirimleri istemek mümkündür. Bu seçenek, çözüm arka ucunun kolayca bilgilendirilmesini, yeniden denemesini veya dengeleme mantığını etkinleştirmesini sağlar. Buluttan cihaza geri bildirim hakkında daha fazla bilgi için bkz. IoT Hub ile D2C ve C2D Mesajlaşma.

Bu bölümde SendCloudToDevice örnek hizmet uygulamasını değiştirerek geri bildirim isteyecek ve IoT hub'ından alacaksınız.

  1. Visual Studio'daki SendCloudToDevice projesinde Program sınıfına aşağıdaki yöntemi ekleyin.

    private async static void ReceiveFeedbackAsync()
    {
         var feedbackReceiver = serviceClient.GetFeedbackReceiver();
    
         Console.WriteLine("\nReceiving c2d feedback from service");
         while (true)
         {
             var feedbackBatch = await feedbackReceiver.ReceiveAsync();
             if (feedbackBatch == null) continue;
    
             Console.ForegroundColor = ConsoleColor.Yellow;
             Console.WriteLine("Received feedback: {0}",
               string.Join(", ", feedbackBatch.Records.Select(f => f.StatusCode)));
             Console.ResetColor();
    
             await feedbackReceiver.CompleteAsync(feedbackBatch);
         }
     }
    

    Bu alma düzeninin, cihaz uygulamasından buluttan cihaza iletileri almak için kullanılan desenle aynı olduğunu unutmayın.

  2. Main yöntemine aşağıdaki satırı ekleyin, hemen sonraserviceClient = ServiceClient.CreateFromConnectionString(connectionString).

    ReceiveFeedbackAsync();
    
  3. Buluttan cihaza iletinizin teslimi için geri bildirim istemek için SendCloudToDeviceMessageAsync yönteminde bir özellik belirtmeniz gerekir. Aşağıdaki satırı satırın hemen arkasına var commandMessage = new Message(...); ekleyin.

    commandMessage.Ack = DeliveryAcknowledgement.Full;
    
  4. Örnek cihaz uygulamasının çalıştığından emin olun ve ardından F5 tuşuna basarak örnek hizmet uygulamasını çalıştırın. SendCloudToDevice konsol penceresini seçin ve Enter tuşuna basın. Örnek cihaz uygulaması tarafından alınan iletiyi ve birkaç saniye sonra SendCloudToDevice uygulamanız tarafından alınan geri bildirim iletisini görmeniz gerekir. Aşağıdaki çıkış, örnek hizmet uygulaması tarafından alınan geri bildirim iletisini gösterir:

    Send Cloud-to-Device message
    
    
    Receiving c2d feedback from service
    Press any key to send a C2D message.
    
    Received feedback: Success
    

Not

Kolaylık olması için bu makalede herhangi bir yeniden deneme ilkesi uygulanmaz. Üretim kodunda, Geçici hata işlemede önerilen üstel geri alma gibi yeniden deneme ilkelerini uygulamanız gerekir.

Sonraki adımlar

Bu makalede, buluttan cihaza ileti göndermeyi ve almayı öğrendiniz.