Obtendo a saída de depuração de dispositivo do Azure Sphere
Ao desenvolver uma solução IoT, muitas vezes você precisa ter acesso à saída de depuração de dispositivos. Embora isso possa ser obtido por meio de uma conexão de depuração com o Visual Studio/Code (mas também pode ser obtido a partir da linha de comando), você também pode precisar exibir a saída de depuração para dispositivos que não estão conectados ao Visual Studio/Code. Esses dispositivos podem estar executando testes de longo prazo ou possivelmente até mesmo implantados na produção. Há várias opções para obter acesso a dados de depuração:
- Obtendo a saída de depuração de um dispositivo conectado a um computador de desenvolvimento
- Obtendo saída de depuração para um dispositivo não conectado a um computador de desenvolvimento
- Fazer logon no armazenamento externo
- Fazer logon no Azure
Obtendo a saída de depuração de um dispositivo conectado a um computador de desenvolvimento
Problema: Como obter a saída de depuração ao depurar usando o Visual Studio/Visual Code?
Opções:
Aplicativo de alto nível
Um aplicativo de alto nível do Azure Sphere pode usar a API Log_Debug para enviar a saída de depuração com formatação de estilo printf para um computador anexado durante a depuração. Essa saída pode ser exibida usando o Visual Studio ou Visual Studio Code janela de depuração ou da linha de comando.
Talvez você queira considerar a configuração de sinalizadores de verbosidade de depuração em seu aplicativo e usar definições de compilação do CMake para controlar a quantidade de saída de depuração exibida quando o aplicativo for executado. No arquivo CMakeLists.txt você pode criar uma definição de tempo de compilação:
add_compile_definitions(DEBUG_FLAG)
No código do aplicativo de alto nível, você pode aumentar ou diminuir a quantidade de saída de depuração exibida pelo aplicativo usando
#ifdef
, por exemplo:
#ifdef DEBUG_FLAG
Log_Debug("My Message\n");
#endif
Aplicativo com capacidade em tempo real
Um aplicativo compatível com o Azure Sphere em tempo real (em execução em um dos núcleos M4) pode gravar informações de depuração/log em um UART dedicado somente transmissão M4. Isso requer um adaptador USB/Serial, como um FtDI Friend e um emulador de terminal.
O exemplo Olá, Mundo do Azure Sphere demonstra como imprimir no UART de depuração M4.
Há também aplicativos de exemplo disponíveis em CodeThink e MediaTek:
Definições de tempo de compilação de sinalizador de depuração também podem ser usadas em aplicativos M4 (capazes de tempo real).
Usando comunicações inter-core para enviar estado de um aplicativo com capacidade em tempo real para um aplicativo de alto nível
Se você estiver criando um sistema que combine um aplicativo capaz de alto nível e em tempo real, talvez você queira usar o aplicativo de alto nível para registrar o estado do sistema para ambos os aplicativos. As comunicações inter-core podem ser usadas para isso – o exemplo de Comunicação Inter-core do Azure Sphere implementa uma interface simples para passar uma mensagem entre um aplicativo com capacidade de alto nível e em tempo real.
Este módulo de aprendizagem do Azure Sphere demonstra como usar o Azure Sphere e o Azure RTOS, combinado com um modelo de mensagens entre núcleos para passar mensagens personalizadas entre os núcleos.
Obtendo saída de depuração para um dispositivo não conectado a um computador de desenvolvimento
Problema: Como registrar a saída de depuração quando seu dispositivo não está conectado a um computador de desenvolvimento?
Opções:
Enviar saída de depuração pela rede ou por um UART
Obter informações de log de depuração quando um dispositivo está conectado a um computador de desenvolvimento é bastante simples. No entanto, você também pode querer coletar informações de depuração/log quando um dispositivo não estiver conectado a um computador. Por exemplo, você pode ter um conjunto de dispositivos executando testes de longo prazo.
Se seus dispositivos estiverem conectados a uma rede, talvez você queira enviar a saída de depuração pela rede para um aplicativo que possa coletar e analisar as informações. Este aplicativo da Galeria do Azure Sphere demonstra como substituir o comportamento padrão Log_Debug para enviar e receber essa saída por meio de um soquete UDP.
Observe que o mecanismo usado para substituir o aplicativo padrão de alto nível Log_Debug comportamento também pode ser usado para enviar as informações de log de depuração para outros locais, por exemplo, para gerar os dados em um dos UARTs do Azure Sphere. Você pode usar esse exemplo UART como referência para combinar com o aplicativo UDPDebugLog Gallery para registrar suas mensagens em um UART.
Enviar saída de depuração para Hub IoT do Azure/Azure IoT Central
Embora a depuração de saída possa ser útil para diagnosticar problemas à medida que eles acontecem, também pode ser útil armazenar informações de telemetria/log de um dispositivo para pós-processamento.
Configurar uma instância do Hub IoT do Azure ou do Azure IoT Central fornece um ponto de extremidade para enviar dados de telemetria de dispositivo que podem ser usados como parte da lógica de negócios, você também pode enviar informações de estado/log do dispositivo que podem ser tratadas separadamente dos dados de telemetria/negócios.
O exemplo de log no Azure demonstra como encaminhar mensagens de log como Hub IoT telemetria e armazená-las em um cluster Data Explorer do Azure para consulta avançada.
Hub IoT do Azure
Sua instância Hub IoT do Azure pode ser configurada para enviar dados para um Banco de Dados do Azure para armazenamento/análise, você também pode querer filtrar as mensagens, que podem ser obtidas por meio do EventHub e de uma Função do Azure.
Para Hub IoT do Azure você pode enviar dados para uma Função do Azure que pode processar as mensagens. O Hub IoT do Azure gatilho para Azure Functions artigo explica como vincular uma Função do Azure a uma instância de Hub IoT do Azure.
Azure IoT Central
O Azure IoT Central inclui a capacidade de exportar continuamente seus dados para vários pontos de extremidade, incluindo:
- Hubs de Eventos do Azure
- Fila Barramento de Serviço do Azure
- tópico Barramento de Serviço do Azure
- Armazenamento de Blobs do Azure
- Webhook
O WebHook é um ponto de extremidade da API REST que você cria, pode ser uma Função do Azure.
Observe que você pode querer filtrar mensagens em sua Função do Azure com base na ID do dispositivo que está enviando os dados, você pode obter a ID do dispositivo usando o seguinte código na Função do Azure:
public static async Task Run(EventData message, ILogger log)
{
var deviceId=message.SystemProperties["iothub-connection-device-id"];
// Code to filter the messages goes here...
}
Hub IoT do Azure e o Azure IoT Central dão suporte a Dispositivos Gêmeos, que inclui o estado desejado (definido no aplicativo Hub IoT/Central) e o estado relatado (estado do dispositivo). Você pode usar Hub IoT do Azure/Central Device Twin para definir um estado desejado para verbosidade de dados de log (aumentar/diminuir a frequência de registro em log ou a riqueza dos dados de registro em log). O Exemplo de IoT do Azure demonstra como lidar com as alterações do Dispositivo Gêmeo Desired State
.
Registrar dados no armazenamento
O Azure Sphere dá suporte a até 64KB de armazenamento mutável para um aplicativo de alto nível, isso pode ser usado para persistir configurações, estado do aplicativo ou outros dados, os desenvolvedores de aplicativos são responsáveis por serializar/desserializar dados para armazenamento mutável - a Galeria do Azure Sphere inclui um projeto que mostra como usar um par key/value (dicionário) para gravar/ler o estado para armazenamento mutável (até 64KB, dependendo de como o manifesto do aplicativo está configurado).
Talvez você queira gravar mais de 64KB de dados de Log/Estado em algum tipo de armazenamento externo, isso pode ser útil para dispositivos que têm conectividade intermitente ou precisam armazenar/recuperar mais de 64KB de dados.
Uma opção é adicionar armazenamento externo, talvez usando o flash SPI para armazenar os dados - este projeto usa o flash SPI para armazenar uma atualização no ar para um dispositivo downstream e pode ser modificado para dar suporte a dados de telemetria/estado de registro em log de um aplicativo do Azure Sphere.