Azure IoT – Cihaz simülasyonu ile mesaj yönlendirme

Azure IoT​​ – Cihaz simülasyonu ile​​ uygulamalar 2

Merhaba,

Önceki yazımda, Azure IoT Hub’ın kurulumunu, nesnenin​​ kayıt olmasını, nesnenin IoT hub’a​​ mesaj(event) göndermesini, gönderilen mesajın IoT hub’dan okunmasını incelemiştik. Şimdi, belli türdeki mesajların IoT hub’ın event endpoint’ine gönderilmesini, belli türdeki mesajların farklı bir katmana yönlendirilmesini inceleyelim.​​ Örneğin, kritik bir değer içeren mesajların hemen işlenmek üzere farklı bir uygulamaya​​ gönderilmesi​​ durumunu​​ düşünebiliriz.​​ Önceki yazımdan örnek vermek gerekirse, sıcaklık ve nem değerlerinin daha sonra analiz edilmek üzere depolanması , alarm kodu içeren bir mesajın ise arıza kaydı açılması için hemen işleneceği ortama alınması senaryosunu düşünebiliriz.​​ Yine üç adet console application içeren bir solution’ımız var.​​ Aslında önceki uygulamada oluşturduğumuz solution’ını biraz değiştiriyoruz.​​ Kritik​​ şeklinde işaretlenmiş mesajları IoT hub altındaki event endpoint’ine değil, service bus’a route edeceğiz.

 

Cihaz simülasyonu​​ “Project”​​ ’inin​​ SendDeviceToCloudMessagesAsync​​ method’unu aşağıdaki şekilde değiştiriyoruz.​​ Kritik mesaj kontrolünü yapan IF bloğunu kırmızı ile işaretledim.

 

 

private static async void SendDeviceToCloudMessagesAsync()

{

 ​​ ​​ ​​​​ double minTemperature = 20;

 ​​ ​​ ​​​​ double minHumidity = 60;

 ​​ ​​ ​​​​ Random rand = new Random();

 

 ​​ ​​ ​​​​ while (true)

 ​​ ​​ ​​​​ {

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ double currentTemperature = minTemperature + rand.NextDouble() * 15;

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ double currentHumidity = minHumidity + rand.NextDouble() * 20;

 

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ var telemetryDataPoint = new

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ {

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ deviceId = "myFirstDevice",

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ temperature = currentTemperature,

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ humidity = currentHumidity

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ };

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ var messageString = JsonConvert.SerializeObject(telemetryDataPoint);

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ string levelValue;

 

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ if (rand.NextDouble() > 0.7)

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ {

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ messageString = "This is a critical message";

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ levelValue = "critical";

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ }

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ else

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ {

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ levelValue = "normal";

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ }

 

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ var message = new Message(Encoding.ASCII.GetBytes(messageString));

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ message.Properties.Add("level", levelValue);

 

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ await deviceClient.SendEventAsync(message);

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ Console.WriteLine("{0} > Sent message: {1}", DateTime.Now, messageString);

 

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ await Task.Delay(1000);

 ​​ ​​ ​​​​ }

}

 

Kritik mesajları route edeceğimiz service bus queue’su aşağıdaki gibidir.

 

 

IoT hub ‘a,​​ endpoint olarak üstteki queue’yu ekliyorum.​​ Endpoint’in;​​ ismini​​ CriticalQueue​​ , type’ını Service Bus Queue olarak belirledim. Namespace’ini dropdown menüden, queue’yu dropdown menüden set edebilirsiniz.

 

Şimdi, kritik tag’li mesajın bu queue’ya route edilmesi için route oluşturalım.

 

 

Kritik queue’sundaki mesajları okuması için ReadCriticalQueue isimli console appcalition’ını oluşturalım. Code’u aşağıdaki gibidir.

 

using System.IO;

using Microsoft.ServiceBus.Messaging;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace ReadCriticalQueue

{

 ​​ ​​ ​​​​ class Program

 ​​ ​​ ​​​​ {

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ static void Main(string[] args)

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ {

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ Console.WriteLine("Receive critical messages. Ctrl-C to exit.\n");

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ var connectionString = "Endpoint=sb://iotlabservicebus.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=aijQFDq0eU7idh8pY4GlC5nKce3bdYuX7AFDcpra7I=";

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ var queueName = "iotlabqueue1";

 

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ var client = QueueClient.CreateFromConnectionString(connectionString, queueName);

 

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ client.OnMessage(message =>

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ {

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ Stream stream = message.GetBody<Stream>();

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ StreamReader reader = new StreamReader(stream, Encoding.ASCII);

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ string s = reader.ReadToEnd();

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ Console.WriteLine(String.Format("Message body: {0}", s));

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ });

 

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ Console.ReadLine();

 ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ }

 ​​ ​​ ​​​​ }

}

 

Connection string ve queue name değelerini azure portal’dan service bus özelliklerinden temin edebilirsiniz. Nuget paket yöneticisi ile windowsazure.servicebus isimli paketi yüklemeyi unutmamak gerekir.

 

Solution’ın çalıştırdığımızda, critical tag’li veri ile diğer verinin farklı application’lar tarafından okunduğunu görebiliriz.

 

 

3’üncü cmd ekranında mesaj gönderimi, ilk cmd ekranında critical tag’li mesajın okunması, ikinci cmd ekranında normal data’nın okunması gözlenmiş oldu.

 

Service bu queue’da da mesaj oluştuğunu görebilirsiniz.

 

Device’in gönderdiği mesajın tag’ine göre mesajın farklı bir katmana route edilmesi sürecini incelemiş olduk.

 

Neşeli günler dilerim.

 

Kaynaklar:

https://msdn.microsoft.com/library/hh680901(v=pandp.50).aspx​​ 

https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-csharp-csharp-process-d2c

https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-get-started-with-queues

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *