Integrera Azure Digital Twins-data i en inomhuskarta i Azure Maps
Den här artikeln visar hur du använder Azure Digital Twins-data för att uppdatera information som visas på en inomhuskarta från Azure Maps. Eftersom Azure Digital Twins lagrar ett diagram över dina IoT-enhetsrelationer och dirigerar enhetsdata till olika slutpunkter är det en bra tjänst för att uppdatera informationsöverlägg på kartor.
Den här guiden beskriver följande information:
- Konfigurera din Azure Digital Twins-instans för att skicka tvillinguppdateringshändelser till en funktion i Azure Functions.
- Skapa en funktion för att uppdatera en funktionsuppsättning för inomhuskartor i Azure Maps.
- Lagra ditt kart-ID och funktionstillståndsuppsättnings-ID i Diagrammet Azure Digital Twins.
Kom igång
Det här avsnittet anger ytterligare kontext för informationen i den här artikeln.
Förutsättningar
Innan du fortsätter med den här artikeln börjar du med att konfigurera dina enskilda Azure Digital Twins- och Azure Maps-resurser.
- För Azure Digital Twins: Följ anvisningarna i Ansluta en lösning från slutpunkt till slutpunkt för att konfigurera en Azure Digital Twins-instans med ett exempeltvillingdiagram och simulerat dataflöde.
- I den här artikeln utökar du lösningen med en annan slutpunkt och väg. Du kommer också att lägga till en annan funktion i funktionsappen från den självstudien.
- För Azure Maps: Följ anvisningarna i Använd skapare för att skapa inomhuskartor och skapa en inomhuskarta för Azure Maps med en funktionsstatusuppsättning.
- Funktionstillstånd är samlingar med dynamiska egenskaper (tillstånd) som tilldelats till datamängdsfunktioner som rum eller utrustning. I Azure Maps-anvisningarna ovan lagrar funktionsuppsättningen rumsstatus som du kommer att visa på en karta.
- Du behöver din Azure Maps-prenumerationsnyckel, funktionstillståndsuppsättnings-ID och mapConfiguration.
Topologi
Bilden nedan visar var integreringselementen för inomhuskartor i den här självstudien får plats i ett större Azure Digital Twins-scenario från slutpunkt till slutpunkt.
Dirigera tvillinguppdateringsmeddelanden från Azure Digital Twins
Azure Digital Twins-instanser kan generera dubbla uppdateringshändelser när en tvillings tillstånd uppdateras. Azure Digital Twins Connect en lösning från slutpunkt till slutpunkt som länkats ovan går igenom ett scenario där en termometer används för att uppdatera ett temperaturattribut som är kopplat till ett rums tvilling. Den här självstudien utökar den lösningen genom att prenumerera på en Azure-funktion för att uppdatera meddelanden från tvillingar och använda den funktionen för att uppdatera dina kartor.
Det här mönstret läser direkt från rumstvillingen i stället för IoT-enheten, vilket ger dig flexibiliteten att ändra den underliggande datakällan för temperatur utan att behöva uppdatera mappningslogik. Du kan till exempel lägga till flera termometrar eller ställa in det här rummet för att dela en termometer med ett annat rum, allt utan att behöva uppdatera kartlogik.
Först skapar du en väg i Azure Digital Twins för att vidarebefordra alla tvillinguppdateringshändelser till ett Event Grid-ämne.
Skapa ett Event Grid-ämne som tar emot händelser från din Azure Digital Twins-instans med hjälp av CLI-kommandot nedan:
az eventgrid topic create --resource-group <your-resource-group-name> --name <your-topic-name> --location <region>
Skapa en slutpunkt för att länka ditt Event Grid-ämne till Azure Digital Twins med hjälp av CLI-kommandot nedan:
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>
Skapa en väg i Azure Digital Twins för att skicka tvillinguppdateringshändelser till slutpunkten med hjälp av CLI-kommandot nedan. För platshållaren för Azure Digital Twins-instansnamn i det här kommandot kan du använda det egna namnet eller värdnamnet för att få bättre prestanda.
Kommentar
Det finns för närvarande ett känt problem i Cloud Shell som påverkar dessa kommandogrupper:
az dt route
,az dt model
,az dt twin
.Du kan lösa problemet genom att köra
az login
i Cloud Shell innan du kör kommandot eller använda det lokala kommandoradsgränssnittet i stället för Cloud Shell. Mer information om detta finns i Kända problem med 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'"
Skapa en Azure-funktion för att ta emot händelser och uppdatera kartor
I det här avsnittet skapar du en funktion som lyssnar efter händelser som skickas till Event Grid-ämnet. Funktionen läser dessa uppdateringsmeddelanden och skickar motsvarande uppdateringar till en Azure Maps-funktionsuppsättning för att uppdatera temperaturen i ett rum.
I självstudien om Azure Digital Twins skapade du en funktionsapp för att lagra Azure Functions Azure Digital Twins. Skapa nu en ny Event Grid-utlöst Azure-funktion i funktionsappen.
Ersätt funktionskoden med följande kod. Den filtrerar bara bort uppdateringar av rymdtvillingar, läser den uppdaterade temperaturen och skickar informationen till 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());
}
}
}
}
}
}
Du måste ange två miljövariabler i funktionsappen. En är din primära Azure Maps-prenumerationsnyckel och en är ditt Azure Maps-tillståndsuppsättnings-ID.
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>"
Visa liveuppdateringar på kartan
Följ stegen nedan om du vill se temperatur för liveuppdatering:
- Börja skicka simulerade IoT-data genom att köra DeviceSimulator-projektet från Azure Digital Twins Connect en lösning från slutpunkt till slutpunkt. Anvisningarna för den här processen finns i avsnittet Konfigurera och kör simuleringen .
- Använd modulen Inomhus i Azure Maps för att återge dina inomhuskartor som skapats i Azure Maps Creator.
- Kopiera HTML-filen för inomhuskartan från Exempel: Anpassad formatering: Använda kartkonfiguration i WebSDK (förhandsversion).
- Ersätt prenumerationsnyckeln, mapConfiguration, statesetID och regionen i den lokala HTML-filen med dina värden.
- Öppna filen i webbläsaren.
Båda exemplen skickar temperatur i ett kompatibelt intervall, så du bör se färgen på rum 121-uppdateringen på kartan ungefär var 30:e sekund.
Lagra kartinformation i Azure Digital Twins
Nu när du har en hårdkodad lösning för att uppdatera kartinformationen kan du använda Diagrammet Azure Digital Twins för att lagra all information som behövs för att uppdatera din inomhuskarta. Den här informationen omfattar tillståndsuppsättnings-ID, mappningsprenumerations-ID och funktions-ID för varje karta respektive plats.
En lösning för det här specifika exemplet skulle innebära att uppdatera varje utrymme på den översta nivån för att ha ett tillståndsuppsättnings-ID och mappa prenumerations-ID-attribut och uppdatera varje rum för att ha ett funktions-ID. Du skulle behöva ange dessa värden en gång när du initierar tvillingdiagrammet och sedan fråga dessa värden för varje tvillinguppdateringshändelse.
Beroende på konfigurationen av topologin är det möjligt att lagra dessa tre attribut på olika nivåer som korrelerar med kartans kornighet.
Nästa steg
Mer information om hur du hanterar, uppgraderar och hämtar information från tvillingdiagrammet finns i följande referenser: