Поделиться через


Интеграция данных Azure Digital Twins с картой помещений Azure Maps

В этой статье показано, как использовать данные Azure Digital Twins для обновления сведений, отображаемых на карте помещений из Azure Maps. Так как Azure Digital Twins хранит граф связей устройств Интернета вещей и направляет данные устройства в разные конечные точки, это отличная служба для обновления информационных наложения на картах.

В этом руководстве рассматриваются следующие сведения:

  1. Настройка экземпляра Azure Digital Twins для отправки событий обновления двойника в Функции Azure.
  2. Создание функции для обновления набора состояний для схем помещений Azure Maps.
  3. Хранение идентификатора карт и идентификатора набора состояний компонентов в графе Azure Digital Twins.

Начало работы

Этот раздел задает дополнительный контекст для сведений в этой статье.

Необходимые компоненты

Прежде чем продолжить работу с этой статьей, начните с настройки отдельных ресурсов Azure Digital Twins и Azure Maps.

  • Для Azure Digital Twins. Следуйте инструкциям в статье "Подключение комплексного решения " для настройки экземпляра Azure Digital Twins с примером графа двойников и имитированного потока данных.
    • В этой статье описано, как расширить это решение с помощью другой конечной точки и маршрута. Вы также добавите другую функцию в приложение-функцию из этого руководства.
  • Для Azure Maps: выполните инструкции, описанные в разделе "Использование Создателя" для создания карт помещений и создания карты помещений Azure Maps с набором состояний признаков.
    • Наборы состояний функции — это коллекции динамических свойств (состояний), назначенных функциям наборов данных, например комнатам или оборудованию. В приведенных выше инструкциях Azure Maps набор состояний компонентов сохраняет состояние комнаты, которое будет отображаться на карте.
    • Вам потребуется ключ подписки Azure Maps, идентификатор набора состояний компонентов и mapConfiguration.

Топология

На рисунке ниже показано, где элементы интеграции карт в этом руководстве соответствуют более широкому комплексному сценарию Azure Digital Twins.

Схема служб Azure в комплексном сценарии, в котором выделен элемент интеграции Indoor Maps.

Уведомления об обновлении двойников маршрутизации из Azure Digital Twins

Экземпляры Azure Digital Twins могут создавать события обновления двойника при каждом обновлении состояния двойника. Руководство по созданию комплексного решения содержит пошаговое описание сценария, в котором для обновления атрибута температуры цифрового двойника для помещения используется термометр. Это руководство расширяет это решение, подписав функцию Azure для обновления уведомлений от двойников и используя эту функцию для обновления карт.

Этот шаблон считывает данные из двойника комнаты напрямую, а не с устройства IoT, что позволяет изменить базовый источник данных температуры без обновления логики сопоставления. Например, можно добавить несколько термометров или указать для этой комнаты общий доступ к термометру в другой комнате без обновления логики карт.

Во-первых, вы создадите маршрут в Azure Digital Twins для пересылки всех событий обновления двойников в раздел Сетки событий.

  1. Создайте раздел сетки событий, который будет получать события из экземпляра Azure Digital Twins, используя следующую команду CLI:

    az eventgrid topic create --resource-group <your-resource-group-name> --name <your-topic-name> --location <region>
    
  2. Создайте конечную точку для связывания раздела сетки событий с Azure Digital Twins, используя следующую команду CLI:

    az dt endpoint create eventgrid --endpoint-name <Event-Grid-endpoint-name> --eventgrid-resource-group <Event-Grid-resource-group-name> --eventgrid-topic <your-Event-Grid-topic-name> --dt-name <your-Azure-Digital-Twins-instance-name>
    
  3. Создайте маршрут в Azure Digital Twins для отправки событий обновления двойников в конечную точку с помощью команды CLI ниже. Для заполнителя имени экземпляра Azure Digital Twins в этой команде можно использовать понятное имя или имя узла для повышения производительности.

    Примечание.

    В настоящее время в Cloud Shell существует известная проблема, влияющая на эти группы команд: az dt route, , az dt modelaz dt twin.

    Чтобы устранить эту проблему, выполните az login в Cloud Shell перед выполнением команды или используйте локальный CLI вместо Cloud Shell. Дополнительные сведения об этом см. в статье об известных проблемах Azure Digital Twins.

    az dt route create --dt-name <your-Azure-Digital-Twins-instance-hostname-or-name> --endpoint-name <Event-Grid-endpoint-name> --route-name <my-route> --filter "type = 'Microsoft.DigitalTwins.Twin.Update'"
    

Создание функции Azure для получения событий и карт обновления

В этом разделе вы создадите функцию, которая прослушивает события, отправленные в раздел "Сетка событий". Функция считывает эти уведомления об обновлении и отправляет соответствующие обновления в набор состояний функций Azure Maps, чтобы обновить температуру одной комнаты.

В руководстве по Azure Digital Twins необходимо создать приложение-функцию для хранения функций Azure Digital Twins. Теперь создайте функцию Azure, активированную сеткой событий, внутри приложения-функции.

Замените функцию следующим кодом. Он фильтрует только обновления двойников пространства, считывает обновленную температуру и отправляет эти сведения в Azure Maps.

using System;
using System.Threading.Tasks;
using System.Net.Http;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.EventGrid;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Azure.Messaging.EventGrid;

namespace updateMaps
{
    public static class ProcessDTUpdatetoMaps
    {
        // Read maps credentials from application settings on function startup
        private static string statesetID = Environment.GetEnvironmentVariable("statesetID");
        private static string subscriptionKey = Environment.GetEnvironmentVariable("subscription-key");
        private static HttpClient httpClient = new HttpClient();

        [FunctionName("ProcessDTUpdatetoMaps")]
        public static async Task Run([EventGridTrigger]EventGridEvent eventGridEvent, ILogger log)
        {
            JObject message = (JObject)JsonConvert.DeserializeObject(eventGridEvent.Data.ToString());
            log.LogInformation($"Reading event from twinID: {eventGridEvent.Subject}: {eventGridEvent.EventType}: {message["data"]}");

            //Parse updates to "space" twins
            if (message["data"]["modelId"].ToString() == "dtmi:contosocom:DigitalTwins:Space;1")
            {
                // Set the ID of the room to be updated in your map.
                // Replace this line with your logic for retrieving featureID.
                string featureID = "UNIT103";

                // Iterate through the properties that have changed
                foreach (var operation in message["data"]["patch"])
                {
                    if (operation["op"].ToString() == "replace" && operation["path"].ToString() == "/Temperature")
                    {
                        // Update the maps feature stateset
                        var postcontent = new JObject(
                            new JProperty(
                                "States",
                                new JArray(
                                    new JObject(
                                        new JProperty("keyName", "temperature"),
                                        new JProperty("value", operation["value"].ToString()),
                                        new JProperty("eventTimestamp", DateTime.UtcNow.ToString("s"))))));

                        var response = await httpClient.PutAsync(
                            $"https://us.atlas.microsoft.com/featurestatesets/{statesetID}/featureStates/{featureID}?api-version=2.0&subscription-key={subscriptionKey}",
                            new StringContent(postcontent.ToString()));


                        log.LogInformation(await response.Content.ReadAsStringAsync());
                    }
                }
            }
        }
    }
}

Далее в приложении-функции потребуется задать две переменные среды. Один из них — это первичный ключ подписки Azure Maps, а один — идентификатор набора состояний Azure Maps.

az functionapp config appsettings set --name <your-function-app-name> --resource-group <your-resource-group> --settings "subscription-key=<your-Azure-Maps-primary-subscription-key>"
az functionapp config appsettings set --name <your-function-app-name> --resource-group <your-resource-group> --settings "statesetID=<your-Azure-Maps-stateset-ID>"

Просмотр динамических обновлений на карте

Чтобы увидеть температуру в режиме реального времени, выполните следующие действия.

  1. Начните отправлять имитированные данные IoT, запустив проект DeviceSimulator из раздела Руководство по созданию комплексного решения, посвященного Azure Digital Twins. Инструкции для этого процесса см. в разделе Настройка и запуск моделирования.
  2. Используйте модуль схем помещений Azure Maps для визуализации схем помещений, созданных в Azure Maps Creator.
    1. Скопируйте пример HTML-файла схемы помещений из примера: Custom Styling: Использование конфигурации карты в WebSDK (предварительная версия).
    2. Замените ключ подписки, mapConfiguration, statesetID и регион в локальном HTML-файле значениями.
    3. Откройте файл в браузере.

Оба образца отправляют температуру в совместимом диапазоне, поэтому на карте должен отображаться цвет обновления комнаты 121 примерно каждые 30 секунд.

Снимок экрана: схема офиса, на которой отображается комната 121, окрашенная в оранжевый цвет

Хранение сведений о карте в Azure Digital Twins

Теперь, когда у вас есть жестко заданное решение для обновления сведений о картах, вы можете использовать граф Azure Digital Twins для хранения всей информации, необходимой для обновления схемы помещения. Эта информация включает идентификатор набора состояний, идентификатор подписки и идентификатор функции для каждой карты и расположения соответственно.

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

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

Следующие шаги

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