Udostępnij przez


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

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 Maps. Ponieważ Azure Digital Twins przechowuje graf relacji urządzeń IoT i przesyła dane z urządzeń do różnych punktów końcowych, jest to idealne rozwiązanie 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 obiektów bliźniaczych do funkcji Azure Functions.
  2. Tworzenie funkcji w celu zaktualizowania zestawu stanów funkcji map wewnętrznych usługi Azure Maps.
  3. Przechowywanie identyfikatora mapy i identyfikatora zestawu stanów obiektu w 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 Maps.

  • W przypadku usługi Azure Digital Twins: postępuj zgodnie z instrukcjami w artykule Połącz kompleksowe rozwiązanie, aby skonfigurować wystąpienie usługi Azure Digital Twins z przykładowym grafem 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ż kolejną funkcję do aplikacji funkcji.
  • W przypadku usługi Azure Maps: postępuj zgodnie z instrukcjami w Use Creator to create indoor maps i stwórz mapę wewnętrzną usługi Azure Maps 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 Azure Maps, funkcja "stateset" przechowuje status pokoju, który będzie wyświetlany na mapie.
    • Będziesz potrzebować klucza subskrypcji usługi Azure Maps, identyfikatora zestawu stanów funkcji oraz konfiguracji mapy.

Topologia

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

Diagram usług platformy Azure w kompleksowym scenariuszu, z wyróżnieniem elementu integracji z mapami wewnętrznymi.

Routowanie powiadomień o aktualizacji z reprezentacji bliźniaczej w usłudze Azure Digital Twins

Wystąpienia usługi Azure Digital Twins mogą emitować zdarzenia aktualizacji bliźniaków za każdym razem, gdy ich stan zostanie zaktualizowany. Usługa Azure Digital Twins Połącz kompleksowe rozwiązanie end-to-end wspomniane powyżej przeprowadzi Cię przez scenariusz, w którym termometr jest używany do aktualizacji atrybutu temperatury przypisanego do cyfrowego bliźniaka pomieszczenia. Ten samouczek rozszerza to rozwiązanie, poprzez subskrypcję funkcji Azure do aktualizacji powiadomień z bliźniaków oraz użycie tej funkcji do aktualizacji map.

Ten schemat odczytuje bezpośrednio z bliźniaka pokoju, zamiast 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 przesłać wszystkie zdarzenia aktualizacji bliźniaczej 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, używając poniższego polecenia CLI.

    az eventgrid topic create --resource-group <your-resource-group-name> --name <your-topic-name> --location <region>
    
  2. Utwórz punkt dostępowy, aby połączyć obszar usługi Event Grid z usługą Azure Digital Twins za pomocą polecenia poniżej:

    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 bliźniaczych aktualizacji do punktu końcowego przy użyciu poniższego polecenia CLI. W tym poleceniu, dla symbolu zastępczego nazwy wystąpienia usługi Azure Digital Twins, można użyć przyjaznej nazwy lub nazwy hosta w celu poprawy wydajności.

    Uwaga

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

    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 Event Grid. Funkcja odczytuje te powiadomienia o aktualizacji i wysyła odpowiednie aktualizacje do zestawu stanów funkcji usługi Azure Maps, aby zaktualizować temperaturę jednego pomieszczenia.

W samouczku dotyczącym usługi Azure Digital Twins utworzyłeś aplikację funkcjonalną, aby przechować funkcje Azure dla 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. Będzie filtrować tylko aktualizacje dotyczące bliźniaków kosmicznych, odczytywać zaktualizowaną temperaturę i wysyłać te informacje do 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());
                    }
                }
            }
        }
    }
}

Musisz ustawić dwie zmienne środowiskowe w aplikacji funkcji. Jednym z nich jest podstawowy klucz subskrypcji usługi Azure Maps, a drugi to identyfikator zestawu stanów usługi 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>"

Wyświetlanie aktualizacji na żywo na mapie

Aby wyświetlić aktualizującą się na żywo temperaturę, wykonaj poniższe kroki:

  1. Rozpocznij wysyłanie symulowanych danych IoT, uruchamiając projekt DeviceSimulator z sekcji Połącz kompleksowe rozwiązanie w Azure Digital Twins. Instrukcje dotyczące tego procesu znajdują się w sekcji Konfigurowanie i uruchamianie symulacji .
  2. Użyj modułu Azure Maps Indoor do renderowania map wnętrz utworzonych w usłudze Azure Maps Creator.
    1. Skopiuj plik HTML przykładowej mapy wewnętrznej z Przykład: Niestandardowy styl: Korzystanie z konfiguracji mapy w WebSDK (wersja zapoznawcza).
    2. Zastąp klucz subskrypcji, mapConfiguration, statesetID i region w lokalnym pliku HTML swoimi wartościami.
    3. Otwórz ten plik w przeglądarce.

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

Zrzut ekranu przedstawiający mapę biura z pomieszczeniem 121 oznaczonym kolorem pomarańczowym.

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, aby miało identyfikator zestawu stanów oraz atrybut identyfikatora subskrypcji map, oraz zaktualizowanie każdego pokoju, aby miało identyfikator funkcji. Te wartości należy ustawić raz podczas inicjalizacji grafu bliźniaczego, a następnie zapytać o te wartości przy każdym zdarzeniu aktualizacji bliźniaka.

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 twins, zobacz następujące źródła: