Yeni bir simülasyon cihazı oluşturma ve test etme

Uzaktan İzleme çözümü hızlandırıcısı, kendi simülasyon cihazlarınızı tanımlamanıza olanak tanır. Bu makalede yeni bir simülasyon ampul cihazını tanımlama ve ardından yerel olarak test etme adımları gösterilmektedir. Çözüm hızlandırıcısı soğutucular ve kamyonlar gibi simülasyon cihazlarını içerir. Ancak, gerçek cihazları dağıtmadan önce IoT çözümlerinizi test etmek için kendi simülasyon cihazlarınızı tanımlayabilirsiniz.

Not

Bu makalede, cihaz simülasyon hizmetinde barındırılan sanal cihazların nasıl kullanılacağı açıklanmaktadır. Gerçek bir cihaz oluşturmak istiyorsanız bkz . Cihazınızı Uzaktan İzleme çözümü hızlandırıcısına bağlama.

Bu nasıl yapılır kılavuzu, cihaz benzetimi mikro hizmetini nasıl özelleştirebileceğinizi gösterir. Bu mikro hizmet, Uzaktan İzleme çözümü hızlandırıcısının bir parçasıdır. Cihaz benzetimi özelliklerini göstermek için bu nasıl yapılır kılavuzunda Contoso IoT uygulamasında iki senaryo kullanılır:

İlk senaryoda, Contoso'nun mevcut Soğutucu cihaz türüne yeni bir telemetri türü eklersiniz.

İkinci senaryoda Contoso yeni bir akıllı ampul cihazını test etmek istiyor. Testleri çalıştırmak için aşağıdaki özelliklere sahip yeni bir simülasyon cihazı oluşturursunuz:

Özellikler

Name Değerler
Renk Beyaz, Kırmızı, Mavi
Parlaklık 0 ile 100
Tahmini kalan ömür 10.000 saatten geri sayım

Telemetri

Aşağıdaki tabloda ampul tarafından buluta veri akışı olarak rapor edilen veriler gösterilmektedir:

Name Değerler
Durum "on", "off"
Sıcaklık F Dereceleri
çevrimiçi true, false

Not

Çevrimiçi telemetri değeri tüm simülasyon türleri için zorunludur.

Yöntemler

Aşağıdaki tabloda yeni cihazın desteklediği eylemler gösterilmektedir:

Name
Kapatın

Başlangıç durumu

Aşağıdaki tabloda cihazın ilk durumu gösterilmektedir:

Name Değerler
İlk renk Beyaz
İlk parlaklık 75
kalan ilk yaşam 10,000
İlk telemetri durumu "açık"
İlk telemetri sıcaklığı 200

Bu nasıl yapılır kılavuzundaki adımları tamamlamak için etkin bir Azure aboneliğine ihtiyacınız vardır.

Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

Azure Cloud Shell kullanma

Azure, tarayıcınız aracılığıyla kullanabileceğiniz etkileşimli bir kabuk ortamı olan Azure Cloud Shell’i barındırır. Azure hizmetleriyle çalışmak için Cloud Shell ile Bash veya PowerShell kullanabilirsiniz. Bu makaledeki kodu, yerel ortamınıza herhangi bir şey yüklemeye gerek kalmadan çalıştırmak için Cloud Shell’in önceden yüklenmiş komutlarını kullanabilirsiniz.

Azure Cloud Shell’i başlatmak için:

Seçenek Örnek/Bağlantı
Kod bloğunun sağ üst köşesindeki Deneyin’i seçin. Deneyin seçeneği belirlendiğinde, kod otomatik olarak Cloud Shell’e kopyalanmaz. Azure Cloud Shell için Deneyin örneği
Cloud Shell’i tarayıcınızda açmak için https://shell.azure.com bölümüne gidin veya Cloud Shell’i Başlat düğmesini seçin. Cloud Shell’i yeni bir pencerede başlatma
Azure portalın sağ üst köşesindeki menü çubuğunda yer alan Cloud Shell düğmesini seçin. Azure portaldaki Cloud Shell düğmesi

Azure Cloud Shell’de bu makaledeki kodu çalıştırmak için:

  1. Cloud Shell’i başlatın.

  2. Kodu kopyalamak için kod bloğunda Kopyala düğmesini seçin.

  3. Windows ve Linux sisteminde Ctrl+Shift+V tuşlarını kullanarak veya macOS’de Cmd+Shift+V tuşlarını kullanarak kodu Cloud Shell oturumuna yapıştırın.

  4. Kodu çalıştırmak için Enter tuşuna basın.

Önkoşullar

Bu nasıl yapılır kılavuzunu izlemek için şunları yapmanız gerekir:

Geliştirme ortamınızı hazırlama

Geliştirme ortamınızı hazırlamak için aşağıdaki görevleri tamamlayın:

  • Cihaz benzetimi mikro hizmetinin kaynağını indirin.
  • Depolama bağdaştırıcısı mikro hizmetinin kaynağını indirin.
  • Depolama bağdaştırıcısı mikro hizmetini yerel olarak çalıştırın.

Bu makaledeki yönergelerde Windows kullandığınız varsayılır. Başka bir işletim sistemi kullanıyorsanız, bazı dosya yollarını ve komutlarını ortamınıza uyacak şekilde ayarlamanız gerekebilir.

Mikro hizmetleri indirme

GitHub'dan uzaktan izleme mikro hizmetlerini indirip yerel makinenizde uygun bir konuma açın. Makalede bu klasörün adının remote-monitoring-services-dotnet-master olduğu varsayılır.

Cihaz benzetimi mikro hizmetini GitHub'dan indirip yerel makinenizde uygun bir konuma açın. Makalede bu klasörün adının device-simulation-dotnet-master olduğu varsayılır.

Depolama bağdaştırıcısı mikro hizmetini çalıştırma

Visual Studio Code'da remote-monitoring-services-dotnet-master\storage-adapter klasörünü açın. Çözülmemiş bağımlılıkları düzeltmek için geri yükleme düğmelerine tıklayın.

Depolama bağdaştırıcısı/WebService/appsettings.ini dosyasını açın ve Cosmos DB bağlantı dizenizi documentDBConnectionString değişkenine atayın.

Mikro hizmeti yerel olarak çalıştırmak için Hata Ayıklamayı Başlat Hata Ayıklama'ya >tıklayın.

Visual Studio Code'daki Terminal penceresi, web hizmeti sistem durumu denetimi için bir URL de dahil olmak üzere çalışan mikro hizmetten gelen çıkışı gösterir: http://127.0.0.1:9022/v1/status. Bu adrese gittiğinizde, durum "Tamam: Canlı ve iyi" olmalıdır.

Sonraki adımları tamamlarken depolama bağdaştırıcısı mikro hizmetini bu Visual Studio Code örneğinde çalışır durumda bırakın.

Soğutucuyu değiştirme

Bu bölümde, mevcut Soğutucu cihaz türüne yeni bir İç Sıcaklık telemetri türü ekleyebilirsiniz:

  1. Yerel makinenizde yeni bir C:\temp\devicemodels klasörü oluşturun.

  2. Cihaz benzetimi mikro hizmetinin indirilen kopyasından aşağıdaki dosyaları yeni klasörünüze kopyalayın:

    Kaynak Hedef
    Services\data\devicemodels\chiller-01.json C:\temp\devicemodels\chiller-01.json
    Services\data\devicemodels\scripts\chiller-01-state.js C:\temp\devicemodels\scripts\chiller-01-state.js
    Services\data\devicemodels\scripts\Reboot-method.js C:\temp\devicemodels\scripts\Reboot-method.js
    Services\data\devicemodels\scripts\FirmwareUpdate-method.js C:\temp\devicemodels\scripts\FirmwareUpdate-method.js
    Services\data\devicemodels\scripts\EmergencyValveRelease-method.js C:\temp\devicemodels\scripts\EmergencyValveRelease-method.js
    Services\data\devicemodels\scripts\IncreasePressure-method.js C:\temp\devicemodels\scripts\IncreasePressure-method.js
  3. C:\temp\devicemodels\chiller-01.json dosyasını açın.

  4. InitialState bölümünde aşağıdaki iki tanımı ekleyin:

    "internal_temperature": 65.0,
    "internal_temperature_unit": "F",
    
  5. Telemetri dizisine aşağıdaki tanımı ekleyin:

    {
      "Interval": "00:00:05",
      "MessageTemplate": "{\"internal_temperature\":${internal_temperature},\"internal_temperature_unit\":\"${internal_temperature_unit}\"}",
      "MessageSchema": {
        "Name": "chiller-internal-temperature;v1",
        "Format": "JSON",
        "Fields": {
          "temperature": "double",
          "temperature_unit": "text"
        }
      }
    },
    
  6. C:\temp\devicemodels\chiller-01.json dosyasını kaydedin.

  7. C:\temp\devicemodels\scripts\chiller-01-state.js dosyasını açın.

  8. Durum değişkenine aşağıdaki alanları ekleyin:

    internal_temperature: 65.0,
    internal_temperature_unit: "F",
    
  9. Main işlevini aşağıdaki gibi güncelleştirin:

    function main(context, previousState, previousProperties) {
    
        // Restore the global state before generating the new telemetry, so that
        // the telemetry can apply changes using the previous function state.
        restoreSimulation(previousState, previousProperties);
    
        // 75F +/- 5%,  Min 25F, Max 100F
        state.temperature = vary(75, 5, 25, 100);
    
        // 70% +/- 5%,  Min 2%, Max 99%
        state.humidity = vary(70, 5, 2, 99);
    
        // 65F +/- 2%,  Min 15F, Max 125F
        state.internal_temperature = vary(65, 2, 15, 125);
    
        log("Simulation state: " + state.simulation_state);
        if (state.simulation_state === "high_pressure") {
            // 250 psig +/- 25%,  Min 50 psig, Max 300 psig
            state.pressure = vary(250, 25, 50, 300);
        } else {
            // 150 psig +/- 10%,  Min 50 psig, Max 300 psig
            state.pressure = vary(150, 10, 50, 300);
        }
    
        updateState(state);
        return state;
    }
    
  10. C:\temp\devicemodels\scripts\chiller-01-state.js dosyasını kaydedin.

Ampul oluşturma

Bu bölümde yeni bir Ampul cihaz türü tanımlayacaksınız:

  1. C:\temp\devicemodels\lightbulb-01.json dosyasını oluşturun ve aşağıdaki içeriği ekleyin:

    {
      "SchemaVersion": "1.0.0",
      "Id": "lightbulb-01",
      "Version": "0.0.1",
      "Name": "Lightbulb",
      "Description": "Smart lightbulb device.",
      "Protocol": "MQTT",
      "Simulation": {
        "InitialState": {
          "online": true,
          "temperature": 200.0,
          "temperature_unit": "F",
          "status": "on"
        },
        "Interval": "00:00:20",
        "Scripts": [
          {
            "Type": "javascript",
            "Path": "lightbulb-01-state.js"
          }
        ]
      },
      "Properties": {
        "Type": "Lightbulb",
        "Color": "White",
        "Brightness": 75,
        "EstimatedRemainingLife": 10000
      },
      "Tags": {
        "Location": "Building 2",
        "Floor": "2",
        "Campus": "Redmond"
      },
      "Telemetry": [
        {
          "Interval": "00:00:20",
          "MessageTemplate": "{\"temperature\":${temperature},\"temperature_unit\":\"${temperature_unit}\",\"status\":\"${status}\"}",
          "MessageSchema": {
            "Name": "lightbulb-status;v1",
            "Format": "JSON",
            "Fields": {
              "temperature": "double",
              "temperature_unit": "text",
              "status": "text"
            }
          }
        }
      ],
      "CloudToDeviceMethods": {
        "SwitchOn": {
          "Type": "javascript",
          "Path": "SwitchOn-method.js"
        },
        "SwitchOff": {
          "Type": "javascript",
          "Path": "SwitchOff-method.js"
        }
      }
    }
    

    C:\temp\devicemodels\lightbulb-01.json dosyasındaki değişiklikleri kaydedin.

  2. C:\temp\devicemodels\scripts\lightbulb-01-state.js bir dosya oluşturun ve aşağıdaki içeriği ekleyin:

    "use strict";
    
    // Default state
    var state = {
      online: true,
      temperature: 200.0,
      temperature_unit: "F",
      status: "on"
    };
    
    // Default device properties
    var properties = {};
    
    /**
     * Restore the global state using data from the previous iteration.
     *
     * @param previousState device state from the previous iteration
     * @param previousProperties device properties from the previous iteration
     */
    function restoreSimulation(previousState, previousProperties) {
      // If the previous state is null, force a default state
      if (previousState) {
        state = previousState;
      } else {
        log("Using default state");
      }
    
      if (previousProperties) {
        properties = previousProperties;
      } else {
        log("Using default properties");
      }
    }
    
    /**
     * Simple formula generating a random value around the average
     * in between min and max
     *
     * @returns random value with given parameters
     */
    function vary(avg, percentage, min, max) {
      var value = avg * (1 + ((percentage / 100) * (2 * Math.random() - 1)));
      value = Math.max(value, min);
      value = Math.min(value, max);
      return value;
    }
    
    /**
     * Simple formula that sometimes flips the status of the lightbulb
     */
    function flip(value) {
      if (Math.random() < 0.2) {
        return (value == "on") ? "off" : "on"
      }
      return value;
    }
    
    /**
     * Entry point function called by the simulation engine.
     * Returns updated simulation state.
     * Device property updates must call updateProperties() to persist.
     *
     * @param context             The context contains current time, device model and id
     * @param previousState       The device state since the last iteration
     * @param previousProperties  The device properties since the last iteration
     */
    function main(context, previousState, previousProperties) {
    
      // Restore the global device properties and the global state before
      // generating the new telemetry, so that the telemetry can apply changes
      // using the previous function state.
      restoreSimulation(previousState, previousProperties);
    
      state.temperature = vary(200, 5, 150, 250);
    
      // Make this flip every so often
      state.status = flip(state.status);
    
      updateState(state);
    
      return state;
    }
    

    değişiklikleriC:\temp\devicemodels\scripts\lightbulb-01-state.jskaydedin.

  3. C:\temp\devicemodels\scripts\SwitchOn-method.js bir dosya oluşturun ve aşağıdaki içeriği ekleyin:

    "use strict";
    
    // Default state
    var state = {
      status: "on"
    };
    
    /**
     * Entry point function called by the method.
     *
     * @param context        The context contains current time, device model and id
     * @param previousState  The device state since the last iteration
     * @param previousProperties  The device properties since the last iteration
     */
    function main(context, previousState) {
      log("Executing lightbulb Switch On method.");
      state.status = "on";
      updateState(state);
    }
    

    değişiklikleriC:\temp\devicemodels\scripts\SwitchOn-method.jskaydedin.

  4. C:\temp\devicemodels\scripts\SwitchOff-method.js bir dosya oluşturun ve aşağıdaki içeriği ekleyin:

    "use strict";
    
    // Default state
    var state = {
      status: "on"
    };
    
    /**
     * Entry point function called by the method.
     *
     * @param context        The context contains current time, device model and id
     * @param previousState  The device state since the last iteration
     * @param previousProperties  The device properties since the last iteration
     */
    function main(context, previousState) {
      log("Executing lightbulb Switch Off method.");
      state.status = "off";
      updateState(state);
    }
    

    değişiklikleriC:\temp\devicemodels\scripts\SwitchOff-method.jskaydedin.

Chiller cihaz türünün özelleştirilmiş bir sürümünü oluşturdunuz ve yeni bir Ampul cihaz türü oluşturdunuz.

Cihazları test etme

Bu bölümde, önceki bölümlerde oluşturduğunuz cihaz türlerini yerel olarak test edin.

Cihaz benzetimi mikro hizmetini çalıştırma

GitHub'dan indirdiğiniz device-simulation-dotnet-master klasörünü yeni bir Visual Studio Code örneğinde açın. Çözülmemiş bağımlılıkları düzeltmek için geri yükleme düğmelerine tıklayın.

WebService/appsettings.ini dosyasını açın ve Cosmos DB bağlantı dizenizi documentdb_connstring değişkenine atayın ve ayarları aşağıdaki gibi değiştirin:

device_models_folder = C:\temp\devicemodels\

device_models_scripts_folder = C:\temp\devicemodels\scripts\

Mikro hizmeti yerel olarak çalıştırmak için Hata Ayıklamayı Başlat Hata Ayıklama'ya >tıklayın.

Visual Studio Code'deki Terminal penceresi, çalışan mikro hizmetin çıkışını gösterir.

Sonraki adımları tamamlarken cihaz benzetimi mikro hizmetini bu Visual Studio Code örneğinde çalışır durumda bırakın.

Cihaz olayları için monitör ayarlama

Bu bölümde, IoT hub'ınıza bağlı cihazlardan gönderilen telemetriyi görüntülemek üzere bir olay izleyicisi ayarlamak için Azure CLI'yi kullanacaksınız.

Aşağıdaki betikte IoT hub'ınızın adının device-simulation-test olduğu varsayılır.

# Install the IoT extension if it's not already installed
az extension add --name azure-iot

# Monitor telemetry sent to your hub
az iot hub monitor-events --hub-name device-simulation-test

Simülasyon cihazlarını test ederken olay izleyicisini çalışır durumda bırakın.

Güncelleştirilmiş soğutucu cihaz türüyle simülasyon oluşturma

Bu bölümde, güncelleştirilmiş soğutucu cihaz türünü kullanarak bir simülasyon çalıştırmak üzere cihaz benzetimi mikro hizmetini istemek için Postman aracını kullanacaksınız. Postman, bir web hizmetine REST istekleri göndermenizi sağlayan bir araçtır. İhtiyacınız olan Postman yapılandırma dosyaları device-simulation-dotnet deposunun yerel kopyasında bulunur.

Postman'i ayarlamak için:

  1. Yerel makinenizde Postman'i açın.

  2. Dosya > İçeri Aktar'a tıklayın. Ardından Dosya Seç'e tıklayın.

  3. device-simulation-dotnet-master/docs/postman klasörüne gidin. Azure IoT Cihaz Benzetimi çözümü accelerator.postman_collection ve Azure IoT Cihaz Benzetimi çözümü accelerator.postman_environment'ı seçin ve Aç'a tıklayın.

  4. Gönderebileceğiniz istekler için Azure IoT Cihaz Benzetimi çözüm hızlandırıcısını genişletin.

  5. Ortam Yok'a tıklayın ve Azure IoT Cihaz Benzetimi çözüm hızlandırıcısı'ni seçin.

Artık Postman çalışma alanınızda cihaz benzetimi mikro hizmetiyle etkileşimde bulunabileceğiniz bir koleksiyon ve ortam yüklü.

Benzetimi yapılandırmak ve çalıştırmak için:

  1. Postman koleksiyonunda Değiştirilmiş soğutucu benzetimi oluştur'u seçin ve Gönder'e tıklayın. Bu istek, sanal soğutucu cihaz türünün dört örneğini oluşturur.

  2. Azure CLI penceresindeki olay izleyicisi çıkışı, yeni internal_temperature değerleri de dahil olmak üzere simülasyon cihazlarından alınan telemetriyi gösterir.

Simülasyonu durdurmak için Postman'da simülasyon isteğini durdur'u seçin ve Gönder'e tıklayın.

Ampul cihaz türüyle simülasyon oluşturma

Bu bölümde Postman aracını kullanarak ampul cihaz türünü kullanarak bir simülasyon çalıştırmak üzere cihaz benzetimi mikro hizmetini isteyebilirsiniz. Postman, bir web hizmetine REST istekleri göndermenizi sağlayan bir araçtır.

Benzetimi yapılandırmak ve çalıştırmak için:

  1. Postman koleksiyonunda Ampul benzetimi oluştur'u seçin ve Gönder'e tıklayın. Bu istek, simülasyon ampulü cihaz türünün iki örneğini oluşturur.

  2. Azure CLI penceresindeki olay izleyicisi çıkışı, simülasyon ampullerinden alınan telemetriyi gösterir.

Simülasyonu durdurmak için Postman'da simülasyon isteğini durdur'u seçin ve Gönder'e tıklayın.

Kaynakları temizleme

yerel olarak çalışan iki mikro hizmeti Visual Studio Code örneklerinde durdurabilirsiniz (Hata AyıklamaYı > Durdur Hata Ayıklama).

IoT Hub ve Cosmos DB örneklerine artık ihtiyacınız yoksa, gereksiz ücretlerden kaçınmak için bunları Azure aboneliğinizden silin.

Sonraki adımlar

Bu kılavuzda, özel bir sanal cihaz türü oluşturma ve cihaz benzetimi mikro hizmetini yerel olarak çalıştırarak bunları test etme adımları gösterildi.

Önerilen sonraki adım, özel sanal cihaz türlerinizi Uzaktan İzleme çözüm hızlandırıcısına dağıtmayı öğrenmektir.