Создание и тестирование нового имитированного устройства

Акселератор решения для удаленного мониторинга позволяет определить собственные имитированные устройства. В этой статье показано, как определить новое имитируемое устройство типа Lightbulb, а затем проверить его локально. Акселератор решений содержит имитированные устройства, такие как холодильники и грузовики. Тем не менее, вы можете определить собственные имитированные устройства для тестирования решений Интернета вещей до развертывания настоящих устройств.

Примечание

В этой статье описывается использование имитированных устройств, размещенных в службе моделирования устройств. Если вам требуется создать реальное устройство, см. статью Подключение устройства к акселератору решения для удаленного мониторинга (Node.js).

В этом руководстве показано, как настроить микрослужбу имитации устройств. Эта микрослужба является частью акселератора решения для удаленного мониторинга. Чтобы продемонстрировать возможности имитации устройств, в этом практическом руководстве рассматривается два сценария с приложением Интернета вещей компании Contoso.

В первом сценарии вы добавляете новый тип телеметрии к существующему типу устройства охладителя компании Contoso.

Во втором сценарии компания Contoso планирует протестировать новое интеллектуальное устройство управления освещением. Чтобы выполнить тесты, необходимо создать новое виртуальное устройство со следующими характеристиками:

Свойства

Имя Значения
Цвет Белый, красный, синий
Brightness 0–100
Ожидаемое время работы Обратный отсчет, начиная с 10 000 часов

Телеметрия

В таблице ниже приведены данные, которые система освещения потоком передает в облако.

Имя Значения
Состояние on, off
температура; Градусы по Фаренгейту
в сети true, false

Примечание

Значение телеметрии в сети является обязательным для всех типов имитации.

Методы

В таблице ниже приведены действия, поддерживаемые новым устройством.

Имя
Включение
Выключение

Начальное состояние

В таблице ниже представлены начальные показатели устройства.

Имя Значения
Начальный цвет White
Начальная яркость 75
Начальное ожидаемое время работы 10 000
Начальное состояние передачи данных телеметрии on
Начальная температура телеметрии 200

Чтобы выполнить действия, описанные в этом руководстве, вам потребуется активная подписка Azure.

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начинать работу.

Использование Azure Cloud Shell

В Azure есть Azure Cloud Shell, интерактивная оболочка среды, с которой можно работать в браузере. Для работы со службами Azure можно использовать Bash или PowerShell с Cloud Shell. Для запуска кода из этой статьи можно использовать предварительно установленные команды Cloud Shell. Ничего дополнительного в локальной среде устанавливать не нужно.

Начало работы с Azure Cloud Shell

Параметр Пример и ссылка
Нажмите кнопку Попробовать в правом верхнем углу блока с кодом. При нажатии кнопки Попробовать код не копируется в Cloud Shell автоматически. Открытие Azure Cloud Shell с помощью кнопки
Чтобы открыть Cloud Shell в браузере, перейдите по адресу https://shell.azure.com или нажмите кнопку Запуск Cloud Shell. Запуск Cloud Shell в новом окне
Нажмите кнопку Cloud Shell в строке меню в правом верхнем углу окна портала Azure. Кнопка Cloud Shell на портале Azure

Чтобы выполнить код из этой статьи в Azure Cloud Shell, выполните следующие действия:

  1. Запустите Cloud Shell.

  2. В блоке кода нажмите кнопку Копировать, чтобы скопировать код.

  3. Вставьте код в окно сеанса Cloud Shell, нажав клавиши CTRLSHIFTV в Windows и Linux или CMDSHIFTV в macOS.

  4. Нажмите клавишу ВВОД, чтобы выполнить код.

Предварительные требования

Чтобы следовать этому пошаговому руководству, вам необходимы следующие компоненты.

Подготовка среды разработки

Для подготовки среды разработки выполните следующие действия:

  • загрузите исходный код для микрослужбы моделирования устройств;
  • загрузите исходный код для микрослужбы адаптера хранилища;
  • запустите микрослужбу адаптера хранилища локально.

В инструкциях этой статьи предполагается, что вы используете Windows. Если вы используете другую операционную систему, может потребоваться изменить некоторые пути к файлам и команды в соответствии с требованиями вашей среды.

Загрузка микрослужб

Скачайте и распакуйте микрослужбы удаленного мониторинга из GitHub в подходящее расположение на локальном компьютере. В этой статье предполагается, что эта папка называется remote-monitoring-services-dotnet-master.

Скачайте и распакуйте микрослужбу моделирования устройств из GitHub в подходящее место на вашем локальном компьютере. В этой статье предполагается, что эта папка называется device-simulation-dotnet-master.

Запуск микрослужбы адаптера хранилища

Откройте папку remote-monitoring-services-dotnet-master\storage-adapter в Visual Studio Code. Чтобы исправить любые нерешенные зависимости, щелкните любую кнопку Восстановить.

Откройте файл storage-adapter/WebService/appsettings.ini и назначьте строку подключения Cosmos DB переменной documentDBConnectionString .

Чтобы запустить микрослужбу локально, выберите Отладка > Начать отладку.

Окно Терминал в Visual Studio Code отображает выходные данные из работающей микрослужбы, включая URL-адрес проверки работоспособности веб-службы: http://127.0.0.1:9022/v1/status. При переходе на этот адрес, состояние должно быть "OK: живой и отлично".

Оставьте микрослужбу адаптера хранилища запущенной в данном экземпляре Visual Studio Code, пока вы выполняете следующие действия.

Изменения охладителя

В этом разделе вы добавите новый тип телеметрии Внутренняя температура для существующего типа устройства охладителя.

  1. Создайте новую папку C:\temp\devicemodels на локальном компьютере.

  2. Скопируйте следующие файлы в новую папку, из загруженной копии микрослужбы моделирования устройств.

    Источник Назначение
    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.

  4. В разделе InitialState добавьте два следующих определения:

    "internal_temperature": 65.0,
    "internal_temperature_unit": "F",
    
  5. В массиве Telemetry добавьте следующее определение:

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

  7. Откройте файл C:\temp\devicemodels\scripts\chiller-01-state.js.

  8. Добавьте в переменную state следующие поля:

    internal_temperature: 65.0,
    internal_temperature_unit: "F",
    
  9. Обновите функцию main следующим образом.

    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.

Создание лампочки

В этом разделе вы определите новый тип устройства лампочка.

  1. Создайте файл C:\temp\devicemodels\lightbulb-01.json и добавьте следующее содержимое.

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

  2. Создайте файл C:\temp\devicemodels\scripts\lightbulb-01-state.js и добавьте следующее содержимое.

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

    Сохраните изменения в C:\temp\devicemodels\scripts\lightbulb-01-state.js.

  3. Создайте файл C:\temp\devicemodels\scripts\SwitchOn-method.js и добавьте следующее содержимое.

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

    Сохраните изменения в C:\temp\devicemodels\scripts\SwitchOn-method.js.

  4. Создайте файл C:\temp\devicemodels\scripts\SwitchOff-method.js и добавьте следующее содержимое.

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

    Сохраните изменения в C:\temp\devicemodels\scripts\SwitchOff-method.js.

Теперь вы создали настроенную версию типа устройства охладителя и создали новый тип устройства лампочка.

Тестирование устройств

В этом разделе вы тестируете типы устройств, локально созданные в предыдущих разделах.

Запуск микрослужбы моделирования устройств

Откройте папку ​​device-simulation-dotnet-master, загруженную с GitHub, в новом экземпляре Visual Studio Code. Чтобы исправить любые нерешенные зависимости, щелкните любую кнопку Восстановить.

Откройте файл WebService/appsettings.ini и назначьте строку подключения Cosmos DB переменной documentdb_connstring , а также измените параметры следующим образом:

device_models_folder = C:\temp\devicemodels\

device_models_scripts_folder = C:\temp\devicemodels\scripts\

Чтобы запустить микрослужбу локально, выберите Отладка > Начать отладку.

Окно Терминал в Visual Studio Code отображает выходные данные из работающей микрослужбы.

Оставьте микрослужбу моделирования устройств запущенной в данном экземпляре Visual Studio Code, пока вы выполняете следующие действия.

Настройка монитора для событий устройства

В этом разделе вы используете Azure CLI, чтобы настроить монитор событий для просмотра телеметрии, отправленной с устройств, подключенных к Центру Интернета вещей.

В следующем сценарии предполагается, что имя вашего Центра Интернета вещей — 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

Оставьте монитор событий включенным во время тестирования имитируемых устройств.

Создание имитации с обновленным типом устройства охладителя

В этом разделе вы используете средство Postman для запроса микрослужбы моделирования устройства, чтобы запустить имитацию с использованием обновленного типа устройства охладителя. Postman — это средство, которое позволяет отправлять запросы REST на веб-службу. Необходимые файлы конфигурации Postman находятся в вашей локальной копии репозитория device-simulation-dotnet.

Действия для настройки Postman.

  1. Откройте Postman на локальном компьютере.

  2. Выберите Файл > Импорт. Затем нажмите Выбор файлов.

  3. Перейдите в папку device-simulation-dotnet-master/docs/postman. Выберите решение для имитации устройств Интернета вещей Azure accelerator.postman_collection и решение имитации устройств Интернета вещей Azure accelerator.postman_environment и нажмите кнопку "Открыть".

  4. Разверните Акселератор решений имитации устройств Azure loT для запросов, которые вы можете отправить.

  5. Щелкните "Нет среды " и выберите акселератор решения имитации устройств Интернета вещей Azure.

Теперь у вас есть коллекция и среда, загруженные в рабочее пространство Postman, которые вы можете использовать для взаимодействия с микрослужбой моделирования устройств.

Настройка и запуск имитации.

  1. В коллекции Postman выберите Создать имитацию модифицированного охладителя и нажмите Отправить. Этот запрос создает четыре экземпляра имитации типа устройства охладителя.

  2. Выход монитора событий в окне Azure CLI показывает телеметрию с имитируемых устройств, включая новые значения internal_temperature.

Чтобы остановить имитацию, выберите запрос в Postman Остановить имитацию и нажмите Отправка.

Создание имитации с типом устройства "лампочка"

В этом разделе вы используете средство Postman для запроса микрослужбы моделирования устройства, чтобы запустить имитацию с использованием типа устройства "лампочка". Postman — это средство, которое позволяет отправлять запросы REST на веб-службу.

Настройка и запуск имитации.

  1. В коллекции Postman выберите Создать имитацию лампочки и нажмите Отправить. Этот запрос создает два экземпляра имитации устройства типа "лампочка".

  2. Выход монитора событий в окне Azure CLI показывает телеметрию из имитируемых лампочек.

Чтобы остановить имитацию, выберите запрос в Postman Остановить имитацию и нажмите Отправка.

Очистка ресурсов

Вы можете остановить две локально работающие микрослужбы в своих экземплярах Visual Studio Code (Отладка > Остановить отладку).

Если вы больше не нуждаетесь в экземплярах Центра Интернета вещей и Cosmos DB, удалите их из подписки Azure, чтобы избежать ненужных расходов.

Дальнейшие действия

В этом руководстве показано, как создавать пользовательские типы имитированных устройств и проверять их, запустив микрослужбу имитации устройств в локальной среде.

Далее мы рекомендуем научиться развертывать пользовательские типы имитированных устройств в акселератор решения для удаленного мониторинга.