Integrowanie danych usługi Azure Digital Twins z mapą wewnętrzną usługi Azure Mapy

W tym artykule pokazano, jak używać danych usługi Azure Digital Twins do aktualizowania informacji wyświetlanych na mapie wewnętrznej z usługi Azure Mapy. Ponieważ usługa Azure Digital Twins przechowuje graf relacji urządzenia IoT i kieruje dane urządzeń do różnych punktów końcowych, to świetna usługa do aktualizowania nakładek informacyjnych na mapach.

W tym przewodniku omówiono następujące informacje:

  1. Konfigurowanie wystąpienia usługi Azure Digital Twins w celu wysyłania zdarzeń aktualizacji reprezentacji bliźniaczej do funkcji w usłudze Azure Functions.
  2. Tworzenie funkcji służącej do aktualizowania zestawu stanów funkcji mapy wewnętrznej platformy Azure Mapy.
  3. Przechowywanie identyfikatora mapy i identyfikatora zestawu stanów funkcji na grafie usługi Azure Digital Twins.

Rozpocznij

Ta sekcja ustawia dodatkowy kontekst informacji w tym artykule.

Wymagania wstępne

Przed kontynuowaniem pracy z tym artykułem rozpocznij od skonfigurowania poszczególnych zasobów usługi Azure Digital Twins i usługi Azure Mapy.

  • W przypadku usługi Azure Digital Twins: postępuj zgodnie z instrukcjami w Połączenie kompleksowego rozwiązania, aby skonfigurować wystąpienie usługi Azure Digital Twins z przykładowym grafem bliźniaczej reprezentacji i symulowanym przepływem danych.
    • W tym artykule rozszerzysz to rozwiązanie przy użyciu innego punktu końcowego i trasy. W tym samouczku dodasz również inną funkcję do aplikacji funkcji.
  • W przypadku usługi Azure Mapy: postępuj zgodnie z instrukcjami w temacie Tworzenie map wewnętrznych i Tworzenie zestawu stanów funkcji, aby utworzyć mapę wewnętrzną platformy Azure Mapy z zestawem stanów funkcji.
    • Zestawy stanów funkcji to kolekcje właściwości dynamicznych (stanów) przypisanych do funkcji zestawu danych, takich jak pokoje lub wyposażenie. W powyższych instrukcjach usługi Azure Mapy zestaw stanów przechowuje stan pokoju, który będzie wyświetlany na mapie.
    • Będziesz potrzebować klucza subskrypcji usługi Azure Mapy, identyfikatora zestawu stanów funkcji i elementu mapConfiguration.

Topologia

Na poniższej ilustracji pokazano, gdzie elementy integracji map wnętrz w tym samouczku pasują do większego, kompleksowego scenariusza usługi Azure Digital Twins.

Diagram of Azure services in an end-to-end scenario, highlighting the Indoor Maps Integration piece.

Kierowanie powiadomień o aktualizacji bliźniaczej reprezentacji z usługi Azure Digital Twins

Wystąpienia usługi Azure Digital Twins mogą emitować zdarzenia aktualizacji bliźniaczej reprezentacji za każdym razem, gdy stan reprezentacji bliźniaczej zostanie zaktualizowany. Usługa Azure Digital Twins Połączenie kompleksowe rozwiązanie połączone powyżej przechodzi przez scenariusz, w którym termometr jest używany do aktualizowania atrybutu temperatury dołączonego do bliźniaczej reprezentacji pokoju. Ten samouczek rozszerza to rozwiązanie, subskrybując funkcję platformy Azure w celu aktualizowania powiadomień z bliźniaczych reprezentacji bliźniaczych oraz używając tej funkcji do aktualizowania map.

Ten wzorzec odczytuje bezpośrednio z bliźniaczej reprezentacji pokoju, a nie z urządzenia IoT, co zapewnia elastyczność zmiany bazowego źródła danych dla temperatury bez konieczności aktualizowania logiki mapowania. Na przykład można dodać wiele termometrów lub ustawić ten pokój, aby udostępnić termometr innemu pomieszczeniu, wszystko bez konieczności aktualizowania logiki mapy.

Najpierw utworzysz trasę w usłudze Azure Digital Twins, aby przekazać wszystkie zdarzenia aktualizacji bliźniaczej reprezentacji do tematu usługi Event Grid.

  1. Utwórz temat usługi Event Grid, który będzie otrzymywać zdarzenia z wystąpienia usługi Azure Digital Twins przy użyciu poniższego polecenia interfejsu wiersza polecenia:

    az eventgrid topic create --resource-group <your-resource-group-name> --name <your-topic-name> --location <region>
    
  2. Utwórz punkt końcowy, aby połączyć temat usługi Event Grid z usługą Azure Digital Twins przy użyciu poniższego polecenia interfejsu wiersza polecenia:

    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. Utwórz trasę w usłudze Azure Digital Twins, aby wysyłać zdarzenia aktualizacji bliźniaczej reprezentacji do punktu końcowego przy użyciu poniższego polecenia interfejsu wiersza polecenia. W przypadku symbolu zastępczego nazwy wystąpienia usługi Azure Digital Twins w tym poleceniu można użyć przyjaznej nazwy lub nazwy hosta w celu zwiększenia wydajności.

    Uwaga

    Obecnie w usłudze Cloud Shell występuje znany problem dotyczący tych grup poleceń: az dt route, , az dt twinaz dt model.

    Aby rozwiązać ten problem, uruchom polecenie az login w usłudze Cloud Shell przed uruchomieniem danego polecenia lub użyj lokalnego interfejsu wiersza polecenia zamiast usługi Cloud Shell. Aby uzyskać więcej informacji na ten temat, zobacz Znane problemy usługi 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'"
    

Tworzenie funkcji platformy Azure w celu odbierania zdarzeń i aktualizowania map

W tej sekcji utworzysz funkcję, która nasłuchuje zdarzeń wysyłanych do tematu usługi Event Grid. Funkcja odczytuje te powiadomienia o aktualizacji i wysyła odpowiednie aktualizacje do zestawu stanów funkcji usługi Azure Mapy w celu zaktualizowania temperatury jednego pomieszczenia.

W samouczku dotyczącym usługi Azure Digital Twins utworzono aplikację funkcji do przechowywania funkcji usługi Azure Digital Twins. Teraz utwórz nową funkcję platformy Azure wyzwalaną przez usługę Event Grid w aplikacji funkcji.

Zastąp kod funkcji następującym kodem. Odfiltruje ona tylko aktualizacje bliźniaczych reprezentacji kosmosu, odczytuje zaktualizowaną temperaturę i wysyła te informacje do usługi Azure Mapy.

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

Musisz ustawić dwie zmienne środowiskowe w aplikacji funkcji. Jednym z nich jest podstawowy klucz subskrypcji platformy Azure Mapy, a drugi to Identyfikator zestawu stanów platformy Azure Mapy.

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

Wyświetlanie aktualizacji na żywo na mapie

Aby wyświetlić temperaturę aktualizacji na żywo, wykonaj poniższe kroki:

  1. Rozpocznij wysyłanie symulowanych danych IoT, uruchamiając projekt DeviceSimulator z usługi Azure Digital Twins Połączenie kompleksowe rozwiązanie. Instrukcje dotyczące tego procesu znajdują się w sekcji Konfigurowanie i uruchamianie symulacji .
  2. Użyj modułu Azure Mapy Indoor, aby renderować mapy wewnętrzne utworzone w usłudze Azure Mapy Creator.
    1. Skopiuj przykładowy plik HTML mapy wewnętrznej z przykładu: Niestandardowy styl: Korzystanie z konfiguracji mapy w zestawie WebSDK (wersja zapoznawcza).
    2. Zastąp klucz subskrypcji mapConfiguration, statesetID i region w lokalnym pliku HTML wartościami.
    3. Otwórz ten plik w przeglądarce.

Obie próbki wysyłają temperaturę w zgodnym zakresie, więc kolor aktualizacji pomieszczenia 121 powinien być wyświetlany na mapie mniej więcej co 30 sekund.

Screenshot of an office map showing room 121 colored orange.

Przechowywanie informacji o mapie w usłudze Azure Digital Twins

Teraz, gdy masz zakodowane na stałe rozwiązanie do aktualizowania informacji o mapach, możesz użyć grafu usługi Azure Digital Twins do przechowywania wszystkich informacji niezbędnych do zaktualizowania mapy wewnętrznej. Te informacje obejmują odpowiednio identyfikator zestawu stanów, identyfikator subskrypcji mapy i identyfikator funkcji każdej mapy i lokalizacji.

Rozwiązaniem dla tego konkretnego przykładu byłoby zaktualizowanie każdego miejsca najwyższego poziomu w celu uzyskania identyfikatora zestawu stanów i mapowania atrybutu identyfikatora subskrypcji oraz zaktualizowanie każdego pokoju w celu uzyskania identyfikatora funkcji. Te wartości należy ustawić raz podczas inicjowania grafu bliźniaczej reprezentacji, a następnie wykonać zapytanie o te wartości dla każdego zdarzenia aktualizacji bliźniaczej reprezentacji.

W zależności od konfiguracji topologii przechowywanie tych trzech atrybutów na różnych poziomach skorelowanych z szczegółowością mapy będzie możliwe.

Następne kroki

Aby dowiedzieć się więcej na temat zarządzania, uaktualniania i pobierania informacji z grafu bliźniaczych reprezentacji, zobacz następujące odwołania: