Share via


Integrare i dati di Gemelli digitali di Azure in una mappa interna Mappe di Azure

Questo articolo illustra come usare i dati di Gemelli digitali di Azure per aggiornare le informazioni visualizzate in una mappa interna da Mappe di Azure. Poiché Gemelli digitali di Azure archivia un grafico delle relazioni tra i dispositivi IoT e instrada i dati dei dispositivi a endpoint diversi, è un ottimo servizio per aggiornare le sovrimpressioni informative sulle mappe.

Questa guida illustra le informazioni seguenti:

  1. Configurazione dell'istanza di Gemelli digitali di Azure per inviare eventi di aggiornamento dei gemelli a una funzione in Funzioni di Azure.
  2. Creazione di una funzione per aggiornare un Mappe di Azure set di stati delle caratteristiche delle mappe di interni.
  3. Archiviazione dell'ID mappe e dell'ID del set di stati delle funzionalità nel grafico di Gemelli digitali di Azure.

Attività iniziali

In questa sezione viene impostato un contesto aggiuntivo per le informazioni contenute in questo articolo.

Prerequisiti

Prima di procedere con questo articolo, iniziare configurando le singole risorse di Gemelli digitali di Azure e Mappe di Azure.

  • Per Gemelli digitali di Azure: seguire le istruzioni riportate in Connessione una soluzione end-to-end per configurare un'istanza di Gemelli digitali di Azure con un grafo gemello di esempio e un flusso di dati simulato.
    • In questo articolo si estenderà la soluzione con un altro endpoint e un altro percorso. Si aggiungerà anche un'altra funzione all'app per le funzioni da questa esercitazione.
  • Per Mappe di Azure: seguire le istruzioni in Usare Creator per creare mappe di interni e Creare un set di stati di funzionalità per creare un Mappe di Azure mappa interna con un set di stati delle caratteristiche.
    • I set di stati di funzionalità sono raccolte di proprietà dinamiche (stati) assegnate alle funzionalità del set di dati, ad esempio stanze o apparecchiature. Nelle istruzioni Mappe di Azure precedenti, il set di stati della funzionalità archivia lo stato della stanza che verrà visualizzato su una mappa.
    • Sarà necessaria la chiave di sottoscrizione Mappe di Azure, l'ID del set di stati delle funzionalità e mapConfiguration.

Topologia

L'immagine seguente illustra dove gli elementi di integrazione delle mappe di interni di questa esercitazione rientrano in uno scenario di Gemelli digitali di Azure più ampio e end-to-end.

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

Indirizzare le notifiche di aggiornamento dei dispositivi gemelli da Gemelli digitali di Azure

Le istanze di Gemelli digitali di Azure possono generare eventi di aggiornamento gemelli ogni volta che viene aggiornato lo stato di un gemello. Gemelli digitali di Azure Connessione una soluzione end-to-end collegata sopra illustra uno scenario in cui viene usato un termometro per aggiornare un attributo di temperatura collegato al gemello di una stanza. Questa esercitazione estende la soluzione sottoscrivendo una funzione di Azure per aggiornare le notifiche dai dispositivi gemelli e usando tale funzione per aggiornare le mappe.

Questo modello legge direttamente dal gemello della stanza, anziché dal dispositivo IoT, che offre la flessibilità necessaria per modificare l'origine dati sottostante per la temperatura senza dover aggiornare la logica di mapping. Ad esempio, è possibile aggiungere più termometri o impostare questa stanza per condividere un termometro con un'altra stanza, tutto senza dover aggiornare la logica della mappa.

Prima di tutto, si creerà una route in Gemelli digitali di Azure per inoltrare tutti gli eventi di aggiornamento dei gemelli a un argomento di Griglia di eventi.

  1. Creare un argomento di Griglia di eventi che riceverà eventi dall'istanza di Gemelli digitali di Azure usando il comando dell'interfaccia della riga di comando seguente:

    az eventgrid topic create --resource-group <your-resource-group-name> --name <your-topic-name> --location <region>
    
  2. Creare un endpoint per collegare l'argomento di Griglia di eventi a Gemelli digitali di Azure usando il comando dell'interfaccia della riga di comando seguente:

    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. Creare una route in Gemelli digitali di Azure per inviare eventi di aggiornamento del gemello all'endpoint usando il comando dell'interfaccia della riga di comando seguente. Per il segnaposto del nome dell'istanza di Gemelli digitali di Azure in questo comando, è possibile usare il nome descrittivo o il nome host per migliorare le prestazioni.

    Nota

    C'è attualmente un problema noto in Cloud Shell che interessa questi gruppi di comandi: az dt route, az dt model, az dt twin.

    Per risolverlo, eseguire az login in Cloud Shell prima di eseguire il comando oppure usare l'interfaccia della riga di comando locale anziché Cloud Shell. Per altri dettagli su questo argomento, vedere Problemi noti di Gemelli digitali di Azure.

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

Creare una funzione di Azure per ricevere eventi e aggiornare le mappe

In questa sezione si creerà una funzione in ascolto degli eventi inviati all'argomento griglia di eventi. La funzione leggerà tali notifiche di aggiornamento e invierà gli aggiornamenti corrispondenti a un set di stati di funzionalità Mappe di Azure, per aggiornare la temperatura di una stanza.

Nel prerequisito dell'esercitazione su Gemelli digitali di Azure è stata creata un'app per le funzioni per archiviare le funzioni di Azure di Gemelli digitali di Azure. Creare ora una nuova funzione di Azure attivata da Griglia di eventi all'interno dell'app per le funzioni.

Sostituire il codice della funzione con il codice seguente. Filtra solo gli aggiornamenti ai gemelli spaziali, legge la temperatura aggiornata e invia tali informazioni a Mappe di Azure.

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

È necessario impostare due variabili di ambiente nell'app per le funzioni. Una è la chiave di sottoscrizione primaria Mappe di Azure e una è l'ID del set di stati Mappe di Azure.

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

Visualizzare gli aggiornamenti live nella mappa

Per visualizzare la temperatura ad aggiornamento in tempo reale, seguire questa procedura:

  1. Iniziare a inviare dati IoT simulati eseguendo il progetto DeviceSimulator da Gemelli digitali di Azure Connessione una soluzione end-to-end. Le istruzioni per questo processo sono disponibili nella sezione Configurare ed eseguire la simulazione .
  2. Usare il modulo Mappe di Azure Indoor per eseguire il rendering delle mappe interne create in Mappe di Azure Creator.
    1. Copiare il file HTML della mappa interna di esempio: Applicazione di stili personalizzati: Utilizzare la configurazione della mappa in WebSDK (anteprima).
    2. Sostituire la chiave di sottoscrizione, mapConfiguration, statesetID e l'area nel file HTML locale con i valori specificati.
    3. Aprire il file nel browser.

Entrambi i campioni inviano temperatura in un intervallo compatibile, quindi dovrebbe essere visualizzato il colore dell'aggiornamento della stanza 121 sulla mappa circa ogni 30 secondi.

Screenshot of an office map showing room 121 colored orange.

Archiviare le informazioni sulla mappa in Gemelli digitali di Azure

Ora che è disponibile una soluzione hardcoded per aggiornare le informazioni sulle mappe, è possibile usare il grafico di Gemelli digitali di Azure per archiviare tutte le informazioni necessarie per aggiornare la mappa interna. Queste informazioni includono rispettivamente l'ID del set di stati, l'ID sottoscrizione e l'ID funzionalità di ogni mappa e posizione.

Una soluzione per questo esempio specifico comporta l'aggiornamento di ogni spazio di primo livello per avere un ID set di stati e mappa l'attributo ID sottoscrizione e l'aggiornamento di ogni sala per avere un ID funzionalità. È necessario impostare questi valori una volta durante l'inizializzazione del grafo gemello, quindi eseguire una query su tali valori per ogni evento di aggiornamento del gemello.

A seconda della configurazione della topologia, sarà possibile archiviare questi tre attributi a livelli diversi correlati alla granularità della mappa.

Passaggi successivi

Per altre informazioni sulla gestione, l'aggiornamento e il recupero di informazioni dal grafico dei gemelli, vedere i riferimenti seguenti: