Руководство по Настройка устройств из внутренней службыTutorial: Configure your devices from a back-end service

Кроме получения данных телеметрии с устройств, вам, возможно, потребуется настроить устройства из внутренней службы.As well as receiving telemetry from your devices, you may need to configure your devices from your back-end service. При отправке требуемой конфигурации на устройства вам могут понадобиться обновления состояния и соответствия с этих устройств.When you send a desired configuration to your devices, you may also want to receive status and compliance updates from those devices. Например, вы можете задать целевой рабочий диапазон температур для устройства или получить сведения о версии встроенного ПО устройства.For example, you might set a target operational temperature range for a device or collect firmware version information from your devices.

Чтобы синхронизировать сведения о состоянии между устройством и Центром Интернета вещей, используйте двойники устройств.To synchronize state information between a device and an IoT hub, you use device twins. Двойник устройства — это документ JSON, связанный с определенным устройством, который хранится в Центре Интерната вещей в облаке, где для этот документ можно запрашивать.A device twin is a JSON document, associated with a specific device, and stored by IoT Hub in the cloud where you can query them. Двойник устройства содержит требуемые свойства, передаваемые свойства и теги.A device twin contains desired properties, reported properties, and tags. Требуемое свойство устанавливается внутренним приложением и считывается устройством.A desired property is set by a back-end application and read by a device. Передаваемое свойство устанавливается устройством и считывается внутренним приложением.A reported property is set by a device and read by a back-end application. Тег устанавливается внутренним приложением и никогда не отправляется на устройство.A tag is set by a back-end application and is never sent to a device. Теги используются для упорядочения устройств.You use tags to organize your devices. Из этого руководства вы узнаете, как использовать требуемые и передаваемые свойства, чтобы синхронизировать сведения о состоянии:This tutorial shows you how to use desired and reported properties to synchronize state information:

Сводные сведения о двойниках

Вот какие шаги выполняются в этом руководстве:In this tutorial, you perform the following tasks:

  • создание Центра Интернета вещей и добавление тестового устройства в реестр удостоверений;Create an IoT hub and add a test device to the identity registry.
  • отправка сведений о состоянии на имитированное устройство с помощью требуемых свойств;Use desired properties to send state information to your simulated device.
  • получение сведений о состоянии с имитированного устройства с помощью передаваемых свойств.Use reported properties to receive state information from your simulated device.

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

В Azure есть Azure Cloud Shell, интерактивная оболочка среды, с которой можно работать в браузере.Azure hosts Azure Cloud Shell, an interactive shell environment that you can use through your browser. Для работы со службами Azure в Cloud Shell можно использовать bash и PowerShell.Cloud Shell lets you use either bash or PowerShell to work with Azure services. Для запуска кода из этой статьи можно использовать предварительно установленные команды Cloud Shell. Ничего дополнительного в локальной среде устанавливать не нужно.You can use the Cloud Shell pre-installed commands to run the code in this article without having to install anything on your local environment.

Чтобы запустить Azure Cloud Shell, сделайте вот что:To launch Azure Cloud Shell:

ПараметрOption Пример и ссылкаExample/Link
Нажмите кнопку Попробовать в правом верхнем углу блока с кодом.Select Try It in the upper-right corner of a code block. При нажатии кнопки Попробовать код не копируется в Cloud Shell автоматически.Selecting Try It doesn't automatically copy the code to Cloud Shell. Открытие Azure Cloud Shell с помощью кнопки "Попробовать"
Перейдите по адресу https://shell.azure.com или нажмите кнопку Запуск Cloud Shell, чтобы открыть Cloud Shell в браузере.Go to https://shell.azure.com or select the Launch Cloud Shell button to open Cloud Shell in your browser. <a href="https://shell.azure.com" title="Запуск Azure Cloud Shell
На портале Azure в правом верхнем углу в строке меню нажмите кнопку Cloud Shell.Select the Cloud Shell button on the top-right menu bar in the Azure portal. Кнопка "Cloud Shell" на портале Azure

Чтобы выполнить код из этой статьи в Azure Cloud Shell, сделайте вот что:To run the code in this article in Azure Cloud Shell:

  1. Запустите Cloud Shell.Launch Cloud Shell.
  2. В блоке кода нажмите кнопку Копировать, чтобы скопировать код.Select the Copy button on a code block to copy the code.
  3. Вставьте код в окно сеанса Cloud Shell, нажав клавиши Ctrl+Shift+V в Windows и Linux или Cmd+Shift+V в macOS.Paste the code into the Cloud Shell session with Ctrl+Shift+V on Windows and Linux, or Cmd+Shift+V on macOS.
  4. Нажмите клавишу ВВОД, чтобы выполнить код.Press Enter to run the code.

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.If you don’t have an Azure subscription, create a free account before you begin.

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

Примеры приложений, запускаемых в рамках этого краткого руководства, написаны на языке Node.js.The two sample applications you run in this quickstart are written using Node.js. Вам потребуется установить Node.js 10 x.x или более поздней версии на компьютере для разработки.You need Node.js v10.x.x or later on your development machine.

Node.js, предназначенный для нескольких платформ, можно скачать здесь: nodejs.org.You can download Node.js for multiple platforms from nodejs.org.

Текущую версию Node.js на компьютере, на котором ведется разработка, можно проверить, используя следующую команду:You can verify the current version of Node.js on your development machine using the following command:

node --version

Скачайте пример проекта Node.js по адресу https://github.com/Azure-Samples/azure-iot-samples-node/archive/master.zip и извлеките ZIP-архив.Download the sample Node.js project from https://github.com/Azure-Samples/azure-iot-samples-node/archive/master.zip and extract the ZIP archive.

Настройка ресурсов AzureSet up Azure resources

Для выполнения задач из этого руководства в подписке Azure должен содержаться Центр Интернета вещей с устройством, добавленным в реестр удостоверений устройств.To complete this tutorial, your Azure subscription must contain an IoT hub with a device added to the device identity registry. С помощью записи в реестре удостоверений устройств имитированное устройство, которое запускается в рамках этого руководства, подключается к центру.The entry in the device identity registry enables the simulated device you run in this tutorial to connect to your hub.

Если в вашей подписке еще не настроен Центр Интернета вещей, можно сделать это с помощью приведенного ниже скрипта CLI.If you don't already have an IoT hub set up in your subscription, you can set one up with the following CLI script. В этом скрипте для Центра Интернета вещей используется имя tutorial-iot-hub. При запуске замените его своим уникальным именем.This script uses the name tutorial-iot-hub for the IoT hub, you should replace this name with your own unique name when you run it. С помощью скрипта создается группа ресурсов и центр в регионе Центральная часть США. Вы можете использовать регион, который находится ближе к вам.The script creates the resource group and hub in the Central US region, which you can change to a region closer to you. Скрипт получает строку подключения для службы Центра Интернета вещей. Эта строка используется в примере внутреннего приложения для подключения к Центру Интернета вещей:The script retrieves your IoT hub service connection string, which you use in the back-end sample to connect to your IoT hub:

hubname=tutorial-iot-hub
location=centralus

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

# Create a resource group:
az group create --name tutorial-iot-hub-rg --location $location

# Create your free-tier IoT Hub. You can only have one free IoT Hub per subscription:
az iot hub create --name $hubname --location $location --resource-group tutorial-iot-hub-rg --sku F1

# Make a note of the service connection string, you need it later:
az iot hub show-connection-string --name $hubname --policy-name service -o table

В этом руководстве используется имитированное устройство с именем MyTwinDevice.This tutorial uses a simulated device called MyTwinDevice. С помощью следующего скрипта это устройство добавляется в реестр удостоверений и извлекается строка подключения:The following script adds this device to your identity registry and retrieves its connection string:

# Set the name of your IoT hub:
hubname=tutorial-iot-hub

# Create the device in the identity registry:
az iot hub device-identity create --device-id MyTwinDevice --hub-name $hubname --resource-group tutorial-iot-hub-rg

# Retrieve the device connection string, you need this later:
az iot hub device-identity show-connection-string --device-id MyTwinDevice --hub-name $hubname --resource-group tutorial-iot-hub-rg -o table

Отправка сведений о состоянииSend state information

Для отправки сведений о состоянии из внутреннего приложения на устройство используются требуемые свойства.You use desired properties to send state information from a back-end application to a device. Из этого раздела вы узнаете, как выполнять следующие действия:In this section, you see how to:

  • получать и обрабатывать требуемые свойства на устройстве;Receive and process desired properties on a device.
  • отправлять требуемые свойства из внутреннего приложения.Send desired properties from a back-end application.

Чтобы просмотреть пример кода имитированного устройства для получения требуемых свойств, перейдите к папке iot-hub/Tutorials/DeviceTwins в скачанном примере проекта Node.js.To view the simulated device sample code that receives desired properties, navigate to the iot-hub/Tutorials/DeviceTwins folder in the sample Node.js project you downloaded. Затем в текстовом редакторе откройте файл SimulatedDevice.js.Then open the SimulatedDevice.js file in a text editor.

В следующих разделах описан код для запуска на имитированном устройстве. Устройство реагирует на изменения свойств, которые отправляются из внутреннего приложения:The following sections describe the code that runs on the simulated device that responds to desired property changes sent from the back end application:

Получение объекта двойника устройстваRetrieve the device twin object

Следующий код позволяет подключиться к Центру Интернета вещей с помощью строки подключения устройства:The following code connects to your IoT hub using a device connection string:

// Get the device connection string from a command line argument
var connectionString = process.argv[2];

С помощью следующего кода из объекта клиента извлекается двойник:The following code gets a twin from the client object:

// Get the device twin
client.getTwin(function(err, twin) {
  if (err) {
    console.error(chalk.red('Could not get device twin'));
  } else {
    console.log(chalk.green('Device twin created'));

Пример требуемых свойствSample desired properties

Вы можете структурировать требуемые свойства любым подходящим для вашего приложения способом.You can structure your desired properties in any way that's convenient to your application. В этом примере используется одно свойство верхнего уровня с именем fanOn. Остальные свойства группируются в отдельные компоненты.This example uses one top-level property called fanOn and groups the remaining properties into separate components. В следующем фрагменте JSON показана структура требуемых свойств, которая используется в этом руководстве:The following JSON snippet shows the structure of the desired properties this tutorial uses:

{
  "fanOn": "true",
  "components": {
    "system": {
      "id": "17",
      "units": "farenheit",
      "firmwareVersion": "9.75"
    },
    "wifi" : { 
      "channel" : "6",
      "ssid": "my_network"
    },
    "climate" : {
      "minTemperature": "68",
      "maxTemperature": "76"
    }
  }
}

Создание обработчиковCreate handlers

Для обновления требуемых свойств можно создавать обработчики, которые реагируют на такие обновления на разных уровнях иерархии JSON.You can create handlers for desired property updates that respond to updates at different levels in the JSON hierarchy. Например, представленный ниже обработчик распознает все изменения требуемых свойств, отправленные на устройство из внутреннего приложения.For example, this handler sees all desired property changes sent to the device from a back-end application. Переменная delta содержит требуемые свойства, отправленные из серверной части решения:The delta variable contains the desired properties sent from the solution back end:

// Handle all desired property updates
twin.on('properties.desired', function(delta) {
    console.log(chalk.yellow('\nNew desired properties received in patch:'));

Следующий обработчик реагирует только на изменения, внесенные в требуемое свойство fanOn:The following handler only reacts to changes made to the fanOn desired property:

// Handle changes to the fanOn desired property
twin.on('properties.desired.fanOn', function(fanOn) {
    console.log(chalk.green('\nSetting fan state to ' + fanOn));

    // Update the reported property after processing the desired property
    reportedPropertiesPatch.fanOn = fanOn ? fanOn : '{unknown}';
});

Обработчики для нескольких свойствHandlers for multiple properties

В приведенном ранее примере JSON для требуемых свойств узел climate в разделе components содержит два свойства — minTemperature и maxTemperature.In the example desired properties JSON shown previously, the climate node under components contains two properties, minTemperature and maxTemperature.

В локальном объекте устройства twin хранится полный набор требуемых и передаваемых свойств.A device's local twin object stores a complete set of desired and reported properties. С помощью переменной delta, отправленной из серверной части, можно обновить только подмножество требуемых свойств.The delta sent from the back end might update just a subset of desired properties. В следующем фрагменте кода, если имитированное устройство получает обновление только для одного из свойств (minTemperature или maxTemperature), при настройке устройства для другого свойства используется значение с локального двойника:In the following code snippet, if the simulated device receives an update to just one of minTemperature and maxTemperature, it uses the value in the local twin for the other value to configure the device:

// Handle desired properties updates to the climate component
twin.on('properties.desired.components.climate', function(delta) {
    if (delta.minTemperature || delta.maxTemperature) {
      console.log(chalk.green('\nUpdating desired tempertures in climate component:'));
      console.log('Configuring minimum temperature: ' + twin.properties.desired.components.climate.minTemperature);
      console.log('Configuring maximum temperture: ' + twin.properties.desired.components.climate.maxTemperature);

      // Update the reported properties and send them to the hub
      reportedPropertiesPatch.minTemperature = twin.properties.desired.components.climate.minTemperature;
      reportedPropertiesPatch.maxTemperature = twin.properties.desired.components.climate.maxTemperature;
      sendReportedProperties();
    }
});

В локальном объекте twin хранится полный набор требуемых и передаваемых свойств.The local twin object stores a complete set of desired and reported properties. С помощью переменной delta, отправленной из серверной части, можно обновить только подмножество требуемых свойств.The delta sent from the back end might update just a subset of desired properties.

Обработка операций вставки, обновления и удаленияHandle insert, update, and delete operations

Требуемые свойства, которые отправляются из серверной части, не определяют, какая операция выполняется с конкретным требуемым свойством.The desired properties sent from the back end don't indicate what operation is being performed on a particular desired property. Операция должна определяться кодом на основе текущего набора требуемых свойств, которые хранятся локально, и изменений, отправленных из центра.Your code needs to infer the operation from the current set of desired properties stored locally and the changes sent from the hub.

В приведенном ниже фрагменте кода показано, как имитированное устройство обрабатывает операции вставки, обновления и удаления в списке components для требуемых свойств.The following snippet shows how the simulated device handles insert, update, and delete operations on the list of components in the desired properties. Посмотрите, как указать, что компонент нужно удалить, с помощью значений NULL:You can see how to use null values to indicate that a component should be deleted:

// Keep track of all the components the device knows about
var componentList = {};

// Use this componentList list and compare it to the delta to infer
// if anything was added, deleted, or updated.
twin.on('properties.desired.components', function(delta) {
  if (delta === null) {
    componentList = {};
  }
  else {
    Object.keys(delta).forEach(function(key) {

      if (delta[key] === null && componentList[key]) {
        // The delta contains a null value, and the
        // device has a record of this component.
        // Must be a delete operation.
        console.log(chalk.green('\nDeleting component ' + key));
        delete componentList[key];

      } else if (delta[key]) {
        if (componentList[key]) {
          // The delta contains a component, and the
          // device has a record of it.
          // Must be an update operation.
          console.log(chalk.green('\nUpdating component ' + key + ':'));
          console.log(JSON.stringify(delta[key]));
          // Store the complete object instead of just the delta
          componentList[key] = twin.properties.desired.components[key];

        } else {
          // The delta contains a component, and the
          // device has no record of it.
          // Must be an add operation.
          console.log(chalk.green('\nAdding component ' + key + ':'));
          console.log(JSON.stringify(delta[key]));
          // Store the complete object instead of just the delta
          componentList[key] = twin.properties.desired.components[key];
        }
      }
    });
  }
});

Отправка требуемых свойств на устройство из внутреннего приложенияSend desired properties to a device from the back end

Вы узнали, как в устройстве реализуются обработчики для получения обновлений требуемых свойств.You've seen how a device implements handlers for receiving desired property updates. В этом разделе показано, как отправлять изменения требуемых свойств на устройство из внутреннего приложения.This section shows you how to send desired property changes to a device from a back-end application.

Чтобы просмотреть пример кода имитированного устройства для получения требуемых свойств, перейдите к папке iot-hub/Tutorials/DeviceTwins в скачанном примере проекта Node.js.To view the simulated device sample code that receives desired properties, navigate to the iot-hub/Tutorials/DeviceTwins folder in the sample Node.js project you downloaded. Затем в текстовом редакторе откройте файл ServiceClient.js.Then open the ServiceClient.js file in a text editor.

В следующем фрагменте кода показано, как подключиться к реестру удостоверений устройства и получать доступ к двойнику конкретного устройства:The following code snippet shows how to connect to the device identity registry and access the twin for a specific device:

// Create a device identity registry object
var registry = Registry.fromConnectionString(connectionString);

// Get the device twin and send desired property update patches at intervals.
// Print the reported properties after some of the desired property updates.
registry.getTwin(deviceId, async (err, twin) => {
  if (err) {
    console.error(err.message);
  } else {
    console.log('Got device twin');

В следующем фрагменте кода показаны различные исправления для требуемого свойства, которые внутреннее приложение отправляет на устройство:The following snippet shows different desired property patches the back end application sends to the device:

// Turn the fan on
var twinPatchFanOn = {
  properties: {
    desired: {
      patchId: "Switch fan on",
      fanOn: "false",
    }
  }
};

// Set the maximum temperature for the climate component
var twinPatchSetMaxTemperature = {
  properties: {
    desired: {
      patchId: "Set maximum temperature",
      components: {
        climate: {
          maxTemperature: "92"
        }
      }
    }
  }
};

// Add a new component
var twinPatchAddWifiComponent = {
  properties: {
    desired: {
      patchId: "Add WiFi component",
      components: {
        wifi: { 
          channel: "6",
          ssid: "my_network"
        }
      }
    }
  }
};

// Update the WiFi component
var twinPatchUpdateWifiComponent = {
  properties: {
    desired: {
      patchId: "Update WiFi component",
      components: {
        wifi: { 
          channel: "13",
          ssid: "my_other_network"
        }
      }
    }
  }
};

// Delete the WiFi component
var twinPatchDeleteWifiComponent = {
  properties: {
    desired: {
      patchId: "Delete WiFi component",
      components: {
        wifi: null
      }
    }
  }
};

В следующем фрагменте кода показано, как внутреннее приложение отправляет обновление требуемого свойства на устройство:The following snippet shows how the back-end application sends a desired property update to a device:

// Send a desired property update patch
async function sendDesiredProperties(twin, patch) {
  twin.update(patch, (err, twin) => {
    if (err) {
      console.error(err.message);
    } else {
      console.log(chalk.green(`\nSent ${twin.properties.desired.patchId} patch:`));
      console.log(JSON.stringify(patch, null, 2));
    }
  });
}

Запуск приложенийRun the applications

В рамках этого раздела вы запустите два примера приложений, чтобы узнать, как внутреннее приложение отправляет обновления требуемых свойств в приложение имитированного устройства.In this section, you run two sample applications to observe as a back-end application sends desired property updates to a simulated device application.

Чтобы запустить имитированное устройство и внутренние приложения, нужны строки подключения для устройства и службы.To run the simulated device and back-end applications, you need the device and service connection strings. Вы записали строки подключения при создании ресурсов в начале работы с этим руководством.You made a note of the connection strings when you created the resources at the start of this tutorial.

Чтобы запустить приложение имитированного устройства, откройте окно оболочки или командной строки и перейдите к папке iot-hub/Tutorials/DeviceTwins в скачанном проекте Node.js.To run the simulated device application, open a shell or command prompt window and navigate to the iot-hub/Tutorials/DeviceTwins folder in the Node.js project you downloaded. Затем выполните следующие команды:Then run the following commands:

npm install
node SimulatedDevice.js "{your device connection string}"

Чтобы запустить внутреннее приложение, откройте еще одно окно оболочки или командной строки.To run the back-end application, open another shell or command prompt window. Затем перейдите к папке iot-hub/Tutorials/DeviceTwins в скачанном проекте Node.js.Then navigate to the iot-hub/Tutorials/DeviceTwins folder in the Node.js project you downloaded. Затем выполните следующие команды:Then run the following commands:

npm install
node ServiceClient.js "{your service connection string}"

На следующем снимке экрана отображаются выходные данные приложения имитированного устройства и показано, как обрабатывается обновление требуемого свойства maxTemperature.The following screenshot shows the output from the simulated device application and highlights how it handles an update to the maxTemperature desired property. Вы можете посмотреть, как действуют обработчик верхнего уровня и обработчики компонента climate:You can see how both the top-level handler and the climate component handlers run:

Виртуальное устройство

На следующем снимке экрана отображаются выходные данные внутреннего приложения и показано, как отправляется обновление требуемого свойства maxTemperature:The following screenshot shows the output from the back-end application and highlights how it sends an update to the maxTemperature desired property:

Внутреннее приложение

Получение сведений о состоянииReceive state information

Внутреннее приложение получает сведения о состоянии с устройства как передаваемые свойства.Your back-end application receives state information from a device as reported properties. Устройство задает передаваемые свойства и отправляет их в центр.A device sets the reported properties, and sends them to your hub. Внутреннее приложение может считывать текущие значения передаваемых свойств c двойника устройства, хранящегося в центре.A back-end application can read the current values of the reported properties from the device twin stored in your hub.

Отправка передаваемых свойств с устройстваSend reported properties from a device

Вы можете передавать обновления в значения передаваемых свойств в качестве исправлений.You can send updates to reported property values as a patch. В следующем фрагменте кода показан шаблон для исправления, отправляемого имитированным устройством.The following snippet shows a template for the patch the simulated device sends. Имитированное устройство обновляет поля в исправлении перед его отправкой в центр:The simulated device updates the fields in the patch before sending it to the hub:

// Create a patch to send to the hub
var reportedPropertiesPatch = {
  firmwareVersion:'1.2.1',
  lastPatchReceivedId: '',
  fanOn:'',
  minTemperature:'',
  maxTemperature:''
};

Имитированное устройство использует следующую функцию для отправки в центр исправлений, которые содержат передаваемые свойства:The simulated device uses the following function to send the patch that contains the reported properties to the hub:

// Send the reported properties patch to the hub
function sendReportedProperties() {
  twin.properties.reported.update(reportedPropertiesPatch, function(err) {
    if (err) throw err;
    console.log(chalk.blue('\nTwin state reported'));
    console.log(JSON.stringify(reportedPropertiesPatch, null, 2));
  });
}

Обработка передаваемых свойствProcess reported properties

Внутреннее приложение обращается к текущим значениям передаваемых свойств для устройства с помощью двойника устройства.A back-end application accesses the current reported property values for a device through the device twin. В следующем фрагменте показано, как внутреннее приложение считывает значения передаваемых свойств для имитированного устройства:The following snippet shows you how the back-end application reads the reported property values for the simulated device:

// Display the reported properties from the device
function printReportedProperties(twin) {
  console.log("Last received patch: " + twin.properties.reported.lastPatchReceivedId);
  console.log("Firmware version: " + twin.properties.reported.firmwareVersion);
  console.log("Fan status: " + twin.properties.reported.fanOn);
  console.log("Min temperature set: " + twin.properties.reported.minTemperature);
  console.log("Max temperature set: " + twin.properties.reported.maxTemperature);
}

Запуск приложенийRun the applications

В рамках этого раздела вы запустите два примера приложений, чтобы узнать, как приложение имитированного устройства отправляет обновления передаваемых свойств во внутреннее приложение.In this section, you run two sample applications to observe as a simulated device application sends reported property updates to a back-end application.

Запускаются те же два примера приложения, которые вы запускали, чтобы узнать, как требуемые свойства отправляются на устройство.You run the same two sample applications that you ran to see how desired properties are sent to a device.

Чтобы запустить имитированное устройство и внутренние приложения, нужны строки подключения для устройства и службы.To run the simulated device and back-end applications, you need the device and service connection strings. Вы записали строки подключения при создании ресурсов в начале работы с этим руководством.You made a note of the connection strings when you created the resources at the start of this tutorial.

Чтобы запустить приложение имитированного устройства, откройте окно оболочки или командной строки и перейдите к папке iot-hub/Tutorials/DeviceTwins в скачанном проекте Node.js.To run the simulated device application, open a shell or command prompt window and navigate to the iot-hub/Tutorials/DeviceTwins folder in the Node.js project you downloaded. Затем выполните следующие команды:Then run the following commands:

npm install
node SimulatedDevice.js "{your device connection string}"

Чтобы запустить внутреннее приложение, откройте еще одно окно оболочки или командной строки.To run the back-end application, open another shell or command prompt window. Затем перейдите к папке iot-hub/Tutorials/DeviceTwins в скачанном проекте Node.js.Then navigate to the iot-hub/Tutorials/DeviceTwins folder in the Node.js project you downloaded. Затем выполните следующие команды:Then run the following commands:

npm install
node ServiceClient.js "{your service connection string}"

На следующем снимке экрана отображаются выходные данные приложения имитированного устройства и показано, как оно отправляет обновление передаваемого свойства в центр:The following screenshot shows the output from the simulated device application and highlights how it sends a reported property update to your hub:

Виртуальное устройство

На следующем снимке экрана отображаются выходные данные внутреннего приложения и показано, как оно принимает и обрабатывает обновление передаваемого свойства, полученное с устройства:The following screenshot shows the output from the back-end application and highlights how it receives and processes a reported property update from a device:

Внутреннее приложение

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

Не удаляйте группу ресурсов и Центр Интернета вещей, так как они понадобятся вам при работе со следующим руководством.If you plan to complete the next tutorial, leave the resource group and IoT hub and reuse them later.

Если вам больше не требуется Центр Интернета вещей, удалите его и группу ресурсов на портале.If you don't need the IoT hub any longer, delete it and the resource group in the portal. Для этого выберите группу ресурсов tutorial-iot-hub-rg, содержащую Центр Интернета вещей, и щелкните Удалить.To do so, select the tutorial-iot-hub-rg resource group that contains your IoT hub and click Delete.

Или используйте CLI:Alternatively, use the CLI:

# Delete your resource group and its contents
az group delete --name tutorial-iot-hub-rg

Дополнительная информацияNext steps

Из этого руководства вы узнали, как синхронизировать сведения о состоянии между устройствами и Центром Интернета вещей.In this tutorial, you learned how to synchronize state information between your devices and your IoT hub. Перейдите к следующему руководству, чтобы научиться использовать двойники устройств для обновления встроенного ПО.Advance to the next tutorial to learn how to use device twins to implement a firmware update process.