Compartilhar via


HoloLens (1ª geração) e Azure 313: Serviço de Hub IoT

Observação

Os tutoriais do Mixed Reality Academy foram projetados com o HoloLens (1ª geração) e os headsets imersivos de realidade misturada em mente. Dessa forma, achamos que é importante continuar disponibilizando esses tutoriais para os desenvolvedores que ainda buscam obter diretrizes para o desenvolvimento visando esses dispositivos. Esses tutoriais não serão atualizados com os conjuntos de ferramentas mais recentes nem com as interações usadas para o HoloLens 2. Eles serão mantidos para continuar funcionando nos dispositivos compatíveis. Haverá uma nova série de tutoriais que serão postados no futuro que demonstrarão como desenvolver para o HoloLens 2. Este aviso será atualizado com um link para esses tutoriais quando eles forem postados.

Resultado do curso

Neste curso, você aprenderá a implementar um Serviço de Hub IoT do Azure em uma máquina virtual que executa o sistema operacional Ubuntu 16.4. Um Aplicativo de Funções do Azure será usado para receber mensagens de sua VM do Ubuntu e armazenar o resultado em um Serviço de Tabela do Azure. Em seguida, você poderá exibir esses dados usando o Power BI no Microsoft HoloLens ou headset imersivo (VR).

O conteúdo deste curso é aplicável a dispositivos IoT Edge, embora, para a finalidade deste curso, o foco seja em um ambiente de máquina virtual, para que o acesso a um dispositivo Edge físico não seja necessário.

Ao concluir este curso, você aprenderá a:

  • Implante um módulo do IoT Edge em uma máquina virtual (sistema operacional Ubuntu 16), que representará seu dispositivo IoT.
  • Adicione um Modelo do Tensorflow da Visão Personalizada do Azure ao módulo Edge, com código que analisará as imagens armazenadas no contêiner.
  • Configure o módulo para enviar a mensagem de resultado da análise de volta para o Serviço de Hub IoT.
  • Use um Aplicativo de Funções do Azure para armazenar a mensagem em uma Tabela do Azure.
  • Configure o Power BI para coletar a mensagem armazenada e criar um relatório.
  • Visualize os dados da mensagem de IoT no Power BI.

Os Serviços que você usará incluem:

  • O Hub IoT do Azure é um serviço do Microsoft Azure que permite que os desenvolvedores conectem, monitorem e gerenciem ativos de IoT. Para obter mais informações, visite a página do Serviço de Hub IoT do Azure.

  • O Registro de Contêiner do Azure é um serviço do Microsoft Azure que permite que os desenvolvedores armazenem imagens de contêiner para vários tipos de contêineres. Para obter mais informações, visite a página do Serviço de Registro de Contêiner do Azure.

  • O Azure Function App é um serviço do Microsoft Azure que permite que os desenvolvedores executem pequenas partes de código, 'funções', no Azure. Isso fornece uma maneira de delegar trabalho à nuvem, em vez de ao seu aplicativo local, o que pode ter muitos benefícios. O Azure Functions dá suporte a várias linguagens de desenvolvimento, incluindo C#, F#, Node.js, Java e PHP. Para obter mais informações, visite a página do Azure Functions.

  • O Armazenamento do Azure: Tabelas é um serviço do Microsoft Azure que permite aos desenvolvedores armazenar dados estruturados e não SQL na nuvem, tornando-os facilmente acessíveis em qualquer lugar. O serviço possui um design sem esquema, permitindo a evolução das tabelas conforme necessário e, portanto, é muito flexível. Para obter mais informações, visite a página Tabelas do Azure

Este curso ensinará como configurar e usar o Serviço de Hub IoT e, em seguida, visualizar uma resposta fornecida por um dispositivo. Caberá a você aplicar esses conceitos a uma configuração personalizada do Serviço de Hub IoT, que você pode estar criando.

Suporte a dispositivos

Curso HoloLens Headsets imersivos
MR e Azure 313: Serviço de Hub IoT ✔️ ✔️

Pré-requisitos

Para obter os pré-requisitos mais atualizados para desenvolver com Realidade Misturada, inclusive com o Microsoft HoloLens, visite o artigo Instalar as ferramentas .

Observação

Este tutorial foi desenvolvido para desenvolvedores que têm experiência básica com Python. Esteja ciente também de que os pré-requisitos e as instruções escritas neste documento representam o que foi testado e verificado no momento da redação (julho de 2018). Você é livre para usar o software mais recente, conforme listado no artigo instalar as ferramentas , embora não se deva presumir que as informações deste curso corresponderão perfeitamente ao que você encontrará em softwares mais recentes do que os listados abaixo.

O seguinte hardware e software são necessários:

  • Windows 10 Fall Creators Update (ou posterior), Modo de Desenvolvedor habilitado

    Aviso

    Você não pode executar uma máquina virtual usando o Hyper-V no Windows 10 Home Edition.

  • SDK do Windows 10 (versão mais recente)

  • Um HoloLens, Modo de Desenvolvedor habilitado

  • Visual Studio 2017.15.4 (usado apenas para acessar o Azure Cloud Explorer)

  • Acesso à Internet para o Azure e para o Serviço de Hub IoT. Para obter mais informações, siga este link para a página do Serviço do Hub IoT

  • Um modelo de machine learning. Se você não tiver seu próprio modelo pronto para uso, poderá usar o modelo fornecido com este curso.

  • Software Hyper-V habilitado em seu computador de desenvolvimento do Windows 10.

  • Uma máquina virtual executando o Ubuntu (16.4 ou 18.4), rodando em sua máquina de desenvolvimento ou, alternativamente, você pode usar um computador separado executando o Linux (Ubuntu 16.4 ou 18.4). Você pode encontrar mais informações sobre como criar uma VM no Windows usando o Hyper-V no capítulo "Antes de começar".

Antes de começar

  1. Configure e teste seu HoloLens. Se você precisar de suporte para configurar seu HoloLens, visite o artigo de configuração do HoloLens.
  2. É uma boa ideia executar a Calibração e o Ajuste do Sensor ao começar a desenvolver um novo aplicativo HoloLens (às vezes, pode ajudar a executar essas tarefas para cada usuário).

Para obter ajuda sobre a calibração, siga este link para o artigo Calibração do HoloLens.

Para obter ajuda sobre o Ajuste do Sensor, siga este link para o artigo Ajuste do Sensor do HoloLens.

  1. Configure sua máquina virtual Ubuntu usando o Hyper-V. Os recursos a seguir irão ajudá-lo com o processo.

    1. Primeiro, siga este link para baixar o ISO do Ubuntu 16.04.4 LTS (Xenial Xerus). Selecione a imagem da área de trabalho do PC de 64 bits (AMD64).
    2. Certifique-se de que o Hyper-V esteja habilitado em sua máquina com Windows 10. Você pode seguir este link para obter orientação sobre como instalar e habilitar o Hyper-V no Windows 10.
    3. Inicie o Hyper-V e crie uma nova VM do Ubuntu. Você pode seguir este link para obter um guia passo a passo sobre como criar uma VM com o Hyper-V. Quando solicitado a "Instalar um sistema operacional a partir de um arquivo de imagem inicializável", selecione o ISO do Ubuntu que você baixou anteriormente.

    Observação

    O uso da Criação Rápida do Hyper-V não é sugerido.

Capítulo 1 – Recuperar o modelo de Visão Personalizada

Com este curso, você terá acesso a um modelo de Visão Personalizada pré-criado que detecta teclados e mouses a partir de imagens. Se você usar isso, vá para o Capítulo 2.

No entanto, você pode seguir estas etapas se quiser usar seu próprio modelo de Visão Personalizada:

  1. Em seu Projeto de Visão Personalizada, vá para a guia Desempenho .

    Aviso

    Seu modelo deve usar um domínio compacto para exportar o modelo. Você pode alterar o domínio dos modelos nas configurações do seu projeto.

    Guia Desempenho

  2. Selecione a iteração que deseja exportar e clique em Exportar. Uma lâmina aparecerá.

    lâmina de exportação

  3. Na folha, clique em Arquivo do Docker.

    Selecione a área de encaixe

  4. Clique em Linux no menu suspenso e, em seguida, clique em Download.

    Clique em download

  5. Descompacte o conteúdo. Você o usará mais tarde neste curso.

