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ż 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:
- Konfigurowanie wystąpienia usługi Azure Digital Twins w celu wysyłania zdarzeń aktualizacji reprezentacji bliźniaczej do funkcji w usłudze Azure Functions.
- Tworzenie funkcji w celu zaktualizowania zestawu stanów funkcji map wewnętrznych usługi Azure Maps.
- 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 Maps.
- W przypadku usługi Azure Digital Twins: postępuj zgodnie z instrukcjami w artykule Łączenie kompleksowego rozwiązania , aby skonfigurować wystąpienie usługi Azure Digital Twins za pomocą przykładowego grafu bliźniaczej reprezentacji bliźniaczej i symulowanego przepływu 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 Maps: postępuj zgodnie z instrukcjami w temacie Use Creator to create indoor maps and create an Azure Maps indoor map with a feature stateset (Używanie twórcy do tworzenia map wewnętrznych i tworzenia mapy wewnętrznej 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 usługi Azure Maps zestaw stanów funkcji przechowuje stan pokoju, który będzie wyświetlany na mapie.
- Będziesz potrzebować klucza subskrypcji usługi Azure Maps, 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.
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 Connect kompleksowe rozwiązanie połączone powyżej przeprowadzi cię przez scenariusz, w którym termometr jest używany do aktualizowania atrybutu temperatury dołączonego do bliźniaczej reprezentacji pomieszczenia. 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.
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>
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>
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 twin
az 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 Maps, aby zaktualizować temperaturę 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. Filtruje tylko aktualizacje bliźniaczych reprezentacji kosmosu, odczytuje zaktualizowaną temperaturę i wysyła te informacje do usługi 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ć temperaturę aktualizacji na żywo, wykonaj poniższe kroki:
- Rozpocznij wysyłanie symulowanych danych IoT, uruchamiając projekt DeviceSimulator z rozwiązania Azure Digital Twins Connect. Instrukcje dotyczące tego procesu znajdują się w sekcji Konfigurowanie i uruchamianie symulacji .
- Użyj modułu Kryty w usłudze Azure Maps, aby renderować mapy wnętrz utworzone w usłudze Azure Maps Creator.
- Skopiuj przykładowy plik HTML mapy wewnętrznej z przykładu: Niestandardowy styl: Korzystanie z konfiguracji mapy w zestawie WebSDK (wersja zapoznawcza).
- Zastąp klucz subskrypcji mapConfiguration, statesetID i region w lokalnym pliku HTML wartościami.
- 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.
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: