Aracılığıyla paylaş


Buluttan cihaza ileti gönderme ve alma

Azure IoT Hub, çözüm arka uçlarından milyonlarca cihaza buluttan cihaza (C2D) iletiler de dahil olmak üzere çift yönlü iletişimlere olanak tanıyan tam olarak yönetilen bir hizmettir.

Bu makalede, aşağıdaki uygulama türlerini oluşturmak için Azure IoT SDK'larının nasıl kullanılacağı açıklanmaktadır:

  • IoT Hub mesajlaşma kuyruğundan buluttan cihaza iletileri alan ve işleyen cihaz uygulamaları.

  • IoT Hub mesajlaşma kuyruğu aracılığıyla tek bir cihaza buluttan cihaza iletiler gönderen arka uç uygulamaları.

Bu makale, bu makalenin içinden başvurulan çalıştırılabilir SDK örneklerini tamamlamaya yöneliktir.

Not

Bu makalede açıklanan özellikler yalnızca IoT Hub'ın standart 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ını seçme.

Genel bakış

Bir cihaz uygulamasının buluttan cihaza iletileri alabilmesi için IoT Hub'a bağlanması ve ardından gelen iletileri işlemek için bir ileti işleyicisi ayarlaması gerekir. Azure IoT Hub cihaz SDK'ları, bir cihazın hizmetten ileti alıp işlemek için kullanabileceği sınıflar ve yöntemler sağlar. Bu makalede, aşağıdakiler dahil olmak üzere iletileri alan tüm cihaz uygulamalarının temel öğeleri ele alınmaktadır:

  • Cihaz istemci nesnesi bildirme
  • IoT Hub'a bağlanma
  • IoT Hub ileti kuyruğundan iletileri alma
  • İletiyi işleme ve IoT Hub'a geri bildirim gönderme
  • Alma iletisi yeniden deneme ilkesini yapılandırma

Bir arka uç uygulamasının buluttan cihaza ileti gönderebilmesi için ioT Hub'a bağlanması ve ioT Hub ileti kuyruğu üzerinden ileti göndermesi gerekir. Azure IoT Hub hizmeti SDK'ları, bir uygulamanın cihazlara ileti göndermek için kullanabileceği sınıflar ve yöntemler sağlar. Bu makalede, cihazlara ileti gönderen herhangi bir uygulamanın önemli öğeleri ele alınmaktadır, örneğin:

  • Hizmet istemci nesnesi bildirme
  • IoT Hub'a bağlanma
  • İletiyi oluşturma ve gönderme
  • Teslim geri bildirimi alma
  • İleti gönderme yeniden deneme ilkesini yapılandırma

İleti sırasını anlama

Buluttan cihaza mesajlaşmayı anlamak için IoT Hub cihaz ileti kuyruklarının nasıl çalıştığına ilişkin bazı temel noktaları anlamak önemlidir.

Çözüm arka uç uygulamasından IoT cihazına gönderilen buluttan cihaza iletiler IoT Hub üzerinden yönlendirilir. Çözüm arka uç uygulaması ile hedef cihaz arasında doğrudan eşler arası mesajlaşma iletişimi yoktur. IoT Hub, gelen iletileri hedef IoT cihazları tarafından indirilmeye hazır olarak ileti kuyruğuna yerleştirir.

En az bir kez ileti teslimi garanti etmek için IoT hub'ı, cihaz başına kuyruklarda buluttan cihaza iletileri kalıcı hale getirir. IoT Hub iletiyi kuyruktan kaldırmadan önce cihazların iletinin tamamlanmasını açıkça kabul etmesi gerekir. Bu yaklaşım, bağlantı ve cihaz hatalarına karşı dayanıklılığı garanti eder.

IoT Hub bir iletiyi bir cihaz ileti kuyruğuna yerleştirdiğinde, ileti durumunu Sıralandı olarak ayarlar. Bir cihaz iş parçacığı kuyruktan bir ileti aldığında IoT Hub, ileti durumunu Görünmez olarak ayarlayarak iletiyi kilitler. Bu durum, cihazdaki diğer iş parçacıklarının aynı iletiyi işlemesini engeller. Bir cihaz iş parçacığı iletinin işlenmesini başarıyla tamamladığında IoT Hub'a bildirimde bulunur ve ardından IoT Hub ileti durumunu Tamamlandı olarak ayarlar.

Bir iletiyi başarıyla alan ve işleyen bir cihaz uygulamasının iletiyi tamamlaması söylenir. Ancak, gerekirse bir cihaz da şunları yapabilir:

  • IoT Hub'ın İletiyi Reddedildi durumuna ayarlamasına neden olan iletiyi reddedin . Message Queuing Telemetri Aktarımı (MQTT) protokolü üzerinden bağlanan cihazlar buluttan cihaza iletileri reddedemez.
  • IoT Hub'ın ileti durumunun Enqueued olarak ayarlandığı iletiyi yeniden kuyruğa yerleştirmesine neden olan iletiyi bırakın. MQTT protokolü üzerinden bağlanan cihazlar buluttan cihaza iletileri bırakamaz.

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

Buluttan cihaza iletileri alma

Bu bölümde.NET için Azure IoT SDK'sında DeviceClient sınıfı kullanılarak buluttan cihaza iletilerin nasıl alındığı açıklanmaktadır.

Bir cihaz istemci uygulamasının iletileri almak için kullanabileceği iki seçenek vardır:

  • Yoklama: Cihaz uygulaması, bir kod döngüsü (örneğin, bir while veya for döngüsü) kullanarak yeni IoT Hub iletilerini denetler. Döngü sürekli olarak yürütülür ve iletiler denetleniyor.
  • Geri çağırma: Cihaz uygulaması, bir ileti geldiğinde hemen çağrılan zaman uyumsuz bir ileti işleyici yöntemi ayarlar.

DeviceClient nesnesi bildirme

DeviceClient , IoT Hub'dan ileti almak için gereken yöntemleri ve özellikleri içerir.

Örneğin:

static DeviceClient deviceClient;

Bağlantı parametrelerini sağlayın

CreateFromConnectionString yöntemini kullanarak IoT Hub birincil bağlantı dizesi ve Cihaz Kimliğini DeviceClient sağlayın. Gerekli IoT Hub birincil bağlantı dizesi ek olarak, CreateFromConnectionString yöntemi şu isteğe bağlı parametreleri içerecek şekilde aşırı yüklenebilir:

  • transportType - Aktarım protokolü: HTTP sürüm 1, AMQP veya MQTT çeşitlemeleri. AMQP varsayılan değerdir. Kullanılabilir tüm değerleri görmek için bkz . TransportType Sabit Listesi.
  • transportSettings- ve ModuleClientiçin çeşitli aktarıma özgü ayarları tanımlamak için DeviceClient kullanılan arabirim. Daha fazla bilgi için bkz . ITransportSettings Arabirimi.
  • ClientOptions - Başlatma sırasında cihaz veya modül istemci örneğinin yapılandırılmasına izin veren seçenekler.

Bu örnek, bağlantı IoT hub'ı DeviceClient ve cihaz kimliği ayarlarını tanımlamayı çağırırCreateFromConnectionString.

static string connectionString = "{your IoT hub connection string}";
static string deviceID = "{your device ID}";
deviceClient = DeviceClient.CreateFromConnectionString(connectionString,deviceID);

Yoklamanın Karşılaştırması

Yoklama, iletileri denetlemek için ReceiveAsync kullanır.

çağrısı ReceiveAsync şu formları alabilir:

  • ReceiveAsync() - Devam etmeden önce ileti için varsayılan zaman aşımı süresini bekleyin.
  • ReceiveAsync (Timespan) - Belirli bir zaman aşımını kullanarak cihaz kuyruğundan bir ileti alın.
  • ReceiveAsync (CancellationToken) - İptal belirteci kullanarak cihaz kuyruğundan bir ileti alın. İptal belirteci kullanılırken varsayılan zaman aşımı süresi kullanılmaz.

MQTT veya AMQP yerine HTTP 1 aktarım türü kullanıldığında, ReceiveAsync yöntemi hemen döndürür. HTTP 1 ile buluttan cihaza iletiler için desteklenen desen, sık sık (en az 25 dakikada bir) iletileri denetleyan aralıklı olarak bağlı cihazlardır. Daha fazla HTTP 1 verilmesi, IoT Hub'ın istekleri azaltmasını sağlar. MQTT, AMQP ve HTTP 1 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.

CompleteAsync yöntemi

Cihaz bir ileti aldıktan sonra cihaz uygulaması, IoT Hub'a iletinin başarıyla işlendiğini ve iletinin IoT Hub cihaz kuyruğundan güvenli bir şekilde kaldırılabildiğini bildirmek için CompleteAsync yöntemini çağırır. Cihaz, kullandığı aktarım protokolünden bağımsız olarak işlemi başarıyla tamamlandığında bu yöntemi çağırmalıdır.

İletiyi bırakma, reddetme veya zaman aşımı

AMQP ve HTTP sürüm 1 protokolleri ile, ancak MQTT protokolüyle değil, cihaz şunları da yapabilir:

  • AbandonAsync'i çağırarak bir iletiyi bırakın. Bu, IoT Hub'ın iletinin gelecekte kullanılmak üzere cihaz kuyruğunda tutulmasına neden olur.
  • RejectAsync'i çağırarak bir iletiyi reddedin. Bu işlem, 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 yeniden teslim için kuyruğa alır. Bu nedenle, cihaz uygulamasındaki ileti işleme mantığının bir kez etkili olması gerekir, böylece aynı iletiyi birden çok kez almak aynı sonucu verir.

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

Yoklama döngüsü

Yoklama kullanarak, uygulama durdurulana kadar yeni iletileri denetlemek için yöntemini tekrar tekrar çağıran ReceiveAsync bir kod döngüsü kullanır.

Bir zaman aşımı değeri veya varsayılan zaman aşımı ile kullanılıyorsa ReceiveAsync , döngüde her çağrı ReceiveAsync belirtilen zaman aşımı süresini bekler. Zaman aşımına uğradıysa ReceiveAsync bir null değer döndürülür ve döngü devam eder.

bir ileti alındığında, tarafından CompleteAsync'e geçirilmesi gereken bir Görev nesnesi döndürülürReceiveAsync. IoT Hub'a CompleteAsync belirtilen iletiyi parametresine göre ileti kuyruğundan silmesini Task bildiren bir çağrı.

Bu örnekte döngü, bir ileti alınana veya yoklama döngüsü durdurulana kadar çağrı ReceiveAsync yapar.

static bool stopPolling = false;

while (!stopPolling)
{
   // Check for a message. Wait for the default DeviceClient timeout period.
   using Message receivedMessage = await _deviceClient.ReceiveAsync();

   // Continue if no message was received
   if (receivedMessage == null)
   {
      continue;
   }
   else  // A message was received
   {
      // Print the message received
      Console.WriteLine($"{DateTime.Now}> Polling using ReceiveAsync() - received message with Id={receivedMessage.MessageId}");
      PrintMessage(receivedMessage);

      // Notify IoT Hub that the message was received. IoT Hub will delete the message from the message queue.
      await _deviceClient.CompleteAsync(receivedMessage);
      Console.WriteLine($"{DateTime.Now}> Completed C2D message with Id={receivedMessage.MessageId}.");
   }

   // Check to see if polling loop should end
   stopPolling = ShouldPollingstop ();
}

Geri Arama

Cihaz uygulamasında geri arama buluttan cihaza iletileri almak için uygulamanın IoT Hub'a bağlanması ve gelen iletileri işlemek için bir geri çağırma dinleyicisi ayarlaması gerekir. Cihaza gelen iletiler IoT Hub ileti kuyruğundan alınır.

Cihaz uygulaması, geri çağırma özelliğini kullanarak SetReceiveMessageHandlerAsync kullanarak bir ileti işleyici yöntemi ayarlar. İleti işleyicisi çağrılır ve bir ileti alınır. İletileri almak için bir geri çağırma yöntemi oluşturmak, alınan iletiler için sürekli yoklama gereksinimini ortadan kaldırır.

Geri çağırma yalnızca şu protokoller kullanılarak kullanılabilir:

  • Mqtt
  • Mqtt_WebSocket_Only
  • Mqtt_Tcp_Only
  • Amqp
  • Amqp_WebSocket_Only
  • Amqp_Tcp_only

SDK yöntemlerinin Http1 alınan iletileri yine de yoklaması gerekeceğinden, geri çağırma ilkesini yenen protokol seçeneği geri çağırmaları desteklemez.

Bu örnekte, SetReceiveMessageHandlerAsync her ileti alındığında çağrılan adlı OnC2dMessageReceivedAsyncbir geri çağırma işleyicisi yöntemi ayarlar.

// Subscribe to receive C2D messages through a callback (which isn't supported over HTTP).
await deviceClient.SetReceiveMessageHandlerAsync(OnC2dMessageReceivedAsync, deviceClient);
Console.WriteLine($"\n{DateTime.Now}> Subscribed to receive C2D messages over callback.");

İleti yeniden deneme ilkesini alma

Cihaz istemci iletisi yeniden deneme ilkesi DeviceClient.SetRetryPolicy kullanılarak tanımlanabilir.

İleti yeniden deneme zaman aşımı DeviceClient.OperationTimeoutInMilliseconds özelliğinde depolanır.

SDK ileti alma örneği

.NET/C# SDK'sı, bu bölümde açıklanan ileti alma yöntemlerini içeren bir İleti Alma örneği içerir.

Buluttan cihaza iletileri gönderme

Bu bölümde, .NET için Azure IoT SDK'sında ServiceClient sınıfını kullanarak bir çözüm arka uç uygulamasından IoT cihazına ileti göndermeye yönelik temel kod açıklanmaktadır. Daha önce açıklandığı gibi, bir çözüm arka uç uygulaması bir IoT Hub'a bağlanır ve iletiler hedef cihazla kodlanmış IoT Hub'a gönderilir. IoT Hub gelen iletileri ileti kuyruğuna depolar ve iletiler IoT Hub ileti kuyruğundan hedef cihaza teslim edilir.

Çözüm arka uç uygulaması, ioT Hub'a gönderilen ve ileti kuyruğu üzerinden cihaz teslimini hedefleyen bir ileti için de teslim geri bildirimi isteyebilir ve alabilir.

ServiceClient nesnesi bildirme

ServiceClient , IoT Hub aracılığıyla bir uygulamadan cihaza ileti göndermek için gerekli yöntemleri ve özellikleri içerir.

static ServiceClient serviceClient;

bağlantı dizesi sağlama

CreateFromConnectionString yöntemini kullanarak IoT Hub birincil bağlantı dizesi ServiceClient sağlayın. Gerekli IoT Hub birincil bağlantı dizesi ek olarak, CreateFromConnectionString yöntemi şu isteğe bağlı parametreleri içerecek şekilde aşırı yüklenebilir:

  • transportType - Amqp veya Amqp_WebSocket_Only.
  • transportSettings - Hizmet İstemcisi için AMQP ve HTTP proxy ayarları.
  • ServiceClientOptions - Başlatma sırasında hizmet istemci örneğinin yapılandırılmasına izin veren seçenekler. Daha fazla bilgi için bkz . ServiceClientOptions.

Bu örnek, IoT Hub bağlantı dizesi kullanarak nesnesini oluştururServiceClient.

static string connectionString = "{your iot hub connection string}";
serviceClient = ServiceClient.CreateFromConnectionString(connectionString);

Zaman uyumsuz bir buluttan cihaza ileti gönderme

Buluttan (IoT Hub) cihaza bir uygulamadan zaman uyumsuz ileti göndermek için sendAsync'i kullanın. Çağrı AMQP protokolü kullanılarak yapılır.

sendAsync şu parametreleri kullanır:

  • deviceID - Hedef cihazın dize tanımlayıcısı.
  • message - Buluttan cihaza ileti. İleti İleti türündedir ve buna göre biçimlendirilebilir.
  • timeout- İsteğe bağlı bir zaman aşımı değeri. Belirtilmezse varsayılan değer bir dakikadır.

Bu örnek, hedef cihaza 10 saniyelik zaman aşımı değeriyle bir test iletisi gönderir.

string targetDevice = "Device-1";
static readonly TimeSpan operationTimeout = TimeSpan.FromSeconds(10);
var commandMessage = new
Message(Encoding.ASCII.GetBytes("Cloud to device message."));
await serviceClient.SendAsync(targetDevice, commandMessage, operationTimeout);

Teslim geri bildirimi alma

Gönderen bir program, buluttan cihaza her ileti için IoT Hub'dan teslim (veya süre sonu) bildirimleri isteyebilir. Bu seçenek, gönderen programın bilgilendirme, yeniden deneme veya telafi mantığını kullanmasını sağlar. İleti geri bildirimi işlemlerinin ve özelliklerinin tam açıklaması İleti geri bildirimi sayfasında açıklanmıştır.

İleti teslimi geri bildirimi almak için:

  • feedbackReceiver Nesneyi oluşturma
  • parametresini Ack kullanarak ileti gönderme
  • Geri bildirim almayı bekleyin

feedbackReceiver nesnesini oluşturma

FeedbackReceiver nesnesi oluşturmak için GetFeedbackReceiver çağrısı yapın. FeedbackReceiver , hizmetlerin geri bildirim alma işlemlerini gerçekleştirmek için kullanabileceği yöntemleri içerir.

var feedbackReceiver = serviceClient.GetFeedbackReceiver();

Ack parametresini kullanarak ileti gönderme

Teslim geri bildirimi almak için her iletinin teslim bildirimi Ack özelliği için bir değer içermesi gerekir. Ack özelliği şu değerlerden biri olabilir:

  • none (varsayılan): geri bildirim iletisi oluşturulmaz.

  • Positive: İleti tamamlandıysa bir geri bildirim iletisi alın.

  • Negative: cihaz tarafından tamamlanmadan iletinin süresi dolduysa (veya teslim sayısı üst sınırına ulaşıldıysa) bir geri bildirim iletisi alın.

  • Full: hem Negative hem de Positive sonuçlar için geri bildirim.

Bu örnekte özelliği olarak Ack ayarlanmıştır Fullve bir ileti için hem olumlu hem de olumsuz ileti teslim geri bildirimi ister.

var commandMessage = new
Message(Encoding.ASCII.GetBytes("Cloud to device message."));
commandMessage.Ack = DeliveryAcknowledgement.Full;
await serviceClient.SendAsync(targetDevice, commandMessage);

Geri bildirim almayı bekleyin

bir CancellationTokentanımlayın. Ardından döngüde ReceiveAsync'i tekrar tekrar çağırarak teslim geri bildirim iletilerini kontrol edin. Her çağrısı ReceiveAsync nesne için ServiceClient tanımlanan zaman aşımı süresini bekler.

  • ReceiveAsync İleti alınmadan zaman aşımı süresi dolarsa, ReceiveAsync döndürür null ve döngü devam eder.
  • Geri bildirim iletisi alınırsa, iptal belirteci ile birlikte CompleteAsync'e geçirilmesi gereken tarafından bir Görev nesnesi döndürülürReceiveAsync. Belirtilen gönderilen iletiyi parametresine göre Task ileti kuyruğundan silme çağrısıCompleteAsync.
  • Gerekirse alma kodu, gönderme iletisini kuyruğa geri yerleştirmek için AbandonAsync'i çağırabilir.
var feedbackReceiver = serviceClient.GetFeedbackReceiver();
// Define the cancellation token.
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token = source.Token;
// Call ReceiveAsync, passing the token. Wait for the timout period.
var feedbackBatch = await feedbackReceiver.ReceiveAsync(token);
if (feedbackBatch == null) continue;

Bu örnekte bu adımları içeren bir yöntem gösterilmektedir.

private async static void ReceiveFeedbackAsync()
{
      var feedbackReceiver = serviceClient.GetFeedbackReceiver();

      Console.WriteLine("\nReceiving c2d feedback from service");
      while (true)
      {
         // Check for messages, wait for the timeout period.
         var feedbackBatch = await feedbackReceiver.ReceiveAsync();
         // Continue the loop if null is received after a timeout.
         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 geri bildirim alma deseninin, cihaz uygulamasında buluttan cihaza iletileri almak için kullanılan desene benzer olduğunu unutmayın.

Hizmet istemcisi yeniden bağlantısı

Bir özel durumla karşılaşıldığında, hizmet istemcisi bu bilgileri çağıran uygulamaya geçirir. Bu noktada, özel durum ayrıntılarını incelemeniz ve gerekli işlemleri yapmanız önerilir.

Örneğin:

  • Bu bir ağ özel durumuysa işlemi yeniden deneyebilirsiniz.
  • Bu bir güvenlik özel durumuysa (yetkisiz özel durum), kimlik bilgilerinizi inceleyin ve bunların güncel olduğundan emin olun.
  • Azaltma/kota aşıldı özel durumuysa, istek gönderme sıklığını izleyin ve/veya değiştirin ya da hub örneği ölçek biriminizi güncelleştirin. Ayrıntılar için bkz . IoT Hub kotaları ve azaltma .

İleti yeniden deneme ilkesi gönder

İleti ServiceClient yeniden deneme ilkesi ServiceClient.SetRetryPolicy kullanılarak tanımlanabilir.

SDK ileti gönderme örneği

.NET/C# SDK'sı, bu bölümde açıklanan ileti gönderme yöntemlerini içeren bir Hizmet istemci örneği içerir.

Buluttan cihaza iletileri alma

Bu bölümde, Java için Azure IoT SDK'sından DeviceClient sınıfını kullanarak buluttan cihaza iletilerin nasıl alındığı açıklanmaktadır.

Java tabanlı bir cihaz uygulamasının buluttan cihaza iletileri alabilmesi için IoT Hub'a bağlanması ve ardından IoT Hub'dan gelen iletileri işlemek için bir geri çağırma dinleyicisi ve ileti işleyicisi ayarlaması gerekir. Cihaz uygulaması, cihazdan IoT Hub'a ileti bağlantısının kesilmesi durumunda bağlantı kesilmelerini algılayabilmeli ve işleyebilmelidir.

Azure IoT Java SDK kitaplıklarını içeri aktarma

Bu makalede başvuruda bulunan kod, bu SDK kitaplıklarını kullanır.

import com.microsoft.azure.sdk.iot.device.*;
import com.microsoft.azure.sdk.iot.device.exceptions.IotHubClientException;
import com.microsoft.azure.sdk.iot.device.transport.IotHubConnectionStatus;

DeviceClient nesnesi bildirme

DeviceClient nesne örneği için şu parametreler gerekir:

  • connString - IoT cihazı bağlantı dizesi. bağlantı dizesi, anahtarlar ve değerler '=' ile ayrılmış olarak ';' ile ayrılmış bir anahtar-değer çiftleri kümesidir. Bu anahtarlar için değerler içermelidir: HostName, DeviceId, and SharedAccessKey.
  • Aktarım protokolü - Bağlantı DeviceClient aşağıdaki IoTHubClientProtocol aktarım protokollerinden birini kullanabilir. AMQP en çok yönlüdür, iletileri sık sık denetlemeye olanak tanır ve iletinin reddedilmesine ve iptal edilmesini sağlar. MQTT ileti reddetme veya bırakma yöntemlerini desteklemez:
    • AMQPS
    • AMQPS_WS
    • HTTPS
    • MQTT
    • MQTT_WS

Örneğin:

static string connectionString = "{a device connection string}";
static protocol = IotHubClientProtocol.AMQPS;
DeviceClient client = new DeviceClient(connectionString, protocol);

İleti geri çağırma yöntemini ayarlama

IoT Hub'dan bir ileti alındığında bilgilendirilen bir ileti işleyici yöntemi tanımlamak için setMessageCallback yöntemini kullanın.

setMessageCallback şu parametreleri içerir:

  • callback - Geri çağırma yöntemi adı. olabilir null.
  • context- türünde objectisteğe bağlı bir bağlam. Belirtilmemişse kullanın null .

Bu örnekte, bağlam parametresi olmayan adlı MessageCallback bir callback yöntem öğesine setMessageCallbackgeçirilir.

client.setMessageCallback(new MessageCallback(), null);

İleti geri çağırma işleyicisi oluşturma

Geri çağırma iletisi işleyicisi, IoT Hub iletileri kuyruğundan geçirilen bir gelen iletiyi alır ve işler.

Bu örnekte, ileti işleyicisi gelen bir iletiyi işler ve ardından IotHubMessageResult.COMPLETE döndürür. Dönüş IotHubMessageResult.COMPLETE değeri IoT Hub'a iletinin başarıyla işlendiğini ve iletinin cihaz kuyruğundan güvenli bir şekilde kaldırılabildiğini bildirir. Cihaz, işleme başarıyla tamamlandığında geri dönmeli IotHubMessageResult.COMPLETE ve ioT Hub'a kullandığı protokolden bağımsız olarak iletinin ileti kuyruğundan kaldırılması gerektiğini bildirmelidir.

  protected static class MessageCallback implements com.microsoft.azure.sdk.iot.device.MessageCallback
  {
      public IotHubMessageResult onCloudToDeviceMessageReceived(Message msg, Object context)
      {
          System.out.println(
                  "Received message with content: " + new String(msg.getBytes(), Message.DEFAULT_IOTHUB_MESSAGE_CHARSET));
          // Notify IoT Hub that the message
          return IotHubMessageResult.COMPLETE;
      }
  }

İleti bırakma ve reddetme seçenekleri

Bir cihaza gelen çok sayıda iletinin başarıyla alınması ve ile sonuçlanması gerekse de IotHubMessageResult.COMPLETE, iletiyi bırakmak veya reddetmek gerekebilir.

  • AMQP ve HTTPS ile ancak MQTT ile bir uygulama şunları yapabilir:
    • IotHubMessageResult.ABANDON iletisini seçin. IoT hub'ı yeniden sorgular ve daha sonra yeniden gönderir.
    • IotHubMessageResult.REJECT iletisini seçin. IoT hub'ı iletiyi yeniden sorgulamaz ve iletiyi ileti kuyruğundan kalıcı olarak kaldırır.
  • İstemciler veya iletileri kullanıyor MQTT veya MQTT_WS kullanamıyorABANDON.REJECT

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 yeniden teslim için kuyruğa alır. Bu nedenle, cihaz uygulamasındaki ileti işleme mantığının bir kez etkili olması gerekir, böylece aynı iletiyi birden çok kez almak aynı sonucu verir.

Buluttan cihaza ileti yaşam döngüsü ve IoT Hub'ın 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ırsanız, DeviceClient örneği IoT Hub'dan gelen iletileri seyrek denetler (en az 25 dakikada bir). 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.

İleti durumu geri çağırma yöntemini oluşturma

Bir uygulama, cihazın bağlantı durumu değiştiğinde yürütülecek bir geri çağırma yöntemini kaydetmek için registerConnectionStatusChangeCallback kullanabilir. Bu şekilde uygulama, düşürülen iletilerin bağlantısını algılayabilir ve yeniden bağlanmayı dener.

Bu örnekte, IotHubConnectionStatusChangeCallbackLogger bağlantı durumu değişikliği geri çağırma yöntemi olarak kaydedilir.

client.registerConnectionStatusChangeCallback(new IotHubConnectionStatusChangeCallbackLogger(), new Object());

Geri çağırma tetiklenir ve bir ConnectionStatusChangeContext nesne geçirilir.

Geçerli bağlantı durumunu almak için arayın connectionStatusChangeContext.getNewStatus() .

IotHubConnectionStatus status = connectionStatusChangeContext.getNewStatus();

Döndürülen bağlantı durumu şu değerlerden biri olabilir:

  • IotHubConnectionStatus.DISCONNECTED
  • IotHubConnectionStatus.DISCONNECTED_RETRYING
  • IotHubConnectionStatus.CONNECTED

Bağlantı durumu değişikliğinin nedenini almak için arayın connectionStatusChangeContext.getNewStatusReason() .

IotHubConnectionStatusChangeReason statusChangeReason = connectionStatusChangeContext.getNewStatusReason();

Bağlantı durumu değişikliğinin nedenini bulmak için arayın connectionStatusChangeContext.getCause() . getCause() herhangi bir bilgi yoksa geri dönebilir null .

Throwable throwable = connectionStatusChangeContext.getCause();
if (throwable != null)
    throwable.printStackTrace();

Durum değişikliği geri çağırma yöntemi bağlantı durumu değişiklik durumunu ayıklamayı, cihaz durumunun neden değiştiğini ve bağlamı gösteren eksiksiz bir örnek için bu makalenin SDK alma ileti örneği bölümünde listelenen HandleMessages örneğine bakın.

Cihaz ile IoT Hub arasındaki bağlantıyı açma

Cihaz ile IoT Hub arasında bağlantı oluşturmak için open komutunu kullanın. Cihaz artık bir IoT Hub'a zaman uyumsuz olarak ileti gönderip alabilir. İstemci zaten açıksa yöntemi hiçbir şey yapmaz.

client.open(true);

SDK ileti alma örneği

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

Buluttan cihaza iletileri gönderme

Bu bölümde, Java için Azure IoT SDK'sından ServiceClient sınıfını kullanarak buluttan cihaza ileti gönderme açıklanmaktadır. Bir çözüm arka uç uygulaması bir IoT Hub'a bağlanır ve iletiler hedef cihazla kodlanmış IoT Hub'a gönderilir. IoT Hub gelen iletileri ileti kuyruğuna depolar ve iletiler IoT Hub ileti kuyruğundan hedef cihaza teslim edilir.

Çözüm arka uç uygulaması, ioT Hub'a gönderilen ve ileti kuyruğu üzerinden cihaz teslimini hedefleyen bir ileti için de teslim geri bildirimi isteyebilir ve alabilir.

Dependency deyimini ekleme

IoT hub hizmetinizle iletişim kurmak için uygulamanızda iothub-java-service-client paketini kullanmak için bağımlılığı ekleyin:

<dependency>
  <groupId>com.microsoft.azure.sdk.iot</groupId>
  <artifactId>iot-service-client</artifactId>
  <version>1.7.23</version>
</dependency>

İçeri aktarma deyimleri ekleme

Azure IoT Java SDK'sını ve özel durum işleyicisini kullanmak için bu içeri aktarma deyimlerini ekleyin.

import com.microsoft.azure.sdk.iot.service.*;
import java.io.IOException;
import java.net.URISyntaxException;

Bağlantı protokollerini tanımlama

Hizmet istemcisi tarafından ioT Hub ile iletişim kurmak için kullanılan uygulama katmanı protokollerini tanımlamak için IotHubServiceClientProtocol kullanın.

IotHubServiceClientProtocolyalnızca veya AMQPS_WS numaralandırmasını AMQPS kabul eder.

private static final IotHubServiceClientProtocol protocol =    
    IotHubServiceClientProtocol.AMQPS;

ServiceClient nesnesini oluşturma

Iot Hub bağlantı dizesi ve protokol sağlayarak ServiceClient nesnesini oluşturun.

private static final String connectionString = "{yourhubconnectionstring}";
private static final ServiceClient serviceClient (connectionString, protocol);

Uygulama ile IoT Hub arasındaki bağlantıyı açma

AMQP gönderen bağlantısını açın . Bu yöntem, uygulama ile IoT Hub arasında bağlantı oluşturur.

serviceClient.open();

İleti teslim geri bildirimi için bir geri bildirim alıcısı açma

IoT Hub geri bildirimine ileti teslimi göndermek için FeedbackReceiver kullanabilirsiniz. AFeedbackReceiver, yöntemi yerine bir FeedbackBatch döndüren Receive özel bir Messagealıcıdır.

Bu örnekte nesnesi FeedbackReceiver oluşturulur ve open() geri bildirim beklemek için deyimi çağrılır.

FeedbackReceiver feedbackReceiver = serviceClient
  .getFeedbackReceiver();
if (feedbackReceiver != null) feedbackReceiver.open();

İleti özellikleri ekleme

İsteğe bağlı olarak ileti özellikleri eklemek için setProperties kullanabilirsiniz. Bu özellikler cihaza gönderilen iletiye dahil edilir ve alındıkten sonra cihaz uygulaması tarafından ayıklanabilir.

Map<String, String> propertiesToSend = new HashMap<String, String>();
propertiesToSend.put(messagePropertyKey,messagePropertyKey);
messageToSend.setProperties(propertiesToSend);

Zaman uyumsuz ileti oluşturma ve gönderme

İleti nesnesi gönderilecek iletiyi depolar. Bu örnekte bir "Buluttan cihaza ileti" teslim edilir.

SetDeliveryAcknowledgement kullanarak IoT Hub ileti kuyruğuna teslim edildi/teslim edilmedi bildirimi isteyin. Bu örnekte istenen onay, teslim edildi veya teslim edilmedi şeklindedir Full.

İstemciden cihaza zaman uyumsuz bir ileti göndermek için SendAsync'i kullanın. Alternatif olarak, (zaman uyumsuz değil) yöntemini kullanabilirsiniz Send , ancak bu işlev dahili olarak eşitlenir, böylece aynı anda yalnızca bir gönderme işlemine izin verilir. İleti, uygulamadan IoT Hub'a teslim edilir. IoT Hub iletiyi ileti kuyruğuna yerleştirir ve hedef cihaza teslim edilmeye hazırdır.

Message messageToSend = new Message("Cloud to device message.");
messageToSend.setDeliveryAcknowledgementFinal(DeliveryAcknowledgement.Full);
serviceClient.sendAsync(deviceId, messageToSend);

İleti teslimi geri bildirimi alma

Uygulamadan bir ileti gönderildikten sonra uygulama, zaman aşımı değeriyle veya zaman aşımı değeri olmadan alma çağrısı yapabilir. Zaman aşımı değeri sağlanmazsa, varsayılan zaman aşımı kullanılır. Bu işlem, incelenebilen ileti teslimi geri bildirim özelliklerini içeren bir FeedbackBatch nesnesini geri geçirir.

Bu örnek, alıcıyı FeedbackBatch oluşturur ve getEnqueuedTimeUtc çağrılarını çağırarak iletinin sıralandığı zamanı yazdırmaktadır.

FeedbackBatch feedbackBatch = feedbackReceiver.receive(10000);
if (feedbackBatch != null) {
  System.out.println("Message feedback received, feedback time: "
    + feedbackBatch.getEnqueuedTimeUtc().toString());
}

SDK ileti gönderme örnekleri

Azure IoT SDK kitaplığını yükleme

İlgili kodu çağırmadan önce geliştirme makinenize azure-iot-device SDK kitaplığını yükleyin:

pip install azure-iot-device

IoT cihazlarına ve IoT cihazlarından ileti göndermek için kullanılan iki Python SDK sınıfı vardır. Bu sınıflardan ileti işleme yöntemleri bu sayfadaki bölümlerde açıklanmıştır.

  • IoTHubDeviceClient sınıfı, bir cihazdan Azure IoT Hub'a zaman uyumlu bağlantı oluşturma ve IoT Hub'dan ileti alma yöntemlerini içerir.

  • IoTHubRegistryManager sınıfı, IoT Hub Kayıt Defteri Yöneticisi işlemleri için API'leri içerir. Bu makalede, bu sınıftaki yöntemler IoT Hub'a bağlanmayı ve bir cihaza ileti göndermeyi gösterir.

Buluttan cihaza iletileri alma

Bu bölümde, Python için Azure IoT SDK'sından IoTHubDeviceClient sınıfı kullanılarak buluttan cihaza iletilerin nasıl alındığı açıklanmaktadır.

Python tabanlı bir cihaz uygulamasının buluttan cihaza iletileri alabilmesi için IoT Hub'a bağlanması ve ardından IoT Hub'dan gelen iletileri işlemek için bir geri çağırma iletisi işleyicisi ayarlaması gerekir.

IoTHubDeviceClient nesnesini içeri aktarma

azure.iot.device SDK'sından IoTHubDeviceClient işlevleri içeri aktarmak için bir kod satırı ekleyin.

from azure.iot.device import IoTHubDeviceClient

Cihaz istemcisini bağlama

IoTHubDeviceClient örneğini oluşturarak create_from_connection_string bir IoT Hub bağlantı dizesi geçirin. Bu, cihazdan IoT Hub'a bir bağlantı oluşturur.

Alternatif olarak, aşağıdaki yöntemlerden birini kullanarak bir cihaza bağlanabilirsiniz IoTHubDeviceClient:

deviceConnectionString = "{your IoT hub connection string}";
client = IoTHubDeviceClient.create_from_connection_string ({deviceConnectionString})

Yeniden bağlantıyı işleme

IoTHubDeviceClient varsayılan olarak bırakılan bir bağlantıyı yeniden kurmaya çalışır. Yeniden bağlanma davranışı, connection_retry ve connection_retry_interval parametreler tarafından IoTHubDeviceClient yönetilir.

İleti işleyicisi oluşturma

Cihaza gelen iletileri işlemek için ileti işleyici işlevini oluşturun.

Bu örnekte, message_handler bir ileti alındığında çağrılır. İleti özellikleri (.items) bir döngü kullanılarak konsola yazdırılır.

def message_handler(message):
    global RECEIVED_MESSAGES
    RECEIVED_MESSAGES += 1
    print("")
    print("Message received:")

    # print data from both system and application (custom) properties
    for property in vars(message).items():
        print ("    {}".format(property))

    print("Total calls received: {}".format(RECEIVED_MESSAGES))

İleti işleyicisini atama

nesneye ileti işleyicisi yöntemini atamak için on_message_received yöntemini IoTHubDeviceClient kullanın.

Bu örnekte adlı bir ileti işleyici yöntemi message_handler nesnesine IoTHubDeviceClient client eklenir. client nesnesi, IoT Hub'dan buluttan cihaza ileti almak için bekler. Bu kod, ileti için 300 saniyeye (5 dakika) kadar bekler veya klavye tuşuna basıldığında çıkar.

try:
    # Attach the handler to the client
    client.on_message_received = message_handler

    while True:
        time.sleep(300)
except KeyboardInterrupt:
    print("IoT Hub C2D Messaging device sample stopped")
finally:
    # Graceful exit
    print("Shutting down IoT Hub Client")
    client.shutdown()

SDK ileti alma örneği

İleti Alma - Azure IoT Hub'dan bir cihaza gönderilen Buluttan Cihaza (C2D) iletileri alın.

Buluttan cihaza iletileri gönderme

Bu bölümde, Python için Azure IoT SDK'sından IoTHubRegistryManager sınıfını kullanarak buluttan cihaza ileti gönderme açıklanmaktadır. Bir çözüm arka uç uygulaması bir IoT Hub'a bağlanır ve iletiler hedef cihazla kodlanmış IoT Hub'a gönderilir. IoT Hub gelen iletileri ileti kuyruğuna depolar ve iletiler IoT Hub ileti kuyruğundan hedef cihaza teslim edilir.

IoTHubRegistryManager nesnesini içeri aktarma

Aşağıdaki import deyimi ekleyin. IoTHubRegistryManager , IoT Hub Kayıt Defteri Yöneticisi işlemleri için API'ler içerir.

from azure.iot.hub import IoTHubRegistryManager

IoT Hub kayıt defteri yöneticisini bağlama

IoT Hub bağlantı dizesi ile bir IoT hub'ına bağlanan IoTHubRegistryManager nesnesinin örneğini from_connection_string.

IoTHubConnectionString = "{Primary connection string to an IoT hub}"
registry_manager = IoTHubRegistryManager.from_connection_string(IoTHubConnectionString)

İleti oluşturma ve gönderme

Send_c2d_message kullanarak cihaza bulut üzerinden (IoT Hub) ileti gönderin.

send_c2d_message şu parametreleri kullanır:

  • deviceID - Hedef cihazın dize tanımlayıcısı.
  • message - Buluttan cihaza ileti. İleti türündedir str (dize).
  • properties- türündeki dictisteğe bağlı bir özellik koleksiyonu. Özellikler, uygulama özelliklerini ve sistem özelliklerini içerebilir. Varsayılan değer şudur: {}.

Bu örnek, hedef cihaza bir test iletisi gönderir.

# define the device ID
deviceID = "Device-1"

# define the message
message = "{\"c2d test message\"}"

# include optional properties
props={}
props.update(messageId = "message1")
props.update(prop1 = "test property-1")
props.update(prop1 = "test property-2")
prop_text = "Test message"
props.update(testProperty = prop_text)

# send the message through the cloud (IoT Hub) to the device
registry_manager.send_c2d_message(deviceID, message, properties=props)

SDK ileti gönderme örneği

send_message.py - Buluttan cihaza ileti göndermeyi gösterir.

Node.js mesajlaşma paketlerini yükleme

Geliştirme makinenize azure-iot-device ve azure-iothub paketlerini yüklemek için şu komutları çalıştırın:

npm install azure-iot-device --save
npm install azure-iothub --save

azure-iot-device paketi, IoT cihazlarıyla arabirim oluşturan nesneler içerir. Bu makalede, IoT Hub'dan ileti alan sınıf kodu açıklanmaktadır Client .

azure-iothub paketi, IoT Hub ile arabirim oluşturan nesneler içerir. Bu makalede, IoT Hub aracılığıyla bir uygulamadan cihaza ileti gönderen sınıf kodu açıklanmaktadır Client .

Cihaz uygulamasında ileti alma

Bu bölümde, Node.js için Azure IoT SDK'sında azure-iot-device paketini kullanarak buluttan cihaza iletilerin nasıl alındığı açıklanmaktadır.

Node.js tabanlı bir cihaz uygulamasının buluttan cihaza iletileri alması için IoT Hub'a bağlanması ve ardından IoT Hub'dan gelen iletileri işlemek için bir geri çağırma dinleyicisi ve ileti işleyicisi ayarlaması gerekir. Cihaz uygulaması, cihazdan IoT Hub'a ileti bağlantısının kesilmesi durumunda bağlantı kesilmelerini algılayabilmeli ve işleyebilmelidir.

İstemci modülü oluşturma

paketinden azure-iot-device İstemci sınıfını kullanarak bir Client oluşturun. sınıfı, Client bir cihazın IoT Hub'dan alıp IoT Hub'a göndermek için kullanabileceği yöntemleri içerir.

const Client = require('azure-iot-device').Client;

Aktarım protokolü seçme

Client nesnesi şu protokolleri destekler:

  • Amqp
  • Http- kullanılırken HttpClient örnek, IoT Hub'dan gelen iletileri seyrek denetler (en az 25 dakikada bir).
  • Mqtt
  • MqttWs
  • AmqpWs

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.

Bu örnekte AMQP protokolü bir Protocol değişkene atanır. Bu Protokol değişkeni, bu makalenin Client.fromConnectionString bağlantı dizesi ekle bölümündeki yöntemine geçirilir.

const Protocol = require('azure-iot-device-mqtt').Amqp;

İleti tamamlama, reddetme ve bırakma özellikleri

seçilen protokole bağlı olarak ileti tamamlama, reddetme ve bırakma yöntemleri kullanılabilir.

AMQP ve HTTP

AMQP ve HTTP aktarımları bir iletiyi tamamlayabilir, reddedebilir veya bırakabilir:

  • Tamamlandı - bir iletiyi tamamlamak için, buluttan cihaza iletisini gönderen hizmete iletinin alındığı bildirilir. IoT Hub iletiyi ileti kuyruğundan kaldırır. yöntemi biçimindedir client.complete(message, callback function).
  • Reddet - Bir iletiyi reddetmek için, buluttan cihaza iletiyi gönderen hizmete iletinin cihaz tarafından işlenmediği bildirilir. IoT Hub, iletiyi cihaz kuyruğundan kalıcı olarak kaldırır. yöntemi biçimindedir client.reject(message, callback function).
  • Bırakma - Bir iletiyi bırakmak için IoT Hub hemen yeniden göndermeyi dener. IoT Hub, gelecekte kullanılmak üzere iletiyi cihaz kuyruğunda tutar. yöntemi biçimindedir client.abandon(message, callback function).
MQTT

MQTT ileti tamamlama, reddetme veya bırakma işlevlerini desteklemez. Bunun yerine, MQTT varsayılan olarak bir iletiyi kabul eder ve ileti IoT Hub ileti kuyruğundan kaldırılır.

Yeniden teslim denemeleri

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 yeniden teslim için kuyruğa alır. Bu nedenle, cihaz uygulamasındaki ileti işleme mantığının bir kez etkili olması gerekir, böylece aynı iletiyi birden çok kez almak aynı sonucu verir.

IoT Hub dizesini ve aktarım protokollerini ekleme

Şu parametreleri kullanarak cihazdan IoT hub'a bağlantı kurmak için FromConnectionString çağrısı yapın:

  • connStr - IoT hub'ı için "cihaz bağlantısı" izinlerini kapsülleyen bir bağlantı dizesi. bağlantı dizesi şu biçimde Ana Bilgisayar Adı, Cihaz Kimliği ve Paylaşılan Erişim Anahtarı içerir: "HostName=<iothub_host_name>; DeviceId=<device_id>; SharedAccessKey=<device_key>"
  • transportCtor - Aktarım protokolü.
const Protocol = require('azure-iot-device-mqtt').Amqp;
let client = Client.fromConnectionString(deviceConnectionString, Protocol);

Gelen ileti işleyicisi oluşturma

Gelen her ileti için ileti işleyicisi çağrılır.

Bir ileti başarıyla alındıktan sonra AMQP veya HTTP aktarımı kullanılıyorsa ioT Hub'a iletinin ileti kuyruğundan kaldırılabildiğini bildirmek için yöntemini çağırın client.complete .

Örneğin, bu ileti işleyicisi ileti kimliğini ve ileti gövdesini konsola yazdırır, ardından IoT Hub'a iletiyi işlediğini ve cihaz kuyruğundan güvenli bir şekilde kaldırılabildiğini bildirmek için çağırır client.complete . MQTT aktarımı kullanıyorsanız çağrısı complete gerekli değildir ve atlanabilir. AMQP veya HTTPS aktarımı için çağrısıcomplete gereklidir.

function messageHandler(msg) {
  console.log('Id: ' + msg.messageId + ' Body: ' + msg.data);
  client.complete(msg, printResultFor('completed'));
}

Bağlantı bağlantısı kesme işleyicisi oluşturma

Bağlantı kesildiğinde bağlantı kesme işleyicisi çağrılır. Bağlantı kesme işleyicisi, yeniden bağlanma kodu uygulamak için kullanışlıdır.

Bu örnek, konsolun bağlantısını kesme hata iletisini yakalar ve görüntüler.

function disconnectHandler() {
  clearInterval(sendInterval);
  sendInterval = null;
  client.open().catch((err) => {
    console.error(err.message);
  });
}

Olay dinleyicileri ekleme

.on yöntemini kullanarak bu olay dinleyicilerini belirtebilirsiniz.

  • Bağlantı işleyicisi
  • Hata işleyicisi
  • Bağlantı kesme işleyicisi
  • İleti işleyicisi

Bu örnek, daha önce tanımlanan ileti ve bağlantı kesme işleyicilerini içerir.

client.on('connect', connectHandler);
client.on('error', errorHandler);
client.on('disconnect', disconnectHandler);
client.on('message', messageHandler);

IoT Hub bağlantısını açma

Bir IoT cihazı ile IoT Hub arasında bağlantı açmak için open yöntemini kullanın. Bir hatayı yakalamak ve işleyici kodunu çağırmak için kullanın .catch(err) .

Örneğin:

client.open()
.catch((err) => {
  console.error('Could not connect: ' + err.message);
});

SDK ileti alma örneği

simple_sample_device - IoT hub'ınıza bağlanan ve buluttan cihaza iletileri alan bir cihaz uygulaması.

Buluttan cihaza iletileri gönderme

Bu bölümde, Node.js için Azure IoT SDK'sından azure-iothub paketini kullanarak buluttan cihaza ileti gönderme açıklanmaktadır. Daha önce açıklandığı gibi, bir çözüm arka uç uygulaması bir IoT Hub'a bağlanır ve iletiler hedef cihazla kodlanmış IoT Hub'a gönderilir. IoT Hub gelen iletileri ileti kuyruğuna depolar ve iletiler IoT Hub ileti kuyruğundan hedef cihaza teslim edilir.

Çözüm arka uç uygulaması, ioT Hub'a gönderilen ve ileti kuyruğu üzerinden cihaz teslimini hedefleyen bir ileti için de teslim geri bildirimi isteyebilir ve alabilir.

İstemci ve ileti modüllerini yükleme

paketinden sınıfını kullanarak bir Client nesnesi bildirinazure-iothub.Client

paketinden sınıfını kullanarak bir Message nesnesi bildirinazure-iot-common.Message

'use strict';
var Client = require('azure-iothub').Client;
var Message = require('azure-iot-common').Message;

İstemci nesnesi oluşturma

Şu parametreleri kullanarak fromConnectionString kullanarak İstemci oluşturun:

  • IoT Hub bağlantı dizesi
  • Aktarım türü

Bu örnekte, serviceClient nesnesi aktarım türüyle Amqp oluşturulur.

var connectionString = '{IoT Hub connection string}';
var serviceClient = Client.fromConnectionString(connectionString,`Amqp`);

İstemci bağlantısını açma

Uygulama ile Client IoT Hub arasında bir bağlantı açmak için open yöntemini çağırın.

open ile veya işlem tamamlandığında çağrılan open bir geri çağırma işlevi belirtilmeden çağrılabilir.

Bu örnekte yöntemi isteğe open bağlı err bir açık bağlantı geri çağırma işlevi içerir. Açık bir hata oluşursa bir hata nesnesi döndürülür. Açık bağlantı başarılı olursa bir null geri çağırma değeri döndürülür.

serviceClient.open(function (err)
if (err)
  console.error('Could not connect: ' + err.message);

İleti oluşturma

İleti nesnesi zaman uyumsuz buluttan cihaza iletisini içerir. İleti işlevselliği AMQP, MQTT ve HTTP üzerinde aynı şekilde çalışır.

İleti nesnesi, bu özellikler de dahil olmak üzere çeşitli özellikleri destekler. Tam liste için ileti özelliklerine bakın.

  • ack - Teslim geri bildirimi. Sonraki bölümde açıklanmıştır.
  • properties - Özel ileti özelliklerini depolamaya yönelik dize anahtarlarını ve değerlerini içeren bir eşleme.
  • messageId - İki yönlü iletişimi ilişkilendirmek için kullanılır.

İleti nesnesi örneği oluşturulurken ileti gövdesini ekleyin. Bu örnekte bir 'Cloud to device message.' ileti eklenir.

var message = new Message('Cloud to device message.');
message.ack = 'full';
message.messageId = "My Message ID";

Teslim bildirimi

Gönderen bir program, buluttan cihaza her ileti için IoT Hub'dan teslim (veya süre sonu) bildirimleri isteyebilir. Bu seçenek, gönderen programın bilgilendirme, yeniden deneme veya telafi mantığını kullanmasını sağlar. İleti geri bildirimi işlemlerinin ve özelliklerinin tam açıklaması İleti geri bildirimi sayfasında açıklanmıştır.

İleti geri bildirimi almak için her iletinin teslim bildirimi ack özelliği için bir değer içermesi gerekir. ack özelliği şu değerlerden biri olabilir:

  • none (varsayılan): geri bildirim iletisi oluşturulmaz.

  • sent: İleti tamamlandıysa bir geri bildirim iletisi alın.

  • : cihaz tarafından tamamlanmadan iletinin süresi dolduysa (veya teslim sayısı üst sınırına ulaşıldıysa) bir geri bildirim iletisi alın.

  • full: hem gönderilen hem de gönderilmeyen sonuçlar için geri bildirim.

Bu örnekte özelliği olarak ack ayarlanmıştır fullve bir ileti için hem gönderilmiş hem de gönderilmemiş ileti teslim geri bildirimi istemektedir.

message.ack = 'full';

İleti geri bildirim alıcı geri çağırma işlevi getFeedbackReceiver kullanılarak öğesine bağlanırClient.

İleti geri bildirimi alıcısı iki bağımsız değişken alır:

  • Hata nesnesi (null olabilir)
  • AmqpReceiver nesnesi - İstemci tarafından yeni geri bildirim iletileri alındığında olayları yayar.

Bu örnek işlev konsola bir teslim geri bildirim iletisi alır ve yazdırır.

function receiveFeedback(err, receiver){
  receiver.on('message', function (msg) {
    console.log('Feedback message:')
    console.log(msg.getData().toString('utf-8'));
  });
}

Bu kod, geri bildirim geri çağırma işlevini kullanarak getFeedbackReceiverhizmet Client nesnesine bağlarreceiveFeedback.

serviceClient.getFeedbackReceiver(receiveFeedback);

İleti tamamlama sonuçları işleyicisi tanımlama

İleti gönderme tamamlama geri çağırma işlevi, her ileti gönderildikten sonra çağrılır.

Bu örnek işlev, ileti send işlemi sonuçlarını konsola yazdırır. Bu örnekte işlev, printResultFor sonraki bölümde açıklanan işleve send bir parametre olarak sağlanır.

function printResultFor(op) {
  return function printResult(err, res) {
    if (err) console.log(op + ' error: ' + err.toString());
    if (res) console.log(op + ' status: ' + res.constructor.name);
  };
}

İleti gönderme

IoT Hub aracılığıyla cihaz uygulamasına zaman uyumsuz bir buluttan cihaza ileti göndermek için send işlevini kullanın.

send şu parametreleri destekler:

  • deviceID - Hedef cihazın cihaz kimliği.
  • message - Cihaza gönderilecek iletinin gövdesi.
  • done - İşlem tamamlandığında çağrılacak isteğe bağlı işlev. Bitti, iki bağımsız değişkenle çağrılır:
    • Hata nesnesi (null olabilir).
    • aktarıma özgü yanıt nesnesi günlüğe kaydetme veya hata ayıklama için kullanışlıdır.

Bu kod, IoT Hub aracılığıyla cihaz uygulamasına buluttan cihaza ileti göndermeyi çağırır send . Önceki bölümde tanımlanan geri çağırma işlevi printResultFor , teslim onay bilgilerini alır.

var targetDevice = '{device ID}';
serviceClient.send(targetDevice, message, printResultFor('send'));

Bu örnekte, cihazınıza ileti gönderme ve cihaz buluttan cihaza iletisini kabul ettiğinde geri bildirim iletisini işleme işlemleri gösterilmektedir:

serviceClient.open(function (err) {
  if (err) {
    console.error('Could not connect: ' + err.message);
  } else {
    console.log('Service client connected');
    serviceClient.getFeedbackReceiver(receiveFeedback);
    var message = new Message('Cloud to device message.');
    message.ack = 'full';
    message.messageId = "My Message ID";
    console.log('Sending message: ' + message.getData());
    serviceClient.send(targetDevice, message, printResultFor('send'));
  }
});

SDK ileti gönderme örneği

send_c2d_message.js - IoT Hub aracılığıyla bir cihaza C2D iletileri gönderin.

Bağlantı yeniden bağlanma ilkesi

Bu makalede, cihazın IoT Hub bağlantısına veya ioT Hub bağlantısına dış uygulama için ileti yeniden deneme ilkesi gösterilmiyor. Üretim kodunda, dayanıklı uygulamalar oluşturmak için cihaz yeniden bağlantılarını yönetme bölümünde açıklandığı gibi bağlantı yeniden deneme ilkeleri uygulamanız gerekir.

İleti saklama süresi, yeniden deneme denemeleri ve maksimum teslim sayısı

IoT Hub'dan buluttan cihaza ileti gönderme bölümünde açıklandığı gibi, portal IoT Hub yapılandırma seçeneklerini veya Azure CLI'yı kullanarak aşağıdaki ileti değerlerinin varsayılanlarını görüntüleyebilir ve yapılandırabilirsiniz. Bu yapılandırma seçenekleri ileti teslimini ve geri bildirimi etkileyebilir.

  • Varsayılan TTL (yaşam süresi) - IoT Hub tarafından süresi dolmadan önce bir cihazın kullanabileceği iletinin kullanılabilmesi için gereken süre.
  • Geri bildirim saklama süresi - IoT Hub'ın buluttan cihaza iletilerin süresinin dolması veya teslim edilmesi için geri bildirimi tutma süresi.
  • IoT Hub'ın bir cihaza buluttan cihaza ileti göndermeyi deneme sayısı.