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
veyafor
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
- veModuleClient
için çeşitli aktarıma özgü ayarları tanımlamak içinDeviceClient
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ı OnC2dMessageReceivedAsync
bir 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
veyaAmqp_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
: hemNegative
hem dePositive
sonuçlar için geri bildirim.
Bu örnekte özelliği olarak Ack
ayarlanmıştır Full
ve 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 CancellationToken
tanı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ürnull
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ür
ReceiveAsync
. Belirtilen gönderilen iletiyi parametresine göreTask
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ı. olabilirnull
.context
- türündeobject
isteğe bağlı bir bağlam. Belirtilmemişse kullanınnull
.
Bu örnekte, bağlam parametresi olmayan adlı MessageCallback
bir callback
yöntem öğesine setMessageCallback
geç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
veyaMQTT_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.
IotHubServiceClientProtocol
yalnı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 Message
alı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
Hizmet istemcisi örneği - İleti örneği gönder, #1.
Hizmet istemcisi örneği - İleti örneği gönder, #2.
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ündedirstr
(dize).properties
- türündekidict
isteğ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ırkenHttp
Client
ö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 full
ve bir ileti için hem gönderilmiş hem de gönderilmemiş ileti teslim geri bildirimi istemektedir.
message.ack = 'full';
İleti geri bildirim alıcısını bağlama
İ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 getFeedbackReceiver
hizmet 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ı.