Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo mostra como usar dados dos Gêmeos Digitais do Azure para atualizar as informações exibidas em um mapa interno do Azure Mapas. Como Azure Digital Twins armazena um grafo de relações entre dispositivos IoT e encaminha dados de dispositivos para diferentes pontos de extremidade, é um ótimo serviço para atualizar camadas informativas nos mapas.
Este guia aborda as seguintes informações:
- Configurando sua instância do Azure Digital Twins para enviar eventos de atualização de gêmeos para uma função no Azure Functions.
- Como criar uma função para atualizar um conjunto de estados de recursos do Indoor Maps do Azure Maps.
- Como armazenar a ID de mapas e a ID do conjunto de estados do recurso no grafo dos Gêmeos Digitais do Azure.
Comece agora
Esta seção define o contexto adicional para as informações neste artigo.
Pré-requisitos
Antes de prosseguir com este artigo, comece configurando os seus recursos do Azure Digital Twins e Azure Maps.
- Para os Gêmeos Digitais do Azure: siga as instruções em Conectar uma solução de ponta a ponta para configurar uma instância dos Gêmeos Digitais do Azure com um grafo gêmeo de exemplo e um fluxo de dados simulado.
- Neste artigo, você estenderá essa solução com outro ponto de extremidade e outra rota. Você também adicionará outra função desse tutorial ao seu aplicativo de funções.
- Para o Azure Mapas: siga as instruções em Usar o Criador para criar mapas internos e criar um mapa interno do Azure Mapas com um conjunto de estados de recursos.
- Os conjuntos de estados de características são coleções de propriedades dinâmicas (estados) atribuídas a características de um conjunto de dados, como salas ou equipamentos. Nas instruções do Azure Maps exibido acima, o stateset do recurso armazena o status das salas que você exibirá em um mapa.
- Você precisará da chave de subscrição do Azure Maps, do ID do conjunto de estados do recurso e da configuração do mapa.
Topologia
A imagem abaixo ilustra onde os elementos de integração de mapas internos deste tutorial se enquadram em um cenário maior, de ponta a ponta, no Azure Digital Twins.
Encaminhar notificações de atualização de gêmeos dos Gêmeos Digitais do Azure
As instâncias dos Gêmeos Digitais do Azure podem emitir eventos de atualização dos gêmeos sempre que o estado dos gêmeos for atualizado. Os Gêmeos Digitais do Azure Conectam uma solução de ponta a ponta vinculada acima percorre um cenário em que um termômetro é usado para atualizar um atributo de temperatura anexado ao gêmeo de uma sala. Este tutorial estende essa solução assinando uma função do Azure para atualizar as notificações de gêmeos e usando essa função para atualizar os mapas.
Esse padrão faz a leitura diretamente do twin digital da sala, em vez de um dispositivo IoT, o que lhe dá a flexibilidade para alterar a fonte de dados subjacente para temperatura sem a necessidade de atualizar sua lógica de mapeamento. Por exemplo, é possível adicionar vários termômetros ou definir essa sala para compartilhar um termômetro com outra sala, tudo isso sem a necessidade de atualizar a lógica do mapa.
Primeiro, será necessário criar uma rota no Azure Digital Twins para encaminhar todos os eventos de atualização do gêmeo para um tópico do Event Grid.
Crie um tópico de Grade de Eventos, que receberá eventos de sua instância dos Gêmeos Digitais do Azure, com o comando da CLI abaixo:
az eventgrid topic create --resource-group <your-resource-group-name> --name <your-topic-name> --location <region>Crie um endpoint para vincular o tópico do Event Grid aos Azure Digital Twins, usando o comando abaixo da CLI:
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>Crie uma rota nos Gêmeos Digitais do Azure para enviar eventos de atualização do gêmeo para o ponto de extremidade, com o comando da CLI abaixo. Para o espaço reservado para o nome da instância dos Gêmeos Digitais do Azure neste comando, você pode usar o nome amigável ou o nome do host para aumentar o desempenho.
Observação
Atualmente, há um problema conhecido no Cloud Shell afetando estes grupos de comandos:
az dt route,az dt modeleaz dt twin.Para resolver, execute
az loginno Cloud Shell antes de executar o comando ou use a CLI local em vez do Cloud Shell. Para obter mais detalhes sobre isso, consulte os problemas conhecidos dos Gêmeos Digitais do 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'"
Criar uma função do Azure para receber eventos e atualizar mapas
Nesta seção, você criará uma função que escuta os eventos enviados para o tópico Grade de Eventos. A função lerá essas notificações de atualização e enviará as atualizações correspondentes a um conjunto de estados do recurso do Azure Mapas para atualizar a temperatura de uma sala.
No tutorial de pré-requisitos do Azure Digital Twins, você criou um aplicativo de funções para armazenar funções do Azure Digital Twins. Agora, crie uma nova função do Azure disparada pela Grade de Eventos dentro do aplicativo de funções.
Substitua o código da função pelo código a seguir. Ele vai filtrar somente as atualizações dos gêmeos do espaço, ler a temperatura atualizada e enviar essas informações ao 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());
}
}
}
}
}
}
Será preciso definir duas variáveis de ambiente no aplicativo de funções. Uma é a chave de assinatura primária do Azure Mapas e outra é a ID do conjunto de estados do Azure Mapas.
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>"
Exibir atualizações ao vivo no mapa
Para ver a temperatura em tempo real, siga as etapas abaixo:
- Comece a enviar dados de IoT simulados executando o projeto DeviceSimulator do Azure Digital Twins Conectar uma solução de ponta a ponta. As instruções para esse processo estão na seção Configurar e executar a simulação .
- Use o módulo Indoor do Azure Maps para renderizar seus mapas internos criados no Criador de Azure Maps.
- Copie o exemplo de arquivo HTML de mapa interno de exemplo: Estilo personalizado: consumir configuração de mapa no WebSDK (versão prévia).
- Substitua a chave de assinatura, mapConfiguration, statesetID e região no arquivo HTML local por seus valores.
- Abra esse arquivo no navegador.
Ambas as amostras enviam temperaturas em um intervalo compatível, então você deverá ver a cor da sala 121 atualizar no mapa aproximadamente a cada 30 segundos.
Armazenar informações de mapa nos Gêmeos Digitais do Azure
Agora que você tem uma solução fixada no código para atualizar informações de mapas, será possível usar o grafo dos Gêmeos Digitais do Azure para armazenar todas as informações necessárias para atualizar seu mapa interno. Essas informações incluem o ID do conjunto de estados, o ID da assinatura de mapas e o ID do recurso de cada mapa e localização, respectivamente.
Uma solução para esse exemplo específico envolveria atualizar cada espaço de nível superior para ter um ID de conjunto de estados e um ID da assinatura de mapas, assim como atualizar cada sala para incluir um ID de recurso. Será preciso definir esses valores uma vez durante a inicialização do grafo do gêmeo, depois consultar esses valores para cada evento de atualização do gêmeo.
De acordo com a configuração de sua topologia, será possível armazenar esses três atributos em diferentes níveis correlacionados à granularidade do mapa.
Próximas etapas
Para ler mais sobre como gerenciar, atualizar e recuperar informações do grafo dos gêmeos, confira as seguintes referências: