Azure Cosmos DB'yi kullanarak Azure IoT Hub cihaz bağlantısı olaylarını sıralama

Azure Event Grid, etkinlik tabanlı uygulamalar oluşturmanıza ve iş çözümlerinizde IoT olaylarını kolayca tümleştirmenize yardımcı olur. bu makalede, Cosmos DB ' de en son cihaz bağlantısı durumunu izlemek ve depolamak için kullanılabilen bir kurulum adım adım açıklanmaktadır. cihaz bağlantısı kesik ve cihaz bağlantısı kesilen olaylarda bulunan sıra numarasını kullanacağız ve en son durumu Cosmos DB olarak depolar. Cosmos DB bir koleksiyona karşı yürütülen bir uygulama mantığı olan saklı bir yordam kullanacağız.

Sıra numarası, onaltılık bir sayının dize gösterimidir. Daha büyük sayıyı belirlemek için dize karşılaştırma kullanabilirsiniz. Dizeyi onaltılı olarak dönüştürüyorsanız sayı 256 bitlik bir sayı olacaktır. Sıra numarası kesinlikle artıyor ve en son olay diğer olaylardan daha yüksek bir sayıya sahip olacaktır. Bu, sık kullanılan cihaz bağlantısı ve bağlantınız varsa ve Azure Event Grid etkinlik sıralamasını desteklemediğinden bir aşağı akış eylemini tetiklemek için yalnızca en son olayın kullanılmasını sağlamak istiyorsanız kullanışlıdır.

Önkoşullar

Saklı yordam oluşturma

İlk olarak, bir saklı yordam oluşturun ve bunu, gelen olayların sıra numaralarını karşılaştıran ve veritabanındaki cihaz başına en son olayı kaydeden bir mantığı çalıştıracak şekilde ayarlayın.

  1. Cosmos DB SQL apı 'nizin Veri Gezgini > öğeleri > yeni saklı yordam' i seçin.

    Saklı yordam oluştur

  2. Saklı yordam KIMLIĞI için Latestdeviceconnectionstate girin ve saklı yordam gövdesinde aşağıdakileri yapıştırın. Bu kodun, saklı yordam gövdesinde var olan herhangi bir kodu değiştirmesini unutmayın. Bu kod, cihaz KIMLIĞI başına bir satır tutar ve en yüksek sıra numarasını tanımlayarak bu cihaz KIMLIĞININ en son bağlantı durumunu kaydeder.

    // SAMPLE STORED PROCEDURE
    function UpdateDevice(deviceId, moduleId, hubName, connectionState, connectionStateUpdatedTime, sequenceNumber) {
      var collection = getContext().getCollection();
      var response = {};
    
      var docLink = getDocumentLink(deviceId, moduleId);
    
      var isAccepted = collection.readDocument(docLink, function(err, doc) {
        if (err) {
          console.log('Cannot find device ' + docLink + ' - ');
          createDocument();
        } else {
          console.log('Document Found - ');
          replaceDocument(doc);
        }
      });
    
      function replaceDocument(document) {
        console.log(
          'Old Seq :' +
            document.sequenceNumber +
            ' New Seq: ' +
            sequenceNumber +
            ' - '
        );
        if (sequenceNumber > document.sequenceNumber) {
          document.connectionState = connectionState;
          document.connectionStateUpdatedTime = connectionStateUpdatedTime;
          document.sequenceNumber = sequenceNumber;
    
          console.log('replace doc - ');
    
          isAccepted = collection.replaceDocument(docLink, document, function(
            err,
            updated
          ) {
            if (err) {
              getContext()
                .getResponse()
                .setBody(err);
            } else {
              getContext()
                .getResponse()
                .setBody(updated);
            }
          });
        } else {
          getContext()
            .getResponse()
            .setBody('Old Event - current: ' + document.sequenceNumber + ' Incoming: ' + sequenceNumber);
        }
      }
      function createDocument() {
        document = {
          id: deviceId + '-' + moduleId,
          deviceId: deviceId,
          moduleId: moduleId,
          hubName: hubName,
          connectionState: connectionState,
          connectionStateUpdatedTime: connectionStateUpdatedTime,
          sequenceNumber: sequenceNumber
        };
        console.log('Add new device - ' + collection.getAltLink());
        isAccepted = collection.createDocument(
          collection.getAltLink(),
          document,
          function(err, doc) {
            if (err) {
              getContext()
                .getResponse()
                .setBody(err);
            } else {
              getContext()
                .getResponse()
                .setBody(doc);
            }
          }
        );
      }
    
      function getDocumentLink(deviceId, moduleId) {
        return collection.getAltLink() + '/docs/' + deviceId + '-' + moduleId;
      }
    }
    
  3. Saklı yordamı Kaydet:

    saklı yordamı Kaydet

Mantıksal uygulama oluşturma

İlk olarak, bir mantıksal uygulama oluşturun ve sanal makineniz için kaynak grubunu izleyen bir Event Grid tetikleyicisi ekleyin.

Mantıksal uygulama kaynağı oluşturma

  1. Azure Portal + kaynak oluştur' u seçin, tümleştirme ' i ve ardından mantıksal uygulama' yı seçin.

    Mantıksal uygulama oluşturma

  2. Mantıksal uygulamanıza aboneliğiniz içinde benzersiz olan bir ad verin, ardından IoT Hub'ınızla aynı aboneliği, kaynak grubunu ve konumu seçin.

    Yeni mantıksal uygulama

  3. Mantıksal uygulamayı oluşturmak için Oluştur ' u seçin.

    Mantıksal uygulamanız için bir Azure kaynağı oluşturdunuz. Azure mantıksal uygulamanızı dağıttıktan sonra Logic Apps Tasarımcısı'nda hızlı bir başlangıç yapmanıza yardımcı olacak ortak desen şablonları gösterilir.

    Not

    Mantıksal uygulamanızı bulup açmak için kaynak grupları ' nı seçin ve bu nasıl yapılır için kullandığınız kaynak grubunu seçin. Ardından yeni mantıksal uygulamanızı seçin. Bu, mantıksal uygulama Tasarımcısı ' nı açar.

  4. Mantıksal uygulama Tasarımcısı ' nda, sık kullanılan Tetikleyicileri görene kadar sağa kaydırın. Mantıksal uygulamanızı sıfırdan oluşturabilmeniz için Şablonlar' ın altında boş mantıksal uygulama ' yı seçin.

Tetikleyici seçme

Tetikleyici, mantıksal uygulamanızı başlatan belirli bir olaydır. Bu öğreticide, iş akışını başlatan tetikleyici HTTP üzerinden bir istek alır.

  1. Bağlayıcılar ve Tetikleyiciler arama çubuğunda http yazın ve ENTER tuşuna basın.

  2. Tetikleyici olarak İstek - Bir HTTP isteği alındığında'yı seçin.

    HTTP istek tetikleyicisini seçme

  3. Şema oluşturmak için örnek yük kullanma öğesini seçin.

    Şema oluşturmak için örnek yük kullanma

  4. Aşağıdaki örnek JSON kodunu metin kutusuna yapıştırın ve Bitti'yi seçin:

    [{
     "id": "fbfd8ee1-cf78-74c6-dbcf-e1c58638ccbd",
     "topic":
       "/SUBSCRIPTIONS/DEMO5CDD-8DAB-4CF4-9B2F-C22E8A755472/RESOURCEGROUPS/EGTESTRG/PROVIDERS/MICROSOFT.DEVICES/IOTHUBS/MYIOTHUB",
     "subject": "devices/Demo-Device-1",
     "eventType": "Microsoft.Devices.DeviceConnected",
     "eventTime": "2018-07-03T23:20:11.6921933+00:00",
     "data": {
       "deviceConnectionStateEventInfo": {
         "sequenceNumber":
           "000000000000000001D4132452F67CE200000002000000000000000000000001"
       },
       "hubName": "MYIOTHUB",
       "deviceId": "48e44e11-1437-4907-83b1-4a8d7e89859e",
       "moduleId": ""
     },
     "dataVersion": "1",
     "metadataVersion": "1"
    }]
    

    Örnek JSON yükünü Yapıştır

  5. İsteğinize Uygulama/JSON olarak ayarlanmış bir Content-Type üst bilgisi eklemeyi unutmayın önerisinin bulunduğu bir açılan bildirim alabilirsiniz. Bu öneriyi güvenle yoksayabilir ve sonraki bölüme geçebilirsiniz.

Koşul oluşturma

Mantıksal uygulama iş akışınızda, koşullar belirli bir koşulu geçirdikten sonra belirli eylemleri çalıştırmaya yardımcı olur. Koşul karşılandığında, istenen bir eylem tanımlanabilir. Bu öğretici için koşul, eventType tarafından cihazın bağlı veya cihazın bağlantısının kesilmediğini denetledir. Bu eylem, saklı yordamı veritabanınızda yürütmek olacaktır.

  1. + Yeni adım ' ı seçin ve ardından koşulu bulun ve seçin. Bir değer Seç ' e tıklayın ve dinamik içerik ' i gösteren bir kutu açılır ve seçilebilir alanlar görüntülenir. Yalnızca cihaza bağlı ve cihaz bağlantısı kesik olayları için bunu yürütmek üzere alanları aşağıda gösterildiği gibi girin:

    • Değer seçin: EventType --bu alana tıkladığınızda görüntülenen dinamik içerikte bulunan alanlardan bunu seçin.

    • İle biten"eşittir" olarak değiştirin.

    • Bir değer seçin: nesiyonu.

      Fill koşulu

  2. True ise iletişim kutusunda Eylem Ekle' ye tıklayın.

    True ise Eylem Ekle

  3. Cosmos DB arayın ve Azure Cosmos DB çalıştır saklı yordamını seçin

    CosmosDB araması

  4. Bağlantı adı için cosmosdb-Connection ' ı girin ve tablodaki girişi seçin ve ardından Oluştur' u seçin. Saklı yordam Yürüt panelini görürsünüz. Alanlar için değerleri girin:

    VERITABANı kimliği: ToDoList

    Koleksıyon kimliği: öğeler

    Sproc kimliği: latestdeviceconnectionstate

  5. Yeni parametre Ekle' yi seçin. Görüntülenen açılan menüde, saklı yordamın bölüm anahtarı ve parametreleri ' nin yanındaki kutuları işaretleyin ve ardından ekranda başka herhangi bir yere tıklayın. bölüm anahtarı değeri için bir alan ve saklı yordamın parametreleri için bir alan ekler.

    Ekran görüntüsünde, yeni parametre Ekle seçiliyken saklı yordam öğesini Çalıştır öğesi gösterilir.

  6. Şimdi aşağıda gösterildiği gibi bölüm anahtarı değerini ve parametrelerini girin. Köşeli ayraçları ve çift tırnak işaretlerini gösterildiği gibi yazdığınızdan emin olun. Burada kullanabileceğiniz geçerli değerleri almak için dinamik Içerik Ekle ' ye tıklamanız gerekebilir.

    Ekran görüntüsünde, girilmiş parametrelere sahip bir Execute saklı yordam öğesi gösterilir.

  7. Bölmenin her biri için bulduğu en üst kısmında, önceki adımlardan bir çıkış seçin altında BT gövdesinin seçili olduğundan emin olun.

    mantıksal uygulamayı her biri için doldur

  8. Mantıksal uygulamanızı kaydedin.

HTTP URL'sini kopyalama

Logic Apps tasarımcısından çıkmadan önce, mantıksal uygulamanızın dinlediği URL 'YI bir tetikleyici için kopyalayın. Bu URL'yi, Event Grid'i yapılandırmak için kullanırsınız.

  1. Bir HTTP isteği alındığında tetikleyici yapılandırma kutusunu tıklayarak genişletin.

  2. Yanındaki kopyala düğmesini seçerek HTTP POST URL değerini kopyalayın.

    HTTP POST URL değerini kopyalama

  3. Sonraki bölümde başvurabilmek için bu URL'yi saklayın.

IoT Hub olayları için aboneliği yapılandırma

Bu bölümde, IoT Hub'ınızı gerçekleşen olayları yayımlamak için yapılandıracaksınız.

  1. Azure portalında IoT Hub'ınıza gidin.

  2. Olaylar'ı seçin.

    Event Grid ayrıntılarını açma

  3. + Olay aboneliği'ne tıklayın.

    Yeni olay aboneliği oluşturma

  4. Olay Aboneliği Ayrıntıları: Açıklayıcı bir ad girin ve Şema'Event Grid seçin.

  5. Olay Türleri alanlarını doldurun. Açılan listede yalnızca Cihaz Bağlandı ve Menüden Cihaz Bağlantısı Kesildi'yi seçin. Listeyi kapatmak ve seçimlerinizi kaydetmek için ekranda başka bir yere tıklayın.

    Bakmak için olay türlerini ayarlama

  6. Nokta Ayrıntıları için Uç Nokta Türü'nü Web Kancası olarak seçin, uç nokta seçin'e tıklayın ve mantıksal uygulamanıza kopyalayıp seçimi onaylayın.

    Uç nokta URL'sini seçin

  7. Form şimdi aşağıdaki örnekteki gibi görünüyor olabilir:

    Örnek olay aboneliği formu

    Olay aboneliğini kaydetmek için Oluştur’u seçin.

Olayları gözlemle

Olay aboneliğinizi ayarlayarak cihazı bağlayarak test edebilirsiniz.

Bir cihazı IoT Hub

  1. IoT hub' ınıza IoT Cihazları'ı seçin.

  2. Bölmenin üst kısmında +Ekle'yi seçin.

  3. Cihaz kimliği için, Demo-Device-1 girin.

  4. Kaydet’i seçin.

  5. Farklı cihaz kimlikleri olan birden çok cihaz eklemek için kullanabilirsiniz.

    Hub'a eklenen cihazlar

  6. Cihaza yeniden tıklayın; şimdi bağlantı dizeleri ve anahtarlar doldurulur. Bağlantı dizesi -- birincil anahtarı daha sonra kullanmak üzere kopyalayın.

    Cihaz için ConnectionString

Raspberry Pi simülatörünü başlatma

Şimdi Raspberry Pi web simülatörünü kullanarak cihaz bağlantısının benzetimini bakalım.

Raspberry Pi simülatörünü başlatma

Raspberry Pi web simülatörü üzerinde örnek uygulama çalıştırma

Bu, cihaza bağlı bir olayı tetikler.

  1. Kodlama alanında, Satır 15'te yer tutucusunu önceki bölümün sonunda Azure IoT Hub cihaz bağlantı dizeniz ile değiştirin.

    Cihaz bağlantı dizesini yapıştırma

  2. Çalıştır'ı seçerek uygulamayı çalıştırın.

Algılayıcı verilerini ve IoT hub'ınıza gönderilen iletileri gösteren aşağıdaki çıkışa benzer bir şey görüyorsunuz.

Uygulamayı çalıştırma

Simülatörü durdurmak ve Cihaz Bağlantısı Kesildi olayı tetiklemek için Durdur'a tıklayın.

Artık sensör verilerini toplamak ve IoT hub'ınıza göndermek için örnek bir uygulama çalıştırabilirsiniz.

Cosmos DB'de olayları gözlemle

Yürütülen saklı yordamın sonuçlarını veritabanı belgesinde Cosmos edinebilirsiniz. Aşağıdaki görüntüde olduğu gibi görünmelidir. Her satır, cihaz başına en son cihaz bağlantı durumunu içerir.

Nasıl sonuç elde etmek gerekir?

Azure CLI kullanma

Azure portal yerineAzure CLI kullanarak IoT Hub gerçekleştirebilirsiniz. Ayrıntılar için olay aboneliği oluşturmaya ve IoT cihazı oluşturmaya ilişkin Azure CLI sayfalarına bakın.

Kaynakları temizleme

Bu öğreticide Azure aboneliğinize ücret uygulanmasına neden olan kaynaklar kullanılmıştır. Öğreticiyi denemeyi ve sonuçları test etme adımlarını tamamladikten sonra, tutmak istemediklerinizi devre dışı bırakarak veya silebilirsiniz.

Mantıksal uygulamanızda yapılan çalışmayı kaybetmek istemiyorsanız, bunu silmek yerine devre dışı bırakın.

  1. Mantıksal uygulamanıza gidin.

  2. Genel Bakış dikey penceresinde Sil veya Devre Dışı Bırak'ı seçin.

    Her aboneliğin tek bir ücretsiz IoT Hub'ı olabilir. Bu öğretici için ücretsiz bir hub oluşturduysanız, ücretleri önlemek için bunu silmeniz gerekmez.

  3. IoT Hub'ınıza gidin.

  4. Genel Bakış dikey penceresinde Sil'i seçin.

    IoT Hub'ınızı korusanız bile, oluşturduğunuz olay aboneliğini silmek isteyebilirsiniz.

  5. IoT Hub'ınızda Event Grid'i seçin.

  6. Kaldırmak istediğiniz olay aboneliğini seçin.

  7. Sil’i seçin.

Azure Cosmos DB hesabını Azure portal hesap adına sağ tıklayın ve Hesabı sil'e tıklayın. Azure Cosmos DB hesabını silme hakkında ayrıntılı yönergelere bakın.

Sonraki adımlar