Capítulo 2 - O Serviço de Registro de Contêiner

O Serviço de Registro de Contêiner é o repositório usado para hospedar seus contêineres.

O Serviço de Hub IoT que você criará e usará neste curso refere-se ao Serviço de Registro de Contêiner para obter os contêineres a serem implantados em seu Dispositivo de Borda.

  1. Primeiro, siga este link para o Portal do Azure e faça logon com suas credenciais.

  2. Vá para Criar um recurso e procure por Container Registry.

    registro de contêiner

  3. Clique em Criar.

    Captura de tela que mostra onde selecionar Criar.

  4. Defina os parâmetros de configuração do serviço:

    1. Insira um nome para o seu projeto, neste exemplo é chamado IoTCRegistry.

    2. Escolha um grupo de recursos ou crie um novo. Um grupo de recursos fornece uma maneira de monitorar, controlar o acesso, provisionar e gerenciar a cobrança de uma coleção de ativos do Azure. É recomendável manter todos os Serviços do Azure associados a um único projeto (por exemplo, como esses cursos) em um grupo de recursos comum).

    3. Defina a localização do Serviço.

    4. Defina o usuário administrador como Habilitar.

    5. Defina SKU como Básico.

    Captura de tela que mostra onde definir SKU como Básico.

  5. Clique em Criar e aguarde a criação dos Serviços.

  6. Quando a notificação aparecer informando sobre a criação bem-sucedida do Container Registry, clique em Ir para o recurso para ser redirecionado para a página Serviço.

    Captura de tela que mostra onde selecionar Ir para o recurso.

  7. Na página Serviço de Registro de Contêiner, clique em Chaves de acesso.

  8. Anote (você pode usar o Bloco de Notas) dos seguintes parâmetros:

    1. Servidor de login
    2. Nome de usuário
    3. Senha

    Captura de tela que mostra onde exibir os parâmetros Servidor de login, Nome de usuário e Senha.

Capítulo 3 – O Serviço de Hub IoT

Agora você começará a criação e a configuração do Serviço de Hub IoT.

  1. Se ainda não estiver conectado, faça logon no Portal do Azure.

  2. Depois de fazer logon, clique em Criar um recurso no canto superior esquerdo, pesquise Hub IoT e clique em Enter.

Captura de tela que mostra a janela Tudo aberta. I O T Hub nos resultados da pesquisa e Criar um recurso no canto superior esquerdo estão circulados em vermelho.

  1. A nova página fornecerá uma descrição do Serviço de conta de armazenamento. Na parte inferior esquerda desse prompt, clique no botão Criar para criar uma instância desse serviço.

    Captura de tela que mostra a página Visão geral do hub IOT.

  2. Depois de clicar em Criar, um painel aparecerá:

    1. Escolha um grupo de recursos ou crie um novo. Um grupo de recursos fornece uma maneira de monitorar, controlar o acesso, provisionar e gerenciar a cobrança de uma coleção de ativos do Azure. É recomendável manter todos os Serviços do Azure associados a um único projeto (por exemplo, como esses cursos) em um grupo de recursos comum).

      Se você quiser ler mais sobre os Grupos de Recursos do Azure, siga este link sobre como gerenciar um Grupo de Recursos.

    2. Selecione um local apropriado (use o mesmo local em todos os serviços criados neste curso).

    3. Insira o Nome desejado para esta instância de Serviço.

  3. Na parte inferior da página, clique em Avançar: Tamanho e escala.

    Captura de tela que mostra a página Noções básicas do hub I O T. Next O tamanho e a escala são circulados em vermelho na parte inferior da página.

  4. Nesta página, selecione o nível de preço e escala (se esta for sua primeira instância do Serviço de Hub IoT, uma camada gratuita deverá estar disponível para você).

  5. Clique em Revisar + Criar.

    Captura de tela que mostra a página Tamanho e escala do hub de E/S. A camada F 1 Gratuita é selecionada no campo Camada de preço e escala. Revisar e criar é circulado em vermelho na parte inferior da página.

  6. Revise suas configurações e clique em Criar.

    Captura de tela que mostra a página de revisão e criação do hub I O T. Criar é circulado em vermelho na parte inferior da página.

  7. Depois que a notificação for exibida informando sobre a criação bem-sucedida do Serviço de Hub IoT, clique em Ir para o recurso para ser redirecionado para a página Serviço.

    Captura de tela que mostra uma notificação de implantação bem-sucedida. O botão Ir para o recurso está circulado em vermelho.

  8. Role o painel lateral à esquerda até ver Gerenciamento Automático de Dispositivos, clique em IoT Edge.

    Captura de tela que mostra I O T Edge selecionado no menu em Gerenciamento automático de dispositivos.

  9. Na janela exibida à direita, clique em Adicionar dispositivo IoT Edge. Uma lâmina aparecerá à direita.

  10. Na folha, forneça ao novo dispositivo uma ID de dispositivo (um nome de sua escolha). Em seguida, clique em Salvar. As chaves primárias e secundárias serão geradas automaticamente, se você tiver a opção Gerar automaticamente marcada.

    Captura de tela que mostra a página Adicionar dispositivo. O dispositivo de borda 0 1 é inserido no campo Dispositivo I D. A caixa Gerar chaves automaticamente está marcada.

  11. Você navegará de volta para a seção Dispositivos do IoT Edge , onde seu novo dispositivo será listado. Clique no seu novo dispositivo (destacado em vermelho na imagem abaixo).

    Captura de tela que mostra a página Dispositivos de borda I O T. A caixa está marcada ao lado de Edge Device na parte inferior da página.

  12. Na página Detalhes do Dispositivo exibida, faça uma cópia da Cadeia de Conexão (chave primária).

    Captura de tela que mostra a página Detalhes do dispositivo. A chave primária da cadeia de conexão está circulada em vermelho.

  13. Volte para o painel à esquerda e clique em Políticas de acesso compartilhado para abri-lo.

  14. Na página exibida, clique em iothubowner e uma folha aparecerá à direita da tela.

  15. Anote (no Bloco de Notas) a cadeia de conexão (chave primária), para uso posterior ao definir a cadeia de conexão para o dispositivo.

    Captura de tela que mostra a página Políticas de acesso compartilhado, localizada em Configurações. O proprietário do hub I O T é selecionado em Política. Na janela pop-up, o campo de chave primária da cadeia de conexão é circulado em vermelho.

Capítulo 4 - Configurando o ambiente de desenvolvimento

Para criar e implantar módulos para o Hub IoT Edge, você precisará dos seguintes componentes instalados em seu computador de desenvolvimento que executa o Windows 10:

  1. Docker para Windows, ele solicitará que você crie uma conta para poder fazer o download.

    Baixe o Docker para Windows

    Importante

    O Docker requer Windows 10 PRO, Enterprise 14393 ou Windows Server 2016 RTM para ser executado. Se você estiver executando outras versões do Windows 10, tente instalar o Docker usando o Docker Toolbox.

  2. Python 3.6.

    Baixar Python 3.6

  3. Visual Studio Code (também conhecido como VS Code).

    baixar VS Code

Depois de instalar o software mencionado acima, você precisará reiniciar sua máquina.

Capítulo 5 - Configurando o ambiente Ubuntu

Agora você pode configurar seu dispositivo executando o sistema operacional Ubuntu. Siga as etapas abaixo, para instalar o software necessário, para implantar seus contêineres em sua placa:

Importante

Você deve sempre preceder os comandos do terminal com sudo para executar como usuário administrador. por exemplo:

sudo docker \<option> \<command> \<argument>
  1. Abra o Terminal Ubuntu e use o seguinte comando para instalar o pip:

    [! DICA] Você pode abrir o Terminal com muita facilidade usando o atalho de teclado: Ctrl + Alt + T.

        sudo apt-get install python-pip
    
  2. Ao longo deste capítulo, você pode ser solicitado, pelo Terminal, a obter permissão para usar o armazenamento do dispositivo e inserir s/n (sim ou não), digitar 'y' e pressionar a tecla Enter para aceitar.

  3. Depois que esse comando for concluído, use o seguinte comando para instalar o curl:

        sudo apt install curl
    
  4. Depois que pip e curl estiverem instalados, use o seguinte comando para instalar o runtime do IoT Edge, isso é necessário para implantar e controlar os módulos em sua placa:

        curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > ./microsoft-prod.list
    
        sudo cp ./microsoft-prod.list /etc/apt/sources.list.d/
    
        curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
    
        sudo cp ./microsoft.gpg /etc/apt/trusted.gpg.d/
    
        sudo apt-get update
    
        sudo apt-get install moby-engine
    
        sudo apt-get install moby-cli
    
        sudo apt-get update
    
        sudo apt-get install iotedge
    
  5. Neste ponto, você será solicitado a abrir o arquivo de configuração de runtime, para inserir a Cadeia de Conexão do Dispositivo, que você anotou (no Bloco de Notas), ao criar o Serviço de Hub IoT (na etapa 14, do Capítulo 3). Execute a seguinte linha no terminal para abrir esse arquivo:

        sudo nano /etc/iotedge/config.yaml
    
  6. O arquivo config.yaml será exibido, pronto para você editar:

    Aviso

    Quando este arquivo é aberto, pode ser um pouco confuso. Você estará editando o texto deste arquivo, dentro do próprio Terminal .

    1. Use as teclas de seta do teclado para rolar para baixo (você precisará rolar um pouco para baixo), para alcançar a linha que contém":

      "<ADICIONAR CADEIA DE CONEXÃO DO DISPOSITIVO AQUI".>

    2. Substitua a linha, incluindo os colchetes, pela Cadeia de Conexão do Dispositivo que você anotou anteriormente.

  7. Com a Cadeia de Conexão no lugar, no teclado, pressione as teclas Ctrl-X para salvar o arquivo. Ele solicitará que você confirme digitando Y. Em seguida, pressione a tecla Enter para confirmar. Você voltará ao Terminal normal.

  8. Depois que todos esses comandos forem executados com êxito, você terá instalado o Tempo de Execução do IoT Edge. Depois de inicializado, o runtime será iniciado sozinho sempre que o dispositivo for ligado e ficará em segundo plano, aguardando a implantação dos módulos do Serviço de Hub IoT.

  9. Execute a seguinte linha de comando para inicializar o Tempo de Execução do IoT Edge:

        sudo systemctl restart iotedge
    

    Importante

    Se você fizer alterações no arquivo .yaml ou na configuração acima, precisará executar a linha de reinicialização acima novamente, no Terminal.

  10. Verifique o status do Tempo de Execução do IoT Edge executando a linha de comando a seguir. O tempo de execução deve aparecer com o status ativo (em execução) em texto verde.

        sudo systemctl status iotedge
    
  11. Pressione as teclas Ctrl-C para sair da página de status. Você pode verificar se o IoT Edge Runtime está efetuando pull dos contêineres corretamente digitando o seguinte comando:

        sudo docker ps
    
  12. Uma lista com dois (2) contêineres deve aparecer. Esses são os módulos padrão criados automaticamente pelo Serviço de Hub IoT (edgeAgent e edgeHub). Depois de criar e implantar seus próprios módulos, eles aparecerão nesta lista, abaixo dos padrão.

Capítulo 6 - Instalar as extensões

Importante

Os próximos capítulos (6-9) devem ser executados em sua máquina Windows 10.

  1. Abra o VS Code.

  2. Clique no botão Extensões (quadrado) na barra esquerda do VS Code para abrir o painel Extensões.

  3. Pesquise e instale as seguintes extensões (conforme mostrado na imagem abaixo):

    1. Azure IoT Edge
    2. Kit de Ferramentas do Azure IoT
    3. Docker

    Captura de tela que mostra a janela de extensões. O Azure I O T Edge, o Azure I O T Toolkit e o Docker estão circulados em vermelho.

  4. Depois que as extensões estiverem instaladas, feche e abra novamente o VS Code.

  5. Com o VS Code aberto mais uma vez, navegue até Exibir>terminal integrado.

  6. Agora você instalará o Cookiecutter. No terminal, execute o seguinte comando bash:

        pip install --upgrade --user cookiecutter
    

    [! DICA] Se você tiver problemas com este comando:

    1. Reinicie o VS Code e/ou seu computador.
    2. Pode ser necessário alternar o Terminal VS Code para aquele que você está usando para instalar o Python, ou seja , o Powershell (especialmente caso o ambiente Python já tenha sido instalado em sua máquina). Com o Terminal aberto, você encontrará o menu suspenso no lado direito do Terminal. Captura de tela que mostra 1 powershell selecionado no menu suspenso.
    3. Certifique-se de que o caminho de instalação do Python seja adicionado como Variável de Ambiente em sua máquina. O Cookiecutter deve fazer parte do mesmo caminho de localização. Siga este link para obter mais informações sobre variáveis de ambiente,
  7. Depois que o Cookiecutter terminar de instalar, você deve reiniciar sua máquina, para que o Cookiecutter seja reconhecido como um comando, dentro do ambiente do seu sistema.

Capítulo 7 – Criar sua solução de contêiner

Neste ponto, você precisa criar o contêiner, com o módulo, a ser enviado para o Container Registry. Depois de enviar o contêiner por push, você usará o Serviço de Borda do Hub IoT para implantá-lo em seu dispositivo, que está executando o runtime do IoT Edge.

  1. No VS Code, clique na paleta Exibir>comando.

  2. Na paleta, pesquise e execute Azure IoT Edge: Nova Solução Iot Edge.

  3. Navegue até um local onde você deseja criar sua solução. Pressione a tecla Enter para aceitar o local.

  4. Dê um nome à sua solução. Pressione a tecla Enter para confirmar o nome fornecido.

  5. Agora você será solicitado a escolher a estrutura de modelo para sua solução. Clique em Módulo Python. Pressione a tecla Enter para confirmar essa escolha.

  6. Dê um nome ao seu módulo. Pressione a tecla Enter para confirmar o nome do seu módulo. Certifique-se de anotar (com o Bloco de Notas) o nome do módulo, pois ele será usado posteriormente.

  7. Você notará que um endereço de repositório de imagens do Docker pré-criado aparecerá na paleta. Ficará assim:

    localhost:5000/-O NOME DO SEU MÓDULO-.

  8. Exclua localhost:5000 e, em seu lugar, insira o endereço do Servidor de Logon do Container Registry, que você anotou ao criar o Serviço de Container Registry (na etapa 8, do Capítulo 2). Pressione a tecla Enter para confirmar o endereço.

  9. Neste momento, a solução contendo o template para o seu módulo Python será criada e sua estrutura será exibida na Aba Explorar, do VS Code, no lado esquerdo da tela. Se a guia Explorar não estiver aberta, você poderá abri-la clicando no botão superior, na barra à esquerda.

    Captura de tela que mostra o botão da guia Explorar, que se assemelha a 2 pedaços de papel empilhados.

  10. A última etapa deste capítulo é clicar e abrir o arquivo .env, na guia Explorar, e adicionar seu nome de usuário e senha do Container Registry. Esse arquivo é ignorado pelo git, mas ao criar o contêiner, definirá as credenciais para acessar o Serviço de Registro de Contêiner.

    Captura de tela que mostra uma janela de comando com o texto Nome de usuário do Registro de Contêiner inserido na linha 1 e Senha do Registro de Contêiner inserido na linha 2.

Capítulo 8 – Editando sua solução de contêiner

Agora você concluirá a solução de contêiner, atualizando os seguintes arquivos:

  • main.py script python.
  • requirements.txt.
  • deployment.template.json.
  • Dockerfile.amd64

Em seguida, você criará a pasta images , usada pelo script python para verificar se há imagens correspondentes ao seu modelo de Visão Personalizada. Por fim, você adicionará o arquivo labels.txt, para ajudar a ler seu modelo, e o arquivo model.pb, que é seu modelo.

  1. Com o VS Code aberto, navegue até a pasta do módulo e procure o script chamado main.py. Clique duas vezes para abri-lo.

  2. Exclua o conteúdo do arquivo e insira o seguinte código:

    # Copyright (c) Microsoft. All rights reserved.
    # Licensed under the MIT license. See LICENSE file in the project root for
    # full license information.
    
    import random
    import sched, time
    import sys
    import iothub_client
    from iothub_client import IoTHubModuleClient, IoTHubClientError, IoTHubTransportProvider
    from iothub_client import IoTHubMessage, IoTHubMessageDispositionResult, IoTHubError
    import json
    import os
    import tensorflow as tf
    import os
    from PIL import Image
    import numpy as np
    import cv2
    
    # messageTimeout - the maximum time in milliseconds until a message times out.
    # The timeout period starts at IoTHubModuleClient.send_event_async.
    # By default, messages do not expire.
    MESSAGE_TIMEOUT = 10000
    
    # global counters
    RECEIVE_CALLBACKS = 0
    SEND_CALLBACKS = 0
    
    TEMPERATURE_THRESHOLD = 25
    TWIN_CALLBACKS = 0
    
    # Choose HTTP, AMQP or MQTT as transport protocol.  Currently only MQTT is supported.
    PROTOCOL = IoTHubTransportProvider.MQTT
    
    
    # Callback received when the message that we're forwarding is processed.
    def send_confirmation_callback(message, result, user_context):
        global SEND_CALLBACKS
        print ( "Confirmation[%d] received for message with result = %s" % (user_context, result) )
        map_properties = message.properties()
        key_value_pair = map_properties.get_internals()
        print ( "    Properties: %s" % key_value_pair )
        SEND_CALLBACKS += 1
        print ( "    Total calls confirmed: %d" % SEND_CALLBACKS )
    
    
    def convert_to_opencv(image):
        # RGB -> BGR conversion is performed as well.
        r,g,b = np.array(image).T
        opencv_image = np.array([b,g,r]).transpose()
        return opencv_image
    
    def crop_center(img,cropx,cropy):
        h, w = img.shape[:2]
        startx = w//2-(cropx//2)
        starty = h//2-(cropy//2)
        return img[starty:starty+cropy, startx:startx+cropx]
    
    def resize_down_to_1600_max_dim(image):
        h, w = image.shape[:2]
        if (h < 1600 and w < 1600):
            return image
    
        new_size = (1600 * w // h, 1600) if (h > w) else (1600, 1600 * h // w)
        return cv2.resize(image, new_size, interpolation = cv2.INTER_LINEAR)
    
    def resize_to_256_square(image):
        h, w = image.shape[:2]
        return cv2.resize(image, (256, 256), interpolation = cv2.INTER_LINEAR)
    
    def update_orientation(image):
        exif_orientation_tag = 0x0112
        if hasattr(image, '_getexif'):
            exif = image._getexif()
            if (exif != None and exif_orientation_tag in exif):
                orientation = exif.get(exif_orientation_tag, 1)
                # orientation is 1 based, shift to zero based and flip/transpose based on 0-based values
                orientation -= 1
                if orientation >= 4:
                    image = image.transpose(Image.TRANSPOSE)
                if orientation == 2 or orientation == 3 or orientation == 6 or orientation == 7:
                    image = image.transpose(Image.FLIP_TOP_BOTTOM)
                if orientation == 1 or orientation == 2 or orientation == 5 or orientation == 6:
                    image = image.transpose(Image.FLIP_LEFT_RIGHT)
        return image
    
    
    def analyse(hubManager):
    
        messages_sent = 0;
    
        while True:
            #def send_message():
            print ("Load the model into the project")
            # These names are part of the model and cannot be changed.
            output_layer = 'loss:0'
            input_node = 'Placeholder:0'
    
            graph_def = tf.GraphDef()
            labels = []
    
            labels_filename = "labels.txt"
            filename = "model.pb"
    
            # Import the TF graph
            with tf.gfile.FastGFile(filename, 'rb') as f:
                graph_def.ParseFromString(f.read())
                tf.import_graph_def(graph_def, name='')
    
            # Create a list of labels
            with open(labels_filename, 'rt') as lf:
                for l in lf:
                    labels.append(l.strip())
            print ("Model loaded into the project")
    
            results_dic = dict()
    
            # create the JSON to be sent as a message
            json_message = ''
    
            # Iterate through images 
            print ("List of images to analyse:")
            for file in os.listdir('images'):
                print(file)
    
                image = Image.open("images/" + file)
    
                # Update orientation based on EXIF tags, if the file has orientation info.
                image = update_orientation(image)
    
                # Convert to OpenCV format
                image = convert_to_opencv(image)
    
                # If the image has either w or h greater than 1600 we resize it down respecting
                # aspect ratio such that the largest dimension is 1600
                image = resize_down_to_1600_max_dim(image)
    
                # We next get the largest center square
                h, w = image.shape[:2]
                min_dim = min(w,h)
                max_square_image = crop_center(image, min_dim, min_dim)
    
                # Resize that square down to 256x256
                augmented_image = resize_to_256_square(max_square_image)
    
                # The compact models have a network size of 227x227, the model requires this size.
                network_input_size = 227
    
                # Crop the center for the specified network_input_Size
                augmented_image = crop_center(augmented_image, network_input_size, network_input_size)
    
                try:
                    with tf.Session() as sess:     
                        prob_tensor = sess.graph.get_tensor_by_name(output_layer)
                        predictions, = sess.run(prob_tensor, {input_node: [augmented_image] })
                except Exception as identifier:
                    print ("Identifier error: ", identifier)
    
                print ("Print the highest probability label")
                highest_probability_index = np.argmax(predictions)
                print('FINAL RESULT! Classified as: ' + labels[highest_probability_index])
    
                l = labels[highest_probability_index]
    
                results_dic[file] = l
    
                # Or you can print out all of the results mapping labels to probabilities.
                label_index = 0
                for p in predictions:
                    truncated_probablity = np.float64(round(p,8))
                    print (labels[label_index], truncated_probablity)
                    label_index += 1
    
            print("Results dictionary")
            print(results_dic)
    
            json_message = json.dumps(results_dic)
            print("Json result")
            print(json_message)
    
            # Initialize a new message
            message = IoTHubMessage(bytearray(json_message, 'utf8'))
    
            hubManager.send_event_to_output("output1", message, 0)
    
            messages_sent += 1
            print("Message sent! - Total: " + str(messages_sent))      
            print('----------------------------')
    
            # This is the wait time before repeating the analysis
            # Currently set to 10 seconds
            time.sleep(10)
    
    
    class HubManager(object):
    
        def __init__(
                self,
                protocol=IoTHubTransportProvider.MQTT):
            self.client_protocol = protocol
            self.client = IoTHubModuleClient()
            self.client.create_from_environment(protocol)
    
            # set the time until a message times out
            self.client.set_option("messageTimeout", MESSAGE_TIMEOUT)
    
        # Forwards the message received onto the next stage in the process.
        def forward_event_to_output(self, outputQueueName, event, send_context):
            self.client.send_event_async(
                outputQueueName, event, send_confirmation_callback, send_context)
    
        def send_event_to_output(self, outputQueueName, event, send_context):
            self.client.send_event_async(outputQueueName, event, send_confirmation_callback, send_context)
    
    def main(protocol):
        try:
            hub_manager = HubManager(protocol)
            analyse(hub_manager)
            while True:
                time.sleep(1)
    
        except IoTHubError as iothub_error:
            print ( "Unexpected error %s from IoTHub" % iothub_error )
            return
        except KeyboardInterrupt:
            print ( "IoTHubModuleClient sample stopped" )
    
    if __name__ == '__main__':
        main(PROTOCOL)
    
  3. Abra o arquivo chamado requirements.txt e substitua seu conteúdo pelo seguinte:

    azure-iothub-device-client==1.4.0.0b3
    opencv-python==3.3.1.11
    tensorflow==1.8.0
    pillow==5.1.0
    
  4. Abra o arquivo chamado deployment.template.json e substitua seu conteúdo seguindo a diretriz abaixo:

    1. Como você terá sua própria estrutura JSON exclusiva, precisará editá-la manualmente (em vez de copiar um exemplo). Para facilitar, use a imagem abaixo como guia.

    2. As áreas que parecerão diferentes das suas, mas que você NÃO deve alterar, são destacadas em amarelo.

    3. As seções que você precisa excluir são destacadas em vermelho.

    4. Tenha cuidado para excluir os colchetes corretos e também remover as vírgulas.

      Captura de tela que mostra as linhas de código 12 a 15, 49 a 57 e a linha 67 circuladas em amarelo. As linhas de código 39 a 48 e a linha 66 estão circuladas em vermelho.

    5. O JSON preenchido deve se parecer com a seguinte imagem (embora, com suas diferenças exclusivas: nome de usuário/senha/nome do módulo/referências de módulo):

      Captura de tela que mostra a janela de comando com as linhas vermelhas circuladas excluídas.

  5. Abra o arquivo chamado Dockerfile.amd64 e substitua seu conteúdo pelo seguinte:

    FROM ubuntu:xenial
    
    WORKDIR /app
    
    RUN apt-get update && \
        apt-get install -y --no-install-recommends libcurl4-openssl-dev python-pip libboost-python-dev && \
        rm -rf /var/lib/apt/lists/* 
    RUN pip install --upgrade pip
    RUN pip install setuptools
    
    COPY requirements.txt ./
    RUN pip install -r requirements.txt
    
    RUN pip install pillow
    RUN pip install numpy
    
    RUN apt-get update && apt-get install -y \ 
        pkg-config \
        python-dev \ 
        python-opencv \ 
        libopencv-dev \ 
        libav-tools  \ 
        libjpeg-dev \ 
        libpng-dev \ 
        libtiff-dev \ 
        libjasper-dev \ 
        python-numpy \ 
        python-pycurl \ 
        python-opencv
    
    
    RUN pip install opencv-python
    RUN pip install tensorflow
    RUN pip install --upgrade tensorflow
    
    COPY . .
    
    RUN useradd -ms /bin/bash moduleuser
    USER moduleuser
    
    CMD [ "python", "-u", "./main.py" ]
    
    
  6. Clique com o botão direito do mouse na pasta abaixo dos módulos (ela terá o nome que você forneceu anteriormente; no exemplo mais abaixo, é chamado pythonmodule) e clique em Nova pasta. Nomeie as imagens da pasta.

  7. Dentro da pasta, adicione algumas imagens contendo mouse ou teclado. Essas serão as imagens que serão analisadas pelo modelo do Tensorflow.

    Aviso

    Se você estiver usando seu próprio modelo, precisará alterá-lo para refletir os dados de seus próprios modelos.

  8. Agora você precisará recuperar os arquivos labels.txt e model.pb da pasta model, que você baixou anteriormente (ou criou de seu próprio Serviço de Visão Personalizada), no Capítulo 1. Depois de ter os arquivos, coloque-os em sua solução, ao lado dos outros arquivos. O resultado final deve ficar parecido com a imagem abaixo:

    Captura de tela que mostra a janela do Explorer. A pasta do módulo python está aberta.

Capítulo 9 - Empacote a solução como um recipiente

  1. Agora você está pronto para "empacotar" seus arquivos como um contêiner e enviá-los por push para o Registro de Contêiner do Azure. No VS Code, abra o Terminal Integrado (Exibir>Terminal Integrado ou Ctrl`+) e use a seguinte linha para fazer logon no Docker (substitua os valores do comando pelas credenciais do ACR (Registro de Contêiner do Azure)):

        docker login -u <ACR username> -p <ACR password> <ACR login server>
    
  2. Clique com o botão direito do mouse no deployment.template.json de arquivos e clique em Criar Solução IoT Edge. Esse processo de compilação leva algum tempo (dependendo do seu dispositivo), portanto, esteja preparado para esperar. Após a conclusão do processo de compilação, um arquivo deployment.json terá sido criado dentro de uma nova pasta chamada config.

    Captura de tela que mostra a pasta de configuração e o arquivo jason dot de implantação circulado em vermelho.

  3. Abra a Paleta de Comandos novamente e pesquise Azure: Entrar. Siga os prompts usando as credenciais da sua Conta do Azure; O VS Code fornecerá uma opção para Copiar e Abrir, que copiará o código do dispositivo que você precisará em breve e abrirá seu navegador da Web padrão. Quando solicitado, cole o código do dispositivo para autenticar sua máquina.

    copiar e abrir

  4. Depois de entrar, você notará, na parte inferior do painel Explorar, uma nova seção chamada Dispositivos do Hub IoT do Azure. Clique nesta seção para expandi-la.

    dispositivo de borda

  5. Se o dispositivo não estiver aqui, você precisará clicar com o botão direito do mouse em Dispositivos do Hub IoT do Azure e clicar em Definir Cadeia de Conexão do Hub IoT. Em seguida, você verá que a Paleta de Comandos (na parte superior do VS Code) solicitará que você insira sua Cadeia de Conexão. Essa é a cadeia de conexão que você anotou no final do Capítulo 3. Pressione a tecla Enter , depois de copiar a string.

  6. Seu dispositivo deve carregar e aparecer. Clique com o botão direito do mouse no nome do dispositivo e clique em Criar Implantação para Dispositivo Único.

    Captura de tela que mostra o menu do botão direito. Criar implantação para um único dispositivo é realçado.

  7. Você receberá um prompt do File Explorer , onde poderá navegar até a pasta de configuração e selecionar o arquivo deployment.json . Com esse ficheiro selecionado, clique no botão Selecionar manifesto de implementação do Edge (Select Edge Deployment Manifest ).

    Captura de tela que mostra a janela do Explorador de Arquivos. O arquivo dot jason de implantação é selecionado e Selecionar manifesto de implantação do Edge é circulado em vermelho.

  8. Neste ponto, você forneceu ao Serviço de Hub IoT o manifesto para que ele implante o contêiner, como um módulo, do Registro de Contêiner do Azure, implantando-o efetivamente em seu dispositivo.

  9. Para exibir as mensagens enviadas do seu dispositivo para o Hub IoT, clique com o botão direito do mouse novamente no nome do dispositivo na seção Dispositivos do Hub IoT do Azure, no painel Explorer, e clique em Iniciar Monitoramento da Mensagem D2C. As mensagens enviadas do seu dispositivo devem aparecer no VS Terminal. Seja paciente, pois isso pode levar algum tempo. Consulte o próximo capítulo para depuração e verificação se a implantação foi bem-sucedida.

Este módulo agora iterará entre as imagens na pasta de imagens e as analisará, a cada iteração. Obviamente, isso é apenas uma demonstração de como fazer com que o modelo básico de aprendizado de máquina funcione em um ambiente de dispositivo IoT Edge.

Para expandir a funcionalidade deste exemplo, você pode proceder de várias maneiras. Uma maneira pode ser incluir algum código no contêiner, que captura fotos de uma webcam conectada ao dispositivo e salva as imagens na pasta de imagens.

Outra maneira pode ser copiar as imagens do dispositivo IoT para o contêiner. Uma maneira prática de fazer isso é executar o seguinte comando no terminal do dispositivo IoT (talvez um pequeno aplicativo possa fazer o trabalho, se você quiser automatizar o processo). Você pode testar esse comando executando-o manualmente no local da pasta onde seus arquivos estão armazenados:

    sudo docker cp <filename> <modulename>:/app/images/<a name of your choice>

Capítulo 10 – Depurando o runtime do IoT Edge

Veja a seguir uma lista de linhas de comando e dicas para ajudá-lo a monitorar e depurar a atividade de mensagens do Tempo de Execução do IoT Edge em seu dispositivo Ubuntu.

  • Verifique o status do Tempo de Execução do IoT Edge executando a seguinte linha de comando:

        sudo systemctl status iotedge
    

    Observação

    Lembre-se de pressionar Ctrl + C para terminar de visualizar o status.

  • Liste os contêineres que estão implantados no momento. Se o Serviço de Hub IoT tiver implantado os contêineres com êxito, eles serão exibidos executando a seguinte linha de comando:

        sudo iotedge list
    

    Ou

        sudo docker ps
    

    Observação

    O acima é uma boa maneira de verificar se o módulo foi implantado com sucesso, pois ele aparecerá na lista; caso contrário, você verá apenas o edgeHub e o edgeAgent.

  • Para exibir os logs de código de um contêiner, execute a seguinte linha de comando:

        journalctl -u iotedge
    

Comandos úteis para gerenciar o IoT Edge Runtime:

  • Para excluir todos os contêineres no host:

        sudo docker rm -f $(sudo docker ps -aq)
    
  • Para interromper o Tempo de Execução do IoT Edge:

        sudo systemctl stop iotedge
    

Capítulo 11 – Criar serviço de tabela

Navegue de volta para o Portal do Azure, onde você criará um Serviço de Tabelas do Azure, criando um recurso de armazenamento.

  1. Se ainda não estiver conectado, faça logon no Portal do Azure.

  2. Uma vez logado, clique em Criar um recurso, no canto superior esquerdo, e procure por Conta de armazenamento, e pressione a tecla Enter , para iniciar a pesquisa.

  3. Depois de aparecer, clique em Conta de armazenamento - blob, arquivo, tabela, fila na lista.

    Captura de tela que mostra a nova janela. O armazenamento é inserido na barra de pesquisa. Em Destaque, o blob da conta de armazenamento, o arquivo, a tabela, a fila são circulados em vermelho.

  4. A nova página fornecerá uma descrição do Serviço de conta de armazenamento. Na parte inferior esquerda desse prompt, clique no botão Criar para criar uma instância desse serviço.

    Captura de tela que mostra a página Conta de armazenamento. O botão Criar na parte inferior da página está circulado em vermelho.

  5. Depois de clicar em Criar, um painel aparecerá:

    1. Insira o Nome desejado para esta instância de serviço (deve estar todo em minúsculas).

    2. Em Modelo de implantação, clique em Gerenciador de recursos.

    3. Para Tipo de conta, usando o menu suspenso, clique em Armazenamento (uso geral v1).

    4. Clique em um local apropriado.

    5. No menu suspenso Replicação, clique em RA-GRS (armazenamento com redundância geográfica com acesso de leitura).

    6. Em Desempenho, clique em Padrão.

    7. Na seção Transferência segura necessária, clique em Desativado.

    8. No menu suspenso Assinatura , clique em uma assinatura apropriada.

    9. Escolha um grupo de recursos ou crie um novo. Um grupo de recursos fornece uma maneira de monitorar, controlar o acesso, provisionar e gerenciar a cobrança de uma coleção de ativos do Azure. É recomendável manter todos os Serviços do Azure associados a um único projeto (por exemplo, como esses cursos) em um grupo de recursos comum).

      Se você quiser ler mais sobre os Grupos de Recursos do Azure, siga este link sobre como gerenciar um Grupo de Recursos.

    10. Deixe as redes virtuais como Desabilitadas, se essa for uma opção para você.

    11. Clique em Criar.

      Preencha os detalhes de armazenamento

  6. Depois de clicar em Criar, você terá que esperar que o Serviço seja criado, isso pode levar um minuto.

  7. Uma notificação será exibida no Portal assim que a instância de serviço for criada. Clique nas notificações para explorar sua nova instância de serviço.

    Nova notificação de armazenamento

  8. Clique no botão Ir para o recurso na notificação e você será levado para a nova página de visão geral da instância do Serviço de Armazenamento.

    Captura de tela que mostra a notificação de implantação bem-sucedida. O botão Ir para o recurso está circulado em vermelho.

  9. Na página de visão geral, no lado direito, clique em Tabelas.

    tabelas

  10. O painel à direita mudará para mostrar as informações do Serviço de Tabela, em que você precisa adicionar uma nova tabela. Faça isso clicando no botão + Tabela no canto superior esquerdo.

    abrir Tabelas

  11. Uma nova página será mostrada, na qual você precisa inserir um nome de tabela. Esse é o nome que você usará para se referir aos dados em seu aplicativo em capítulos posteriores (criando o Aplicativo de Funções e o Power BI). Insira IoTMessages como o nome (você pode escolher o seu próprio, lembre-se dele quando usado posteriormente neste documento) e clique em OK.

  12. Depois que a nova tabela for criada, você poderá vê-la na página Serviço de Tabela (na parte inferior).

    Captura de tela que mostra a página Serviço de Tabela com uma tabela listada.

  13. Agora clique em Chaves de acesso e faça uma cópia do nome e da chave da conta de armazenamento (usando o Bloco de Notas), você usará esses valores posteriormente neste curso, ao criar o Aplicativo de Funções do Azure.

    Captura de tela que mostra a página Teclas de acesso, localizada em Configurações. O campo Nome da conta de armazenamento e o campo Chave estão circulados em vermelho.

  14. Usando o painel à esquerda novamente, role até a seção Serviço de Tabela e clique em Tabelas (ou Procurar Tabelas, em Portais mais recentes) e faça uma cópia da URL da Tabela (usando o Bloco de Notas). Você usará esse valor posteriormente neste curso, ao vincular sua tabela ao aplicativo do Power BI .

    Captura de tela que mostra a página Tabelas, localizada em Serviço de Tabela. O U R L para a Tabela de Mensagens I O T está circulado em vermelho.

Capítulo 12 – Concluindo a Tabela do Azure

Agora que sua conta de armazenamento do Serviço Tabela foi configurada, é hora de adicionar dados a ela, que serão usados para armazenar e recuperar informações. A edição de suas tabelas pode ser feita através do Visual Studio.

  1. Abra o Visual Studio (não o Visual Studio Code).

  2. No menu, clique em Exibir>Cloud Explorer.

    Abra o Cloud Explorer

  3. O Cloud Explorer será aberto como um item encaixado (seja paciente, pois o carregamento pode levar tempo).

    Aviso

    Se a assinatura usada para criar suas Contas de Armazenamento não estiver visível, verifique se você tem:

    • Conectado à mesma conta que você usou para o Portal do Azure.

    • Selecionou sua assinatura na página Gerenciamento de conta (talvez seja necessário aplicar um filtro nas configurações da sua conta):

      Encontrar assinatura

  4. Seus serviços de nuvem do Azure serão mostrados. Encontre Contas de Armazenamento e clique na seta à esquerda para expandir suas contas.

    Abrir contas de armazenamento

  5. Depois de expandida, sua conta de armazenamento recém-criada deve estar disponível. Clique na seta à esquerda do seu armazenamento e, quando ela for expandida, encontre Tabelas e clique na seta ao lado dela, para revelar a Tabela que você criou no último Capítulo. Clique duas vezes na tabela.

  6. Sua tabela será aberta no centro da janela do Visual Studio. Clique no ícone da tabela com o + (mais) nele.

    Adicionar nova tabela

  7. Uma janela aparecerá solicitando que você adicione entidade. Você criará apenas uma entidade, embora ela tenha três propriedades. Você observará que PartitionKey e RowKey já são fornecidos, pois são usados pela tabela para localizar seus dados.

    Partição e chave de linha

  8. Atualize os seguintes valores:

    • Nome: PartitionKey, Valor: PK_IoTMessages

    • Nome: RowKey, Valor: RK_1_IoTMessages

  9. Em seguida, clique em Adicionar propriedade (no canto inferior esquerdo da janela Adicionar entidade ) e adicione a seguinte propriedade:

    • MessageContent, como uma cadeia de caracteres, deixe o Valor vazio.
  10. Sua tabela deve corresponder à da imagem abaixo:

    adicionar valores corretos

    Observação

    A razão pela qual a entidade tem o número 1 na chave de linha é porque você pode querer adicionar mais mensagens, caso deseje experimentar mais este curso.

  11. Clique em OK quando tiver terminado. Sua tabela agora está pronta para ser usada.

Capítulo 13 – Criar um aplicativo de funções do Azure

Agora é hora de criar um Aplicativo de Funções do Azure, que será chamado pelo Serviço de Hub IoT para armazenar as mensagens do dispositivo IoT Edge no Serviço de Tabela, que você criou no capítulo anterior.

Primeiro, você precisa criar um arquivo que permita que sua função do Azure carregue as bibliotecas necessárias.

  1. Abra o Bloco de Notas (pressione a tecla Windows e digite bloco de notas).

    Abra o bloco de notas

  2. Com o Bloco de Notas aberto, insira a estrutura JSON abaixo nele. Depois de fazer isso, salve-o em sua área de trabalho como project.json. Esse arquivo define as bibliotecas que sua função usará. Se você tiver usado o NuGet, ele parecerá familiar.

    Aviso

    É importante que a nomenclatura esteja correta; certifique-se de que NÃO tenha uma extensão de arquivo .txt . Veja abaixo para referência:

    Salvamento JSON

    {
    "frameworks": {
        "net46":{
        "dependencies": {
            "WindowsAzure.Storage": "9.2.0"
        }
        }
    }
    }
    
  3. Faça logon no Portal do Azure.

  4. Depois de fazer logon, clique em Criar um recurso no canto superior esquerdo, pesquise Aplicativo de Funções e pressione a tecla Enter para pesquisar. Clique em Aplicativo de Funções nos resultados para abrir um novo painel.

    Pesquisar por aplicativo de funções

  5. O novo painel fornecerá uma descrição do Serviço de Aplicativo de Funções. Na parte inferior esquerda deste painel, clique no botão Criar para criar uma associação com este Serviço.

    Instância do aplicativo de funções

  6. Depois de clicar em Criar, preencha o seguinte:

    1. Em Nome do aplicativo, insira o nome desejado para essa instância de serviço.

    2. Selecione uma Assinatura.

    3. Selecione o tipo de preço apropriado para você, se esta for a primeira vez que cria um Serviço de Aplicativo de Funções, uma camada gratuita deverá estar disponível para você.

    4. Escolha um grupo de recursos ou crie um novo. Um grupo de recursos fornece uma maneira de monitorar, controlar o acesso, provisionar e gerenciar a cobrança de uma coleção de ativos do Azure. É recomendável manter todos os Serviços do Azure associados a um único projeto (por exemplo, como esses cursos) em um grupo de recursos comum).

      Se você quiser ler mais sobre os Grupos de Recursos do Azure, siga este link sobre como gerenciar um Grupo de Recursos.

    5. Para SO, clique em Windows, pois essa é a plataforma pretendida.

    6. Selecione um Plano de Hospedagem (este tutorial está usando um Plano de Consumo.

    7. Selecione um local (escolha o mesmo local do armazenamento que você criou na etapa anterior)

    8. Para a seção Armazenamento , você deve selecionar o Serviço de Armazenamento criado na etapa anterior.

    9. Você não precisará do Application Insights neste aplicativo, portanto, sinta-se à vontade para deixá-lo desativado.

    10. Clique em Criar.

      Criar nova instância

  7. Depois de clicar em Criar, você terá que esperar que o Serviço seja criado, isso pode levar um minuto.

  8. Uma notificação será exibida no Portal assim que a instância de serviço for criada.

    nova notificação

  9. Clique na notificação, assim que a implantação for bem-sucedida (concluída).

  10. Clique no botão Ir para o recurso na notificação para explorar sua nova instância de serviço.

    Captura de tela que mostra a janela de notificação Implantação bem-sucedida. O botão Ir para o recurso está circulado em vermelho.

  11. No lado esquerdo do novo painel, clique no + ícone (mais) ao lado de Funções para criar uma nova função.

    Captura de tela que mostra a página Aplicativos de Funções. No menu à esquerda ao lado de Funções, o sinal de mais está circulado em vermelho.

  12. No painel central, a janela de criação de função aparecerá. Role para baixo e clique em Função personalizada.

    Captura de tela que mostra a parte inferior da janela de criação de função. A função personalizada está circulada em vermelho.

  13. Role para baixo na próxima página até encontrar o Hub IoT (Hub de Eventos) e clique nele.

    Captura de tela que mostra a caixa Hub de Eventos do Hub do I O T circulada em vermelho.

  14. Na folha Hub IoT (Hub de Eventos), defina o Idioma como C# e clique em novo.

    Captura de tela que mostra a página Nova função. C sustenido é selecionado no campo Idioma. Novo é circulado em vermelho ao lado da opção de conexão do Hub de Eventos.

  15. Na janela exibida, verifique se o Hub IoT está selecionado e se o nome do campo Hub IoT corresponde ao nome do Serviço do Hub IoT que você criou anteriormente (na etapa 8, do Capítulo 3). Em seguida, clique no botão Selecionar .

    Captura de tela que mostra a guia do hub IOT aberta. Os campos Hub de I O T e Ponto final são circulados em vermelho.

  16. De volta à folha Hub IoT (Hub de Eventos), clique em Criar.

    Captura de tela que mostra a página Nova função. O botão Criar está circulado em vermelho na parte inferior da página.

  17. Você será redirecionado para o editor de funções.

    Captura de tela que mostra a página do editor de funções. A função é selecionada no menu à esquerda.

  18. Exclua todo o código nele e substitua-o pelo seguinte:

    #r "Microsoft.WindowsAzure.Storage"
    #r "NewtonSoft.Json"
    
    using System;
    using Microsoft.WindowsAzure.Storage;
    using Microsoft.WindowsAzure.Storage.Table;
    using Newtonsoft.Json;
    using System.Threading.Tasks;
    
    public static async Task Run(string myIoTHubMessage, TraceWriter log)
    {
        log.Info($"C# IoT Hub trigger function processed a message: {myIoTHubMessage}");
    
        //RowKey of the table object to be changed
        string tableName = "IoTMessages";
        string tableURL = "https://iothubmrstorage.table.core.windows.net/IoTMessages";
    
        // If you did not name your Storage Service as suggested in the course, change the name here with the one you chose.
        string storageAccountName = "iotedgestor"; 
    
        string storageAccountKey = "<Insert your Storage Key here>";   
    
        string partitionKey = "PK_IoTMessages";
        string rowKey = "RK_1_IoTMessages";
    
        Microsoft.WindowsAzure.Storage.Auth.StorageCredentials storageCredentials =
            new Microsoft.WindowsAzure.Storage.Auth.StorageCredentials(storageAccountName, storageAccountKey);
    
        CloudStorageAccount storageAccount = new CloudStorageAccount(storageCredentials, true);
    
        // Create the table client.
        CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
    
        // Get a reference to a table named "IoTMessages"
        CloudTable messageTable = tableClient.GetTableReference(tableName);
    
        //Retrieve the table object by its RowKey
        TableOperation operation = TableOperation.Retrieve<MessageEntity>(partitionKey, rowKey);
        TableResult result = await messageTable.ExecuteAsync(operation);
    
        //Create a MessageEntity so to set its parameters
        MessageEntity messageEntity = (MessageEntity)result.Result;
    
        messageEntity.MessageContent = myIoTHubMessage;
        messageEntity.PartitionKey = partitionKey;
        messageEntity.RowKey = rowKey;
    
        //Replace the table appropriate table Entity with the value of the MessageEntity Ccass structure.
        operation = TableOperation.Replace(messageEntity);
    
        // Execute the insert operation.
        await messageTable.ExecuteAsync(operation);
    }
    
    // This MessageEntity structure which will represent a Table Entity
    public class MessageEntity : TableEntity
    {
        public string Type { get; set; }
        public string MessageContent { get; set; }   
    }
    
  19. Altere as seguintes variáveis, para que correspondam aos valores apropriados (valores de Tabela e Armazenamento , das etapas 11 e 13, respectivamente, do Capítulo 11), que você encontrará em sua Conta de Armazenamento:

    • tableName, com o nome da Tabela localizada na Conta de Armazenamento.
    • tableURL, com a URL da Tabela localizada na Conta de Armazenamento.
    • storageAccountName, com o nome do valor correspondente ao nome da sua Conta de Armazenamento.
    • storageAccountKey, com a chave obtida no Serviço de Armazenamento criado anteriormente.

    Captura de tela que mostra o prompt de comando. As linhas 15, 16, 19 e 21 estão circuladas em vermelho.

  20. Com o código no lugar, clique em Salvar.

  21. Em seguida, clique no < ícone (seta), no lado direito da página.

    Captura de tela que mostra a página Aplicativos de Funções.

  22. Um painel deslizará pela direita. Nesse painel, clique em Carregar e um Navegador de Arquivos aparecerá.

  23. Navegue até o arquivo project.json e clique nele que você criou no Bloco de Notas anteriormente e clique no botão Abrir . Esse arquivo define as bibliotecas que sua função usará.

    Captura de tela que mostra o botão de upload circulado em vermelho em Exibir arquivos. No Navegador de arquivos, project dot jason é selecionado.

  24. Quando o arquivo for carregado, ele aparecerá no painel à direita. Clicar nele irá abri-lo no Editor de funções . Deve ser exatamente igual à próxima imagem.

    Captura de tela que mostra a página Aplicativos de Funções. Integrar no menu à esquerda está circulado em vermelho.

  25. Neste ponto, seria bom testar a capacidade de sua função de armazenar a mensagem em sua tabela. No canto superior direito da janela, clique em Testar.

    Captura de tela que mostra a página Aplicativos de Funções. Teste no canto superior direito e o botão Executar no canto inferior esquerdo estão circulados em vermelho.

  26. Insira uma mensagem no corpo da solicitação, conforme mostrado na imagem acima, e clique em Executar.

  27. A função será executada, exibindo o status do resultado (você notará o status verde 202 Aceito, acima da janela Saída, o que significa que foi uma chamada bem-sucedida):

    resultado da saída

Capítulo 14 - Ver mensagens ativas

Se você abrir o Visual Studio (não o Visual Studio Code), poderá visualizar o resultado da mensagem de teste, pois ele será armazenado na área de cadeia de caracteres MessageContent .

Captura de tela que mostra a guia Tabela de Mensagens I O T aberta no Microsoft Visual Studio.

Com o Serviço de Tabela e o Aplicativo de Funções em vigor, as mensagens do dispositivo Ubuntu aparecerão na Tabela IoTMessages . Se ainda não estiver em execução, inicie o dispositivo novamente e você poderá ver as mensagens de resultado do dispositivo e do módulo, dentro da tabela, usando o Visual Studio Cloud Explorer.

Visualizar dados

Capítulo 15 – Instalação do Power BI

Para visualizar os dados do seu dispositivo IOT, você configurará o Power BI (versão desktop) para coletar os dados do Serviço de Tabela, que você acabou de criar. A versão do HoloLens do Power BI usará esses dados para visualizar o resultado.

  1. Abra a Microsoft Store no Windows 10 e procure por Power BI Desktop.

    Captura de tela que mostra a janela da Microsoft Store. O Power B I é inserido na barra de pesquisa e o Power B I Desktop é circulado em vermelho.

  2. Baixe o aplicativo. Assim que terminar o download, abra-o.

  3. Faça logon no Power BI com sua conta do Microsoft 365. Você pode ser redirecionado para um navegador para se inscrever. Depois de se inscrever, volte para o aplicativo do Power BI e entre novamente.

  4. Clique em Obter dados e, em seguida, clique em Mais....

    Captura de tela que mostra o Power B I Desktop. Mais está circulado em vermelho no menu suspenso Obter Dados.

  5. Clique em Azure, Armazenamento de Tabelas do Azure e clique em Conectar.

    Captura de tela que mostra a janela Obter Dados. O Armazenamento de Tabelas do Azure está selecionado na opção de menu do Azure. O botão Conectar no canto inferior direito está circulado em vermelho.

  6. Você será solicitado a inserir a URL da Tabela coletada anteriormente (na etapa 13 do Capítulo 11) ao criar o Serviço de Tabela. Após inserir a URL, exclua a parte do caminho referente à "subpasta" da Tabela (que era IoTMessages, neste curso). O resultado final deve ser o exibido na imagem abaixo. Em seguida, clique em OK.

    Captura de tela que mostra a caixa de diálogo Armazenamento de Tabelas do Azure. A U R L é inserido no campo Nome da conta ou U R L.

  7. Você será solicitado a inserir a Chave de Armazenamento que anotou (na etapa 11 do Capítulo 11) anteriormente ao criar seu Armazenamento de Tabelas. Em seguida, clique em Conectar.

    Captura de tela que mostra a página de chave da Conta de Armazenamento de Tabelas do Azure.

  8. Um Painel de Navegação será exibido, marque a caixa ao lado de sua Tabela e clique em Carregar.

    Captura de tela que mostra o painel Navegador. A caixa ao lado do arquivo de mensagem I O T está marcada.

  9. Sua tabela agora foi carregada no Power BI, mas requer uma consulta para exibir os valores nela. Para fazer isso, clique com o botão direito do mouse no nome da tabela localizada no painel CAMPOS no lado direito da tela. Em seguida, clique em Editar consulta.

    Captura de tela que mostra o painel Campos. A consulta de edição está circulada em vermelho no menu do botão direito do mouse em Mensagens IOT.

  10. Um Editor do Power Query será aberto como uma nova janela, exibindo sua tabela. Clique na palavra Gravar na coluna Conteúdo da tabela para visualizar o conteúdo armazenado.

    Captura de tela que mostra a janela do Editor do Power Query. Em Conteúdo, Registro é circulado em vermelho.

  11. Clique em Na tabela, no canto superior esquerdo da janela.

    Captura de tela que mostra a guia Converter no Editor do Power Query. No canto superior esquerdo, Na mesa está circulado em vermelho.

  12. Clique em Fechar e Aplicar.

    Captura de tela que mostra a guia inicial no Editor do Power Query. Fechar e aplicar está circulado em vermelho.

  13. Uma vez finalizada a carga da consulta, dentro do painel CAMPOS, no lado direito da tela, marque as caixas correspondentes aos parâmetros Nome e Valor, para visualizar o conteúdo da coluna MessageContent .

    Captura de tela que mostra o painel Campos. Em Mensagens IOT, Nome e Valor são verificados. Uma janela pop-up com as colunas Nome e Valor é circulada em vermelho.

  14. Clique no ícone de disco azul no canto superior esquerdo da janela para salvar seu trabalho em uma pasta de sua escolha.

    Captura de tela que mostra o Power B I Desktop. O disco azul no canto superior esquerdo está circulado em vermelho. A caixa de diálogo Salvar como está aberta e o botão Salvar está circulado em vermelho.

  15. Agora você pode clicar no botão Publicar para carregar sua tabela em seu espaço de trabalho. Quando solicitado, clique em Meu espaço de trabalho e clique em Selecionar. Aguarde até que ele exiba o resultado bem-sucedido do envio.

    Captura de tela que mostra Publicar circulado em vermelho. Na caixa de diálogo Publicar no Power B I, Meu workspace está selecionado em Selecionar um destino.

    Captura de tela que mostra uma notificação indicando que a publicação no Power B I foi um sucesso.

Aviso

O capítulo a seguir é específico do HoloLens. No momento, o Power BI não está disponível como um aplicativo imersivo, no entanto, você pode executar a versão da área de trabalho no Portal do Windows Mixed Reality (também conhecido como Cliff House), por meio do aplicativo da área de trabalho.

Capítulo 16 – Exibir dados do Power BI no HoloLens

  1. Em seu HoloLens, faça logon na Microsoft Store, tocando em seu ícone na lista de aplicativos.

    Tela do Holo Lens que mostra um círculo vermelho ao redor do ícone da Microsoft Store em uma janela de navegação.

  2. Pesquise e baixe o aplicativo do Power BI .

    Visor Holo Lens que mostra a página da Microsoft Store. A ferramenta de rolagem é selecionada e o poder B I é inserido na barra de pesquisa.

  3. Inicie o Power BI na lista de aplicativos.

  4. O Power BI pode solicitar que você faça logon em sua conta do Microsoft 365.

  5. Uma vez dentro do aplicativo, o espaço de trabalho deve ser exibido por padrão, conforme mostrado na imagem abaixo. Se isso não acontecer, basta clicar no ícone do espaço de trabalho no lado esquerdo da janela.

    Tela do Holo Lens que mostra a página do Microsoft Power BI. A ferramenta Arrastar é selecionada na parte superior. O ícone da área de trabalho, que se assemelha a uma figura, está circulado em vermelho. I O T Edge A tabela em Relatórios está circulada em vermelho.

Seu aplicativo Hub IoT terminou

Parabéns, você criou com êxito um Serviço de Hub IoT, com um dispositivo de Borda de Máquina Virtual simulado. Seu dispositivo pode comunicar os resultados de um modelo de aprendizado de máquina a um Serviço de Tabela do Azure, facilitado por um Aplicativo de Funções do Azure, que é lido no Power BI e visualizado em um Microsoft HoloLens.

Tela do Holo Lens que mostra a página do Microsoft Power BI.

Exercícios de bônus

Exercício 1

Expanda a estrutura de mensagens armazenada na tabela e exiba-a como um gráfico. Talvez você queira coletar mais dados e armazená-los na mesma tabela, para serem exibidos posteriormente.

Exercício 2

Crie um módulo adicional de "captura de câmera" a ser implantado na placa IoT, para que ele possa capturar imagens através da câmera a ser analisada.