Integrare i dati di Gemelli digitali di Azure in una piante dell'interno di Mappe di Azure
Questo articolo illustra come usare i dati di Gemelli digitali di Azure per aggiornare le informazioni visualizzate in una pianta dell'interno di 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.
In questa guida vengono illustrate le informazioni seguenti:
- Configurazione dell'istanza di Gemelli digitali di Azure per inviare eventi di aggiornamento dei gemelli a una funzione in Funzioni di Azure.
- Creazione di una funzione per aggiornare un set di stati delle funzionalità delle piante dell'interno di Mappe di Azure.
- Archiviazione dell'ID mappe e dell'ID del set di stati delle funzionalità nel grafico di Gemelli digitali di Azure.
Operazioni preliminari
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 Connettere una soluzione end-to-end per configurare un'istanza di Gemelli digitali di Azure con un grafico 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 piante dell'interno e creare una piante dell'interno di Mappe di Azure con un set di stati di funzionalità.
- I set di stati della funzionalità sono raccolte di proprietà dinamiche (stati) assegnate alle funzionalità del set di dati, ad esempio locali o attrezzature. Nelle istruzioni precedenti di Mappe di Azure, il set di stati della funzionalità archivia lo stato della stanza che verrà visualizzato su una mappa.
- Sarà necessaria la chiave di sottoscrizione di Mappe di Azure, l'ID del set di stati delle funzionalità e mapConfiguration.
Topologia
L'immagine seguente illustra dove gli elementi di integrazione delle piante dell'interno di questa esercitazione rientrano in uno scenario di Gemelli digitali di Azure più ampio e end-to-end.
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 Connect una soluzione end-to-end collegata sopra illustra uno scenario in cui un termometro viene usato 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.
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>
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>
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
Esiste 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à le notifiche di aggiornamento e invierà gli aggiornamenti corrispondenti a un set di stati delle funzionalità di 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 per i 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 di Mappe di Azure e una è l'ID del set di stati di 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:
- Iniziare a inviare dati IoT simulati eseguendo il progetto DeviceSimulator da Gemelli digitali di Azure Connect a una soluzione end-to-end. Le istruzioni per questo processo sono disponibili nella sezione Configurare ed eseguire la simulazione.
- Usare il modulo Interni di Mappe di Azure per eseguire il rendering delle piante di interni create in Creator di Mappe di Azure.
- Copiare il file HTML della mappa interna di esempio da Esempio: Applicazione di stili personalizzati: Utilizzare la configurazione della mappa in WebSDK (anteprima).
- Sostituire la chiave di sottoscrizione, mapConfiguration, statesetID e l'area nel file HTML locale con i valori specificati.
- 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.
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 grafico 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: