Geçen gün Twitter’dan bir tweet paylaşmıştım. Yeni bir yazının yolda olduğu mesajı ile beraber. Ahaaa da işte bu o yazı 🙂 Buyrun başlıyoruz…
Pazar akşamı eğlencesi… Raspberry Pi, sensörler, dirençler vs…. Tabi ki Azure ile entegrasyon… Ve tabi ki yeni bir yazı… 👨🏻💻#IoT #Azure pic.twitter.com/HEfawQfB8s
— Arda Cetinkaya (@ArdaCetinkaya) November 12, 2017
Bu küçük ve basit projeden bahsederek, Internet Of Things(IoT)’in ne olduğu, neleri nasıl yapabiliyoruz, bunu bir “konsept” olarak anlatmaya çalışacağım.
Öncelikle projemiz Raspberry Pi(3) üzerinde; Windows IoT Core ile basit bir sıcaklık ve nem ölçer. DHT11 sıcaklık sensörü ile ortamdaki sıcaklığı ölçüp, I2C üzerinden bir LCD(16×2) ekrana bunu yazdırıyoruz. Aynı zamanda Azure IoT Hub servisi üzerinden bu bilgiyi düzenli aralıklar ile Microsoft Azure’a aktarıyoruz. Kullandığım sensör, bunların bir biri ile bağlantısı ve bunları nasıl alabilirsiniz gibi konuları yazının sonunda bulabilirsiniz. Şimdilik bunlara takılmayalım.
Nem ve sıcaklık ölçen Raspberry Pi cihazımızı basit bir IoT cihazı olarak düşünebiliriz. Bu cihazın üzerinde Windows IoT Core çalışıyor. Dolayısıyla UWP tipinde bir uygulamayı bu cihazın üzerinde geliştirip, çalıştırabiliyoruz. Window IoT Core’da çalışacak uygulamamız bir Background Application(IoT) uygulaması olacak. Dolayısıyla projemizi seçerken buna göre seçmek gerekecek. Tabi öncelikle proje şablonunu yüklemek gerekecek. Yüklemek için Visual Studio Market Place‘e gitmeniz yeterli.
Projemize başlamadan önce, geliştireceğimiz senaryo için aşağıdaki NuGet paketlerini de projemize eklememiz gerekecek.
Dht, sensörümüzü kullanabilmemiz için gerekli kütüphane, Microsoft.Azure.Device.Client, IoT cihazımızın Azure IoT Hub ile iletişim kurmasını sağlayan kütüphaneler. Microsoft.NETCore.UniversalWindowsPlatform ise Windows IoT Core için temel kütüphaneleri barındırıyor. Bu zaten projeyi yarattığımız zaman otomatik olarak geliyor.
Projeyi yarattıktan sonra aşağıdaki gibi bir metoda sahip bir sınıf oluşacak.
public sealed class StartupTask : IBackgroundTask { public void Run(IBackgroundTaskInstance taskInstance) { } }
IBackgroudTask arayüzünden oluşturulan bu sınıf, Windows IoT Core’da arka tarafta çalışan uygulamalar için başlangıç noktası. Run() metodunun içerisinde bütün gereksinimlerimizi yazabiliriz. Bizim projemizde de burası giriş noktamız.
public void Run(IBackgroundTaskInstance taskInstance) { //Attach to cancel event to cancel if it is needed; taskInstance.Canceled += TaskInstance_Canceled; _deferral = taskInstance.GetDeferral(); _deviceClient = DeviceClient.CreateFromConnectionString(_deviceConnectionString); //Thread timer to check sensor data _periodicTimer = ThreadPoolTimer.CreatePeriodicTimer(new TimerElapsedHandler(PeriodicTimerCallback), TimeSpan.FromSeconds(60)); //Init PINs and LCD _pin = GpioController.GetDefault().OpenPin(4, GpioSharingMode.Exclusive); _screen = new displayI2C.LCDisplay(DEVICE_I2C_ADDRESS, I2C_CONTROLLER_NAME, RS, RW, EN, D4, D5, D6, D7, BL); _screen.Init(); }
Burada bir kaç önemli satırın üzerinden geçerek bazı şeyleri netleştirmek isterim. Öncelikle uygulamamızın Azure IoT Hub ile iletişimini sağlayan DeviceClient sınıfı üzerinden sağlıyoruz. 8 satırda, bu cihazımızı oluşturuyoruz. Azure tarafında oluşturduğumuz cihaz bilgileri ile cihazımız bu sınıf üzerinden eşleşiyor. Cihazımızın Azure IoT Hub ile iletişimini sağlamak için öncelikle Azure IoT Hub üzerinde bir Hub yaratıp, daha sonra cihazımızı Provision etmemiz lazım. Bunlar ile ilgili daha ayrıntılı linkleri yine aşağıda paylaşacağım. Azure IoT Hub üzerinde tanımladığımız Hub bilgileri içerisinde bir ConnectionString bilgisi var. Bunu DeviceClient.CreateFromConnectionString() ile kullanıp cihazımızı Hub ile eşleştiriyoruz. Burada önemli bir nokta var, bizim senaryomuzda Hub’ın Azure Iot Hub tarafında yaratılmış olduğunu varsaydık. Eğer orada yaratmadıysak, kod tarafında önce Hub’ı yaratan bir geliştirmemiz lazım.
TheadPoolTimer ile sensörleri ne kadar bir sürede kontrol edeceğimizi belirtiyoruz. Daha sonra Raspberry Pi tarafındaki PIN’leri ve LCD ekranımızı tanımlıyoruz. LCD ekranı için yine bir kütüphane kullandım.