Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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 funktionsstatus-ID i Azure Digital Twins-diagrammet.
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 handledningen.
 
- 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åndsuppsättningar är samlingar med dynamiska tillstånd som tilldelats till datamängdselement så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, funktionsuppsättnings-ID , och mapConfiguration.
 
Topologi
Bilden nedan visar var integreringselementen för inomhuskartor i den här handledningen passar in i ett större helhetslösning av Azure Digital Twins-scenario.
Rikta uppdateringsmeddelanden för tvillingar 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 komplett lösning från början till slut som beskrivs ovan går igenom ett scenario där en termometer används för att uppdatera ett temperaturattribut som är kopplat till en rums tvilling. Den här handledningen utökar den lösningen genom att prenumerera på en Azure-funktion för att uppdatera meddelanden från digitala 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. - Anmärkning - 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 logini 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 handledningen om Azure Digital Twins skapade du en funktionsapp för att lagra Azure-funktioner inom Azure Digital Twins. Skapa nu en ny Azure-funktion utlöst av Event Grid 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ör att se liveuppdaterad temperatur, följ stegen nedan:
- 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 proverna skickar temperatur inom ett kompatibelt intervall, så du bör se att färgen på rum 121 uppdateras 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 skulle inkludera stateset-ID, map prenumerations-ID och funktions-ID för respektive karta och 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 stateset-ID och attributet prenumerations-ID, samt 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:
