Skapa och testa en ny simulerad enhet

Med acceleratorn Fjärrövervakningslösning kan du definiera dina egna simulerade enheter. Den här artikeln visar hur du definierar en ny simulerad glödlampa och sedan testar den lokalt. Lösningsacceleratorn innehåller simulerade enheter som kylaggregat och lastbilar. Du kan dock definiera dina egna simulerade enheter för att testa dina IoT-lösningar innan du distribuerar verkliga enheter.

Anteckning

Den här artikeln beskriver hur du använder simulerade enheter som finns i enhetssimuleringstjänsten. Om du vill skapa en riktig enhet kan du läsa Ansluta enheten till acceleratorn Fjärrövervakningslösning.

Den här guiden visar hur du anpassar mikrotjänsten för enhetssimulering. Den här mikrotjänsten är en del av acceleratorn fjärrövervakningslösning. För att visa funktionerna för enhetssimulering använder den här guiden två scenarier i Contoso IoT-programmet:

I det första scenariot lägger du till en ny telemetrityp i Contosos befintliga kylaggregatstyp .

I det andra scenariot vill Contoso testa en ny smart glödlampa. Om du vill köra testerna skapar du en ny simulerad enhet med följande egenskaper:

Egenskaper

Name Värden
Färg Vit, Röd, Blå
Ljusstyrka 0 till 100
Uppskattad återstående livslängd Nedräkning från 10 000 timmar

Telemetri

I följande tabell visas de data som glödlampan rapporterar till molnet som en dataström:

Name Värden
Status "on", "off"
Temperatur Grader F
online SANT, FALSKT

Anteckning

Telemetrivärdet online är obligatoriskt för alla simulerade typer.

Metoder

I följande tabell visas de åtgärder som den nya enheten stöder:

Name
Slå på
Stänga

Initialt tillstånd

I följande tabell visas enhetens ursprungliga status:

Name Värden
Inledande färg Vit
Inledande ljusstyrka 75
Inledande återstående livslängd 10 000
Inledande telemetristatus "på"
Initial telemetritemperatur 200

För att slutföra stegen i den här guiden behöver du en aktiv Azure-prenumeration.

Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar.

Använda Azure Cloud Shell

Azure är värd för Azure Cloud Shell, en interaktiv gränssnittsmiljö som du kan använda via webbläsaren. Du kan använda antingen Bash eller PowerShell med Cloud Shell för att arbeta med Azure-tjänster. Du kan använda förinstallerade Cloud Shell-kommandon för att köra koden i den här artikeln utan att behöva installera något i din lokala miljö.

Så här startar du Azure Cloud Shell:

Alternativ Exempel/länk
Välj Prova i det övre högra hörnet av ett kodblock. Om du väljer Prova kopieras koden inte automatiskt till Cloud Shell. Exempel på Prova för Azure Cloud Shell
Gå till https://shell.azure.com eller Välj knappen Starta Cloud Shell för att öppna Cloud Shell i webbläsaren. Starta Cloud Shell i ett nytt fönster
Välj knappen Cloud Shell på menyn längst upp till höger i Azure-portalen. Cloud Shell-knappen i Azure Portal

Så här kör du koden i den här artikeln i Azure Cloud Shell:

  1. Starta Cloud Shell.

  2. Kopiera koden genom att klicka på knappen Kopiera på ett kodblock.

  3. Klistra in koden i Cloud Shell-sessionen genom att välja Ctrl+Skift+V på Windows och Linux eller genom att välja Cmd+Skift+V på macOS.

  4. Välj Retur för att köra koden.

Förutsättningar

Om du vill följa den här guiden behöver du:

Förbereda utvecklingsmiljön

Slutför följande uppgifter för att förbereda utvecklingsmiljön:

  • Ladda ned källan för mikrotjänsten för enhetssimulering.
  • Ladda ned källan för mikrotjänsten för lagringskortet.
  • Kör mikrotjänsten för lagringskortet lokalt.

Anvisningarna i den här artikeln förutsätter att du använder Windows. Om du använder ett annat operativsystem kan du behöva justera några av filsökvägarna och kommandona så att de passar din miljö.

Ladda ned mikrotjänsterna

Ladda ned och packa upp fjärrövervakningsmikrotjänster från GitHub till en lämplig plats på den lokala datorn. Artikeln förutsätter att namnet på den här mappen är remote-monitoring-services-dotnet-master.

Ladda ned och packa upp mikrotjänsten för enhetssimulering från GitHub till en lämplig plats på den lokala datorn. Artikeln förutsätter att namnet på den här mappen är device-simulation-dotnet-master.

Kör mikrotjänsten för lagringskort

Öppna mappen remote-monitoring-services-dotnet-master\storage-adapter i Visual Studio Code. Klicka på återställningsknapparna för att åtgärda eventuella olösta beroenden.

Öppna filen storage-adapter/WebService/appsettings.ini och tilldela Cosmos DB-anslutningssträngen till variabeln documentDBConnectionString .

Om du vill köra mikrotjänsten lokalt klickar du på Felsöka > Starta felsökning.

Terminalfönstret i Visual Studio Code visar utdata från den mikrotjänst som körs, inklusive en URL för hälsokontrollen för webbtjänsten: http://127.0.0.1:9022/v1/status. När du navigerar till den här adressen ska statusen vara "OK: Levande och väl".

Låt mikrotjänsten för lagringskortet köras i den här instansen av Visual Studio Code medan du slutför nästa steg.

Ändra kylaggregatet

I det här avsnittet lägger du till en ny telemetrityp för intern temperatur i den befintliga kylaggregatstypen :

  1. Skapa en ny mapp C:\temp\devicemodels på den lokala datorn.

  2. Kopiera följande filer till den nya mappen från den nedladdade kopian av mikrotjänsten för enhetssimulering:

    Källa Mål
    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. Öppna filen C:\temp\devicemodels\chiller-01.json .

  4. I avsnittet InitialState lägger du till följande två definitioner:

    "internal_temperature": 65.0,
    "internal_temperature_unit": "F",
    
  5. Lägg till följande definition i telemetrimatrisen :

    {
      "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. Spara filen C:\temp\devicemodels\chiller-01.json .

  7. Öppna filenC:\temp\devicemodels\scripts\chiller-01-state.js .

  8. Lägg till följande fält i tillståndsvariabeln:

    internal_temperature: 65.0,
    internal_temperature_unit: "F",
    
  9. Uppdatera huvudfunktionen enligt följande:

    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. Spara C:\temp\devicemodels\scripts\chiller-01-state.js-filen .

Skapa glödlampan

I det här avsnittet definierar du en ny lightbulb-enhetstyp :

  1. Skapa filen C:\temp\devicemodels\lightbulb-01.json och lägg till följande innehåll:

    {
      "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"
        }
      }
    }
    

    Spara ändringarna i C:\temp\devicemodels\lightbulb-01.json.

  2. Skapa en fil C:\temp\devicemodels\scripts\lightbulb-01-state.js och lägg till följande innehåll:

    "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;
    }
    

    Spara ändringarna i C:\temp\devicemodels\scripts\lightbulb-01-state.js.

  3. Skapa en fil C:\temp\devicemodels\scripts\SwitchOn-method.js och lägg till följande innehåll:

    "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);
    }
    

    Spara ändringarna i C:\temp\devicemodels\scripts\SwitchOn-method.js.

  4. Skapa en fil C:\temp\devicemodels\scripts\SwitchOff-method.js och lägg till följande innehåll:

    "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);
    }
    

    Spara ändringarna i C:\temp\devicemodels\scripts\SwitchOff-method.js.

Nu har du skapat en anpassad version av kylaggregatets typ och skapat en ny Lightbulb-enhetstyp .

Testa enheterna

I det här avsnittet testar du de enhetstyper som du skapade i föregående avsnitt lokalt.

Kör mikrotjänsten för enhetssimulering

Öppna mappen device-simulation-dotnet-master som du laddade ned från GitHub i en ny instans av Visual Studio Code. Klicka på återställningsknapparna för att åtgärda eventuella olösta beroenden.

Öppna filen WebService/appsettings.ini och tilldela Cosmos DB-anslutningssträngen till variabeln documentdb_connstring och ändra även inställningarna på följande sätt:

device_models_folder = C:\temp\devicemodels\

device_models_scripts_folder = C:\temp\devicemodels\scripts\

Om du vill köra mikrotjänsten lokalt klickar du på Felsöka > Starta felsökning.

Terminalfönstret i Visual Studio Code visar utdata från den mikrotjänst som körs.

Låt mikrotjänsten för enhetssimulering köras i den här instansen av Visual Studio Code medan du slutför nästa steg.

Konfigurera en övervakare för enhetshändelser

I det här avsnittet använder du Azure CLI för att konfigurera en händelseövervakare för att visa telemetrin som skickas från de enheter som är anslutna till din IoT-hubb.

Följande skript förutsätter att namnet på din IoT-hubb är device-simulation-test.

# 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

Låt händelseövervakaren vara igång medan du testar de simulerade enheterna.

Skapa en simulering med den uppdaterade kylaggregatets typ

I det här avsnittet använder du Postman-verktyget för att begära att enhetssimuleringsmikrotjänsten kör en simulering med hjälp av den uppdaterade kylaggregatstypen. Postman är ett verktyg som gör att du kan skicka REST-begäranden till en webbtjänst. Postman-konfigurationsfilerna som du behöver finns i din lokala kopia av lagringsplatsen device-simulation-dotnet .

Så här konfigurerar du Postman:

  1. Öppna Postman på din lokala dator.

  2. Klicka på Importera fil>. Klicka sedan på Välj filer.

  3. Gå till mappen device-simulation-dotnet-master/docs/postman . Välj Azure IoT-enhetssimuleringslösning accelerator.postman_collection och Azure IoT-enhetssimuleringslösning accelerator.postman_environment och klicka på Öppna.

  4. Expandera lösningsacceleratorn för Azure IoT-enhetssimulering till de begäranden som du kan skicka.

  5. Klicka på Ingen miljö och välj Lösningsaccelerator för Azure IoT-enhetssimulering.

Nu har du en samling och en miljö som har lästs in på din Postman-arbetsyta som du kan använda för att interagera med mikrotjänsten för enhetssimulering.

Så här konfigurerar och kör du simuleringen:

  1. I Postman-samlingen väljer du Skapa modifierad kylaggregatsimulering och klickar på Skicka. Den här begäran skapar fyra instanser av den simulerade kylaggregatstypen.

  2. Händelseövervakarens utdata i Azure CLI-fönstret visar telemetrin från de simulerade enheterna, inklusive de nya internal_temperature värdena.

Om du vill stoppa simuleringen väljer du begäran Stoppa simulering i Postman och klickar på Skicka.

Skapa en simulering med glödlampans enhetstyp

I det här avsnittet använder du Postman-verktyget för att begära att enhetssimuleringsmikrotjänsten kör en simulering med hjälp av glödlampans enhetstyp. Postman är ett verktyg som gör att du kan skicka REST-begäranden till en webbtjänst.

Så här konfigurerar och kör du simuleringen:

  1. I Postman-samlingen väljer du Skapa glödlampasimulering och klickar på Skicka. Den här begäran skapar två instanser av den simulerade glödlampans enhetstyp.

  2. Händelseövervakarens utdata i Azure CLI-fönstret visar telemetrin från de simulerade glödlamporna.

Om du vill stoppa simuleringen väljer du begäran Stoppa simulering i Postman och klickar på Skicka.

Rensa resurser

Du kan stoppa de två lokalt körande mikrotjänsterna i deras Visual Studio Code-instanser (Felsök > stoppa felsökning).

Om du inte längre behöver IoT Hub- och Cosmos DB-instanserna tar du bort dem från din Azure-prenumeration för att undvika onödiga avgifter.

Nästa steg

Den här guiden visar hur du skapar en anpassad simulerad enhetstyp och testar dem genom att köra mikrotjänsten för enhetssimulering lokalt.

Nästa steg är att lära dig hur du distribuerar dina anpassade simulerade enhetstyper till acceleratorn Fjärrövervakningslösning.