HoloLens (1º gênero) e Azure 313: IoT Hub Service

Nota

Os tutoriais da Mixed Reality Academy foram desenhados com HoloLens (1º género) e Auscultadores Imersivos de Realidade Mista em mente. Como tal, sentimos que é importante deixar estes tutoriais no lugar para os desenvolvedores que ainda estão à procura de orientação no desenvolvimento para esses dispositivos. Estes tutoriais não serão atualizados com os mais recentes instrumentos ou interações a serem utilizados para HoloLens 2. Serão mantidos para continuar a trabalhar nos dispositivos suportados. Haverá uma nova série de tutoriais que serão publicados no futuro que demonstrarão como se desenvolver para HoloLens 2. Este aviso será atualizado com um link para esses tutoriais quando forem publicados.

resultado do curso

Neste curso, você vai aprender a implementar um Azure IoT Hub Service em uma máquina virtual que executa o sistema operativo Ubuntu 16.4. Uma App de Função Azure será então usada para receber mensagens do seu VM Ubuntu e armazenar o resultado dentro de um Serviço de Mesa Azure. Em seguida, poderá visualizar estes dados utilizando Power BI nos auscultadores Microsoft HoloLens ou imersivos (VR).

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

Ao concluir este curso, aprenderá a:

  • Coloque um módulo IoT Edge numa Máquina Virtual (Ubuntu 16 OS), que representará o seu dispositivo IoT.
  • Adicione um Modelo de Tensorflow de Visão Personalizada Azure ao módulo Edge, com código que analisará as imagens armazenadas no recipiente.
  • Configurar o módulo para enviar a mensagem de resultados de análise de volta ao seu Serviço IoT Hub.
  • Utilize uma App de função Azure para armazenar a mensagem dentro de uma Tabela Azure.
  • Configurar Power BI para recolher a mensagem armazenada e criar um relatório.
  • Visualize os seus dados de mensagens IoT dentro de Power BI.

Os Serviços que utilizará incluem:

  • O Azure IoT Hub é um Serviço de Microsoft Azure que permite aos desenvolvedores conectar, monitorizar e gerir ativos IoT. Para mais informações, visite a página de Serviço Azure IoT Hub.

  • O Registo de Contentores Azure é um Serviço de Microsoft Azure que permite aos desenvolvedores armazenar imagens de contentores, para vários tipos de contentores. Para mais informações, visite a página do Serviço de Registo de Contentores Azure.

  • A Azure Function App é um Serviço de Microsoft Azure, que permite aos desenvolvedores executar pequenas peças de código, 'funções', em Azure. Isto fornece uma maneira de delegar o trabalho na nuvem, em vez da sua aplicação local, que pode ter muitos benefícios. A Azure Functions suporta várias línguas de desenvolvimento, incluindo C#, F#, Node.js, Java e PHP. Para mais informações, visite a página Azure Functions.

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

Este curso irá ensiná-lo a configurar e usar o Serviço IoT Hub e, em seguida, visualizar uma resposta fornecida por um dispositivo. Cabe-lhe a si aplicar estes conceitos a uma configuração personalizada do IoT Hub Service, que poderá estar a construir.

Suporte de dispositivos

Curso HoloLens Auscultadores imersivos
MR e Azure 313: IoT Hub Service ✔️ ✔️

Pré-requisitos

Para os pré-requisitos mais atualizados para o desenvolvimento com Realidade Mista, incluindo com a Microsoft HoloLens, visite o artigo ferramentas instalar.

Nota

Este tutorial é projetado para desenvolvedores que têm experiência básica com Python. Tenha também em atenção que os pré-requisitos e instruções escritas neste documento representam o que foi testado e verificado no momento da escrita (julho de 2018). É livre de utilizar o software mais recente, tal como listado dentro do artigo de instalação, embora não deva presumir-se que as informações neste curso irão perfeitamente corresponder ao que encontrará em software mais recente do que o listado abaixo.

São necessários os seguintes hardware e software:

  • Windows 10 Fall Creators Update (ou mais tarde), Modo de Desenvolvimento ativado

    Aviso

    Não é possível executar uma Máquina Virtual utilizando o Hyper-V na Windows 10 Home Edition.

  • Windows 10 SDK (versão mais recente)

  • Um HoloLens, modo de desenvolvimento ativado

  • Visual Studio 2017.15.4 (Apenas utilizado para aceder ao Azure Cloud Explorer)

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

  • Um modelo de aprendizagem automática. Se não tiver o seu próprio modelo pronto a usar, pode utilizar o modelo fornecido com este curso.

  • Software hiper-V ativado na sua máquina de desenvolvimento Windows 10.

  • Uma Máquina Virtual que executa Ubuntu (16.4 ou 18.4), a funcionar na sua máquina de desenvolvimento ou, em alternativa, pode utilizar um computador separado que executa o Linux (Ubuntu 16.4 ou 18.4). Pode encontrar mais informações sobre como criar um VM na Windows utilizando o Hyper-V no capítulo "Antes de iniciar".

Antes de começar

  1. Prepara e testa a tua HoloLens. Se precisar de apoio para configurar o seu HoloLens, visite o artigo de configuração HoloLens.
  2. É uma boa ideia executar a calibração e a sintonização sensora quando começar a desenvolver uma nova aplicação HoloLens (por vezes pode ajudar a executar essas tarefas para cada utilizador).

Para obter ajuda na Calibração, siga este link para o artigo de calibração HoloLens.

Para obter ajuda no Sensor Afinação, siga este link para o artigo de Afinação de Sensores HoloLens.

  1. Configurar a sua Máquina Virtual Ubuntu utilizando o Hyper-V. Os seguintes recursos irão ajudá-lo com o processo.

    1. Primeiro, siga este link para baixar o Ubuntu 16.04.4 LTS (Xenial Xerus) ISO. Selecione a imagem de secretária do PC de 64 bits (AMD64).
    2. Certifique-se de que o Hiper-V está ativado na sua máquina Windows 10. Pode seguir este link para obter orientações sobre a instalação e ativação do Hiper-V no Windows 10.
    3. Inicie o Hyper-V e crie um novo Ubuntu VM. Pode seguir este link para um guia passo a passo sobre como criar um VM com Hyper-V. Quando solicitado para "Instalar um sistema operativo a partir de um ficheiro de imagem bootable",selecione o Ubuntu ISO que descarregou anteriormente.

    Nota

    Não é sugerido o uso de Hyper-V Quick Create.

Capítulo 1 - Recuperar o modelo de visão personalizada

Com este curso terá acesso a um modelo de Visão Personalizada pré-construído que deteta teclados e ratos a partir de imagens. Se o utilizar, dirija-se ao Capítulo 2.

No entanto, pode seguir estes passos se desejar utilizar o seu próprio modelo de Visão Personalizada:

  1. No seu Project De Visão Personalizada aceda ao separador Performance.

    Aviso

    O seu modelo deve utilizar um domínio compacto para exportar o modelo. Pode alterar o domínio dos seus modelos nas definições do seu projeto.

    separador de desempenho

  2. Selecione a Iteração que pretende exportar e clique em Exportação. Aparecerá uma lâmina.

    lâmina de exportação

  3. Na lâmina clique no Ficheiro Docker.

    selecione estivador

  4. Clique em Linux no menu suspenso e clique em Baixar.

    Clique em baixar

  5. Desaperte o conteúdo. Vai usá-lo mais tarde neste curso.

Capítulo 2 - Serviço de Registo de Contentores

O Serviço de Registo de Contentores é o repositório utilizado para hospedar os seus contentores.

O Serviço IoT Hub que irá construir e utilizar neste curso refere-se ao Serviço de Registo de Contentores para obter os contentores para implantar no seu Dispositivo Edge.

  1. Primeiro, siga este link para o Portal Azuree faça login com as suas credenciais.

  2. Vá para criar um recurso e procure o Registo de Contentores.

    registo de contentores

  3. Clique em Criar.

  4. Desa estação os parâmetros de configuração do Serviço:

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

    2. Escolha um Grupo de Recursos ou crie um novo. Um grupo de recursos fornece uma forma de monitorizar, controlar o acesso, a prestação e gerir, faturando para uma cobrança de ativos Azure. Recomenda-se manter todos os Serviços Azure associados a um único projeto (por exemplo, como estes cursos) sob um grupo de recursos comuns).

    3. Desa estação a localização do Serviço.

    4. Definir o utilizador de administração para ativar.

    5. Desa estale o SKU para o básico.

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

  6. Assim que a notificação aparecer informando-o da criação bem sucedida do Registo de Contentores,clique em Ir ao recurso para ser redirecionado para a sua página de Serviço.

  7. Na página 'Serviço de Registo de Contentores', clique nas teclas de acesso.

  8. Tome nota (pode utilizar o seu Bloco de notas) dos seguintes parâmetros:

    1. Servidor de Login
    2. Nome de Utilizador
    3. Palavra-passe

Capítulo 3 - O Serviço IoT Hub

Agora iniciará a criação e configuração do seu Serviço IoT Hub.

  1. Se ainda não tiver assinado, faça login no Portal Azure.

  2. Uma vez iniciado o login, clique em Criar um recurso no canto superior esquerdo, e procure por IoT Hub,e clique em Enter.

pesquisa para conta de armazenamento

  1. A nova página fornecerá uma descrição do Serviço de Conta Armazenamento. Na parte inferior esquerda deste pedido, clique no botão Criar, para criar uma instância deste Serviço.

    criar caso de armazenamento

  2. Uma vez clicado no Criar,aparecerá um painel:

    1. Escolha um Grupo de Recursos ou crie um novo. Um grupo de recursos fornece uma forma de monitorizar, controlar o acesso, fornecer e gerir a faturação para uma recolha de ativos da Azure. Recomenda-se manter todos os Serviços Azure associados a um único projeto (por exemplo, como estes cursos) sob um grupo de recursos comuns).

      Se desejar ler mais sobre os Grupos de Recursos Azure, por favor siga este link sobre como gerir um Grupo de Recursos.

    2. Selecione uma localização adequada (Utilize a mesma localização em todos os Serviços que criar neste curso).

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

  3. Na parte inferior da página clique em Seguinte: Tamanho e escala.

    criar caso de armazenamento

  4. Nesta página, selecione o seu preço e nível de escala (se esta for a sua primeira instância de Serviço IoT Hub, deve estar disponível um nível gratuito para si).

  5. Clique em Comentário + Criar.

    criar caso de armazenamento

  6. Reveja as suas definições e clique em Criar.

    criar caso de armazenamento

  7. Assim que a notificação aparecer informando-o da criação bem sucedida do Serviço IoT Hub, clique em Ir para o recurso a ser redirecionado para a sua página de Serviço.

    criar caso de armazenamento

  8. Desloque o painel lateral à esquerda até ver a Gestão Automática do Dispositivo,clique no IoT Edge.

    criar caso de armazenamento

  9. Na janela que aparece à direita, clique no Dispositivo De Borda IoT. Uma lâmina aparecerá à direita.

  10. Na lâmina, forneça ao seu novo dispositivo um ID do dispositivo (um nome à sua escolha). Em seguida, clique em Guardar. As teclas primárias e secundárias gerarão automaticamente, se tiver uma produção automática.

    criar caso de armazenamento

  11. Irá navegar de volta para a secção IoT Edge Devices, onde o seu novo dispositivo será listado. Clique no seu novo dispositivo (delineado a vermelho na imagem abaixo).

    criar caso de armazenamento

  12. Na página 'Detalhes do Dispositivo' que aparece, pegue uma cópia da cadeia de ligação (tecla primária).

    criar caso de armazenamento

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

  14. Na página que aparece, clique em iothubowner, e uma lâmina aparecerá à direita do ecrã.

  15. Tome nota (na sua Bloco de notas) da cadeia de ligação (tecla primária), para posterior utilização ao definir a cadeia de ligação para o seu dispositivo.

    criar caso de armazenamento

Capítulo 4 - Criação do ambiente de desenvolvimento

Para criar e implantar módulos para ioT Hub Edge,irá necessitar dos seguintes componentes instalados na sua máquina de desenvolvimento em funcionamento Windows 10:

  1. Docker para Windows, vai pedir-lhe para criar uma conta para ser capaz de descarregar.

    descarregar estivador para janelas

    Importante

    Docker exige Windows 10 PRO, Enterprise 14393,ou Windows Server 2016 RTM,para executar. Se estiver a executar outras versões de Windows 10, pode tentar instalar o Docker utilizando a Caixa de Ferramentas Docker.

  2. Python 3.6.

    baixar python 3.6

  3. Visual Studio Código (também conhecido como Código VS).

    descarregar Código VS

Depois de instalar o software acima mencionado, terá de reiniciar a sua máquina.

Capítulo 5 - Criação do ambiente Ubuntu

Agora pode passar a configurar o seu dispositivo que executa o Ubuntu OS. Siga os passos abaixo, para instalar o software necessário, para colocar os seus recipientes na sua prancha:

Importante

Deve sempre preceder os comandos terminais com sudo para funcionar como utilizador administrativo. ou seja:

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

    [! SUGESTÃO] Pode abrir o Terminal muito facilmente através do atalho do teclado: Ctrl + Alt + T.

        sudo apt-get install python-pip
    
  2. Ao longo deste Capítulo, poderá ser solicitado, pelo Terminal,permissão para utilizar o armazenamento do seu dispositivo, e para que possa inserir y/n (sim ou não), escreva 'y'e, em seguida, prima a tecla Entrar, para aceitar.

  3. Uma vez concluído o comando, utilize o seguinte comando para instalar o curl:

        sudo apt install curl
    
  4. Uma vez instalados pip e caracóis, utilize o seguinte comando para instalar o tempo de funcionamento do IoT Edge,isto é necessário para implantar e controlar os módulos na 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, será solicitado que abra o ficheiro config de tempo de execução,para inserir a Cadeia de Ligaçãodo Dispositivo , que anotou (no seu Bloco de notas), ao criar o Serviço IoT Hub(na etapa 14, do Capítulo 3). Executar a seguinte linha no terminal para abrir o ficheiro:

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

    Aviso

    Quando este ficheiro abre, pode ser um pouco confuso. Estará a editar este ficheiro por sms, dentro do próprio Terminal.

    1. Utilize as teclas de seta do teclado para deslocar para baixo (terá de deslocar-se para baixo um pouco), para chegar à linha que contém":

      " ADICIONE A > CADEIA DE LIGAÇÃO DO DISPOSITIVO AQUI".

    2. Linha de substituição, incluindo os suportes,com a cadeia de ligação do dispositivo que já observou anteriormente.

  7. Com a sua cadeia de ligação no lugar, no seu teclado, prima as teclas Ctrl-X para guardar o ficheiro. Pedir-lhe-á que confirme ingindo Y. Em seguida, prima a tecla Enter, para confirmar. Vai voltar para o Terminal Regular.

  8. Uma vez que todos estes comandos tenham funcionado com sucesso, terá instalado o IoT Edge Runtime. Uma vez inicializado, o tempo de funcionaamento começará por si só sempre que o dispositivo é ligado, e sentar-se-á em segundo plano, à espera que os módulos sejam implantados a partir do Serviço IoT Hub.

  9. Executar a seguinte linha de comando para rubricar o tempo de execução IoT Edge:

        sudo systemctl restart iotedge
    

    Importante

    Se esporár alterações no seu ficheiro .yaml ou na configuração acima, terá de voltar a executar a linha de reinício acima, dentro do Terminal.

  10. Verifique o estado de execução do IoT Edge executando a seguinte linha de comando. O tempo de funcionamento deve aparecer com o estado ativo (em execução) em texto verde.

        sudo systemctl status iotedge
    
  11. Pressione as teclas Ctrl-C para sair da página de estado. Pode verificar se o tempo de funcionamento do IoT Edge está a puxar corretamente os recipientes, digitando o seguinte comando:

        sudo docker ps
    
  12. Deve aparecer uma lista com dois (2) recipientes. Estes são os módulos predefinidos que são automaticamente criados pelo IoT Hub Service (edgeAgent e edgeHub). Assim que criar e implementar os seus próprios módulos, eles aparecerão nesta lista, por baixo dos predefinidos.

Capítulo 6 - Instalar as extensões

Importante

Os próximos Capítulos (6-9) serão realizados na sua máquina Windows 10.

  1. Código VS Aberto.

  2. Clique no botão Extensões (quadrada) na barra esquerda do Código VS, para abrir o painel de extensões.

  3. Procurar e instalar as seguintes extensões (como mostrado na imagem abaixo):

    1. Azure IoT Edge
    2. Toolkit do IoT do Azure
    3. Docker

    Crie o seu recipiente

  4. Uma vez instaladas as extensões, feche e reabram o Código VS.

  5. Com o Código VS aberto mais uma vez, navegue para ver oterminal integrado.

  6. Irá agora instalar cookiecutter. No terminal, o seguinte comando de bash:

        pip install --upgrade --user cookiecutter
    

    [! DICA] Se tiver problemas com este comando:

    1. Reinicie o Código VS e/ou o seu computador.
    2. Pode ser necessário mudar o Terminal de Código VS para o que tem usado para instalar python, ou seja, Powershell (especialmente no caso de o ambiente Python já estar instalado na sua máquina). Com o Terminal aberto, encontrará o menu drop down no lado direito do Terminal. Crie o seu recipiente
    3. Certifique-se de que o caminho de instalação python é adicionado como Variável ambiente na sua máquina. Cookiecutter deve fazer parte do mesmo caminho de localização. Siga este link para mais informações sobre variáveis ambientais,
  7. Uma vez que o Cookiecutter tenha terminado a instalação, deverá reiniciar a sua máquina, de modo a que o Cookiecutter seja reconhecido como um comando, dentro do ambiente do seu Sistema.

Capítulo 7 - Crie a sua solução de contentor

Neste ponto, é necessário criar o recipiente, com o módulo, para ser empurrado para o Registo do Contentor. Depois de ter empurrado o seu recipiente, utilizará o Serviço IoT Hub Edge para o colocar no seu dispositivo, que está a executar o tempo de funcionamento do IoT Edge.

  1. A partir do Código VS, clique napaleta de Comando ver.

  2. Na paleta, procure e corra Azure IoT Edge: New Iot Edge Solution.

  3. Navegue para um local onde pretenda criar a sua solução. Prima a tecla 'Inserir', para aceitar a localização.

  4. Dê um nome à sua solução. Prima a tecla 'Inserir', para confirmar o seu nome fornecido.

  5. Agora será solicitado que escolha a estrutura do modelo para a sua solução. Clique no Módulo Python. Prima a tecla 'Entrar' para confirmar esta escolha.

  6. Dê um nome ao seu módulo. Prima a tecla 'Inserir', para confirmar o nome do seu módulo. Certifique-se de tomar uma nota (com a sua Bloco de notas) do nome do módulo, uma vez que é usado mais tarde.

  7. Irá notar que um endereço de repositório de imagem de Docker pré-construído aparecerá na paleta. Vai parecer:

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

  8. Elimine o local:5000,e no seu lugar insira o endereçodo Servidor de Registo de Registo de Contentores,que observou ao criar o Serviço de Registo de Contentores(no passo 8, do Capítulo 2). Prima a tecla 'Inserir', para confirmar o endereço.

  9. Neste ponto, será criada a solução que contém o modelo do seu módulo Python e a sua estrutura será exibida no Separador Explore, do Código VS, no lado esquerdo do ecrã. Se o Separador Explore não estiver aberto, pode abri-lo clicando no botão mais alto, na barra à esquerda.

    Crie o seu recipiente

  10. O último passo para este Capítulo é clicar e abrir o ficheiro .env, a partir do separador Explore,e adicionar o seunome de utilizador e senhado registo de contentores. Este ficheiro é ignorado pelo git, mas ao construir o contentor, definirá as credenciais para aceder ao Serviço de Registo de Contentores.

    Crie o seu recipiente

Capítulo 8 - Edição da sua solução de contentor

Irá agora completar a solução de recipiente, atualizando os seguintes ficheiros:

  • principal .py escrita python.
  • requirements.txt.
  • deployment.template.json.
  • Dockerfile.amd64

Em seguida, criará a pasta de imagens, utilizada pelo script python para verificar se as imagens correspondem ao seu modelo de Visão Personalizada. Por último, irá adicionar o ficheiro labels.txt, para ajudar a ler o seu modelo, e o ficheiro model.pb, que é o seu modelo.

  1. Com o Código VS aberto, navegue para a pasta do módulo e procure o script chamado .py principal. Clique duas vezes para abri-lo.

  2. Eliminar o conteúdo do ficheiro e inserir 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 ficheiro chamado requirements.txt, e substitua o 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 ficheiro chamado deployment.template.jsone substitua o seu conteúdo seguindo a orientação abaixo:

    1. Como terá a sua própria estrutura JSON única, terá de editá-la à mão (em vez de copiar um exemplo). Para facilitar, use a imagem abaixo como guia.

    2. Áreas que serão diferentes das suas, mas que não deve alterar, são destacadas como amarelas.

    3. As secções que precisa de eliminar são um vermelho realçado.

    4. Tenha cuidado para eliminar os suportes corretos e também retire as vírgulas.

      Crie o seu recipiente

    5. O JSON completo deve parecer a seguinte imagem (no entanto, com as suas diferenças únicas: nome de utilizador/palavra-passe/nome do módulo/referências do módulo/módulo):

      Crie o seu recipiente

  5. Abra o ficheiro chamado Dockerfile.amd64,e substitua o 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 na pasta por baixo dos módulos (terá o nome que forneceu anteriormente; no exemplo mais abaixo, chama-se pythonmodule),e clique em Nova Pasta. Nomeie as imagensda pasta .

  7. Dentro da pasta, adicione algumas imagens que contenham rato ou teclado. Estas serão as imagens que serão analisadas pelo modelo Tensorflow.

    Aviso

    Se estiver a utilizar o seu próprio modelo, terá de alterar isto para refletir os dados dos seus próprios modelos.

  8. Terá agora de recuperar os ficheiros labels.txt e model.pb da pasta do modelo, que já descarregou (ou criou a partir do seu próprio Serviço de Visão Personalizada),no Capítulo 1. Assim que tiver os ficheiros, coloque-os dentro da sua solução, juntamente com os outros ficheiros. O resultado final deve parecer-se com a imagem abaixo:

    Crie o seu recipiente

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

  1. Está agora pronto para "embalar" os seus ficheiros como recipiente e empurrá-lo para o seu Registo de Contentores Azure. No Código VS, abra o Terminal Integrado(Ver Terminal Integrado ou Ctrl), e utilize a seguinte linha para iniciar sessão no Docker (substitua os valores do comando com as credenciais do seu Registo de Contentores Azure (ACR):

        docker login -u <ACR username> -p <ACR password> <ACR login server>
    
  2. Clique com o botão direito na implementação do ficheiro.template.jsone clique em Build IoT Edge Solution. Este processo de construção leva bastante tempo (dependendo do seu dispositivo), por isso esteja preparado para esperar. Após o fim do processo de construção, um ficheiro deployment.json terá sido criado dentro de uma nova pasta chamada config.

    criar implantação

  3. Abra novamente a Paleta de Comando e procure por Azure: Iniciar S.A. Siga as instruções utilizando as suas credenciais de Conta Azure; O Código VS irá fornecer-lhe uma opção para Copiar e Abrir, que irá copiar o código do dispositivo que em breve necessitará, e abrirá o seu navegador web padrão. Quando solicitado, cole o código do dispositivo para autenticar a sua máquina.

    copiar e abrir

  4. Uma vez assinado, você notará, na parte inferior do painel Explore, uma nova secção chamada Azure IoT Hub Devices. Clique nesta secção para expandi-la.

    dispositivo de borda

  5. Se o seu dispositivo não estiver aqui, terá de clicar à direita nos dispositivos do Hub IoT do Azuree, em seguida, clicar em set IoT Hub Connection String. Em seguida, verá que a Paleta de Comando (na parte superior do Código VS), irá instruí-lo a inserir a sua Cadeia de Ligação. Esta é a cadeia de ligação que anotado no final do Capítulo 3. Prima a tecla Enter, uma vez copiada a corda.

  6. O seu dispositivo deve carregar e aparecer. Clique com o botão direito no nome do dispositivo e, em seguida, clique em criar a implementação para um único dispositivo.

    criar implantação

  7. Receberá uma solicitação do Explorador de Ficheiros, onde pode navegar para a pasta config e, em seguida, selecionar o ficheiro deployment.json. Com este ficheiro selecionado, clique no botão Select Edge Deployment Manifest.

    criar implantação

  8. Neste momento, forneceu ao seu Serviço IoT Hub o manifesto para que este possa implantar o seu recipiente, como módulo, a partir do seu Registo de Contentores Azure,efetivamente implantando-o no seu dispositivo.

  9. Para visualizar as mensagens enviadas do seu dispositivo para o IoT Hub, clique com o botão direito novamente no nome do seu dispositivo na secção Azure IoT Hub Devices, no painel Explorer, e clique em Iniciar Monitorização D2C Mensagem D2C. As mensagens enviadas do seu dispositivo devem aparecer no Terminal VS. Tenha paciência, já que isto pode levar algum tempo. Consulte o próximo capítulo para depuração e verificar se a implementação foi bem sucedida.

Este módulo irá agora iterar entre as imagens na pasta de imagens e analisá-las, a cada iteração. Isto é obviamente apenas uma demonstração de como fazer com que o modelo básico de aprendizagem de máquinas funcione num ambiente de dispositivo IoT Edge.

Para expandir a funcionalidade deste exemplo, pode proceder de várias formas. Uma das formas pode ser incluir algum código no contentor, que captura fotos de uma webcam que está ligada ao dispositivo, e guarda as imagens na pasta de imagens.

Outra forma poderia ser copiar as imagens do dispositivo IoT para o recipiente. Uma forma prática de o fazer é executar o seguinte comando no Terminal de DispositivoS IoT (talvez uma pequena aplicação pudesse fazer o trabalho, se desejasse automatizar o processo). Pode testar este comando executando-o manualmente a partir do local da pasta onde os seus ficheiros estão armazenados:

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

Capítulo 10 - Depurar o tempo de execução da borda IoT

Segue-se uma lista de linhas de comando e dicas para o ajudar a monitorizar e a depurar a atividade de mensagens do IoT Edge Runtime, a partir do seu dispositivo Ubuntu.

  • Verifique o estado de execução do IoT Edge, executando a seguinte linha de comando:

        sudo systemctl status iotedge
    

    Nota

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

  • Lista os contentores que estão atualmente implantados. Se o Serviço IoT Hub tiver implantado os contentores com sucesso, serão exibidos executando a seguinte linha de comando:

        sudo iotedge list
    

    Ou

        sudo docker ps
    

    Nota

    O acima é uma boa forma de verificar se o seu módulo foi implementado com sucesso, como constará na lista; de outra forma, só verá o edgeHub e o edgeAgent.

  • Para visualizar os registos de código de um recipiente, executar a seguinte linha de comando:

        journalctl -u iotedge
    

Comandos úteis para gerir o tempo de execução IoT Edge:

  • Para eliminar todos os recipientes do hospedeiro:

        sudo docker rm -f $(sudo docker ps -aq)
    
  • Para parar o tempo de execução IoT Edge:

        sudo systemctl stop iotedge
    

Capítulo 11 - Criar serviço de mesa

Volte ao seu Portal Azure, onde irá criar um Serviço de Mesas Azure, criando um recurso Armazenamento.

  1. Se ainda não tiver assinado, faça login no Portal Azure.

  2. Uma vez iniciado o login, clique em Criar um recurso,no canto superior esquerdo, e procure Armazenamento conta, e prima a tecla Entrar, para iniciar a pesquisa.

  3. Uma vez que tenha aparecido, clique Armazenamento conta - blob, arquivo, tabela, fila da lista.

    pesquisa para conta de armazenamento

  4. A nova página fornecerá uma descrição do Serviço de Conta Armazenamento. Na parte inferior esquerda deste pedido, clique no botão Criar, para criar uma instância deste Serviço.

    criar caso de armazenamento

  5. Uma vez clicado no Criar,aparecerá um painel:

    1. Insira o nome pretendido para esta instância de Serviço(deve ser tudo maiúscula).

    2. Para o modelo de implementação,clique no gestor de recursos.

    3. Para o tipo de conta, utilizando o menu suspenso, clique Armazenamento (finalidade geral v1).

    4. Clique em uma localizaçãoapropriada.

    5. Para o menu de substituição de replicação, clique em Read-access-geo-redundante armazenamento (RA-GRS).

    6. Para desempenho, clique em Standard.

    7. Dentro da secção de transferência segura necessária, clique em Desativado.

    8. A partir do menu suspenso por assinatura, clique numa subscrição apropriada.

    9. Escolha um Grupo de Recursos ou crie um novo. Um grupo de recursos fornece uma forma de monitorizar, controlar o acesso, a prestação e gerir, faturando para uma cobrança de ativos Azure. Recomenda-se manter todos os Serviços Azure associados a um único projeto (por exemplo, como estes cursos) sob um grupo de recursos comuns).

      Se desejar ler mais sobre os Grupos de Recursos Azure, por favor siga este link sobre como gerir um Grupo de Recursos.

    10. Deixe as redes Virtuais como Desativadas,se esta for uma opção para si.

    11. Clique em Criar.

      preencher detalhes de armazenamento

  6. Uma vez clicado no Create,terá de esperar pela criação do Serviço, pode demorar um minuto.

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

    nova notificação de armazenamento

  8. Clique no botão 'Procurar' na notificação e será levado para a página geral da sua nova página de Armazenamento de serviço.

    ir para o recurso

  9. Da página geral, para o lado direito, clique em Tabelas.

    tabelas

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

    tabelas abertas

  11. Será mostrada uma nova página, na qual é necessário introduzir um nome de tabela. Este é o nome que utilizará para se referir aos dados da sua aplicação em Capítulos Posteriores (criando App de Função, e Power BI). Insira as ioTMesages como o nome (pode escolher o seu, basta lembrar-se quando usado mais tarde neste documento) e clique em OK.

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

    nova tabela criada

  13. Clique agora nas teclas Access e pegue uma cópia do nome da conta Armazenamento e chave (utilizando o seu Bloco de notas), utilizará estes valores mais tarde neste curso, ao criar a App de Função Azure.

    nova tabela criada

  14. Utilizando novamente o painel à esquerda, percorra a secção Serviço de Tabelas e clique em Tabelas (ou Tabelas de Navegação,em Portais mais recentes) e pegue numa cópia do URL da tabela (utilizando o seu Bloco de notas). Utilizará este valor mais tarde neste curso, ao ligar a sua mesa à sua aplicação Power BI.

    nova tabela criada

Capítulo 12 - Conclusão da Tabela Azul

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

  1. Abrir Visual Studio(não Visual Studio Código).

  2. A partir do menu, clique em VerCloud Explorer.

    explorador de nuvem aberta

  3. O Cloud Explorer abrir-se-á como um item ancorado (seja paciente, pois o carregamento pode demorar).

    Aviso

    Se a subscrição utilizada para criar as suas contas Armazenamento não estiver visível, certifique-se de que tem:

    • Inscreva-se na mesma conta que a que usou para o Portal Azure.

    • Selecionou a sua subscrição a partir da página De Gestão de Contas (pode ter de aplicar um filtro a partir das definições da sua conta):

      encontrar subscrição

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

    contas de armazenamento aberto

  5. Uma vez expandido, a sua conta de Armazenamento recém-criada deve estar disponível. Clique na seta à esquerda do seu armazenamento e, em seguida, uma vez expandido, encontre Tabelas e clique na seta ao lado, para revelar a Tabela que criou no último Capítulo. Clique duas vezes na tabela.

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

    adicionar nova tabela

  7. Aparecerá uma janela que lhe será pedida para adicionar a Entidade. Irá criar apenas uma entidade, embora tenha três propriedades. Irá notar que partitionKey e RowKey já estão fornecidos, uma vez que estes são utilizados pela tabela para encontrar os seus dados.

    divisória e chave de linha

  8. Atualizar os seguintes valores:

    • Nome: PartitionKey, Valor: PK_IoTMessages

    • Nome: RowKey, Valor: RK_1_IoTMessages

  9. Em seguida, clique em Adicionar propriedade (para a esquerda inferior da janela 'Entidade adicionar') e adicionar o seguinte imóvel:

    • MensagensContent,como uma corda,deixe o Valor vazio.
  10. A sua tabela deve corresponder à da imagem abaixo:

    adicionar valores corretos

    Nota

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

  11. Clique em OK quando terminar. A sua mesa está agora pronta para ser usada.

Capítulo 13 - Criar uma app de função Azure

É agora altura de criar uma App de Função Azure, que será chamada pelo Serviço IoT Hub para armazenar as mensagens de dispositivo IoT Edge no Serviço de Tabelas, que criou no Capítulo Anterior.

Em primeiro lugar, tem de criar um ficheiro que permita à sua Função Azure carregar as bibliotecas de que necessita.

  1. Abra Bloco de notas (prima a tecla Windowse escreva o bloco de notas).

    bloco de notas aberto

  2. Com Bloco de notas aberto, insira a estrutura JSON abaixo. Depois de o ter feito, guarde-o no seu ambiente de trabalho como project.json. Este ficheiro define as bibliotecas que a sua função irá utilizar. Se usou o NuGet, vai parecer familiar.

    Aviso

    É importante que o nome seja correto; certifique-se de que NÃO tem uma extensão de ficheiro .txt. Consulte abaixo para referência:

    JSON salvar

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

  4. Assim que iniciar sessão, clique em Criar um recurso no canto superior esquerdo e procurar app de função, e prima a tecla 'Entrar' e procurar. Clique em 'App' função a partir dos resultados, para abrir um novo painel.

    pesquisa de app de função

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

    instância de aplicação de função

  6. Uma vez clicado no Criar,preencha o seguinte:

    1. Para o nome da App,insira o nome pretendido para esta instância de Serviço.

    2. Selecione uma subscrição.

    3. Selecione o nível de preços apropriado para si, se esta for a primeira vez que cria um Serviço de Aplicações de Função,um nível gratuito deve estar disponível para si.

    4. Escolha um Grupo de Recursos ou crie um novo. Um grupo de recursos fornece uma forma de monitorizar, controlar o acesso, a prestação e gerir, faturando para uma cobrança de ativos Azure. Recomenda-se manter todos os Serviços Azure associados a um único projeto (por exemplo, como estes cursos) sob um grupo de recursos comuns).

      Se desejar ler mais sobre os Grupos de Recursos Azure, por favor siga este link sobre como gerir um Grupo de Recursos.

    5. Para os oses,clique Windows, pois esta é a plataforma pretendida.

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

    7. Selecione uma Localização (escolha o mesmo local que o armazenamento que construiu no passo anterior)

    8. Para a secção Armazenamento,deve selecionar o Serviço de Armazenamento que criou no passo anterior.

    9. Não vai precisar de Informações de aplicação nesta aplicação, por isso sinta-se à vontade para a deixar desligada.

    10. Clique em Criar.

      criar nova instância

  7. Uma vez clicado no Create,terá de esperar pela criação do Serviço, pode demorar um minuto.

  8. Uma notificação aparecerá no Portal assim que a instância de Serviço for criada.

    nova notificação

  9. Clique na notificação, uma vez que a implementação é bem sucedida (já terminou).

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

    ir para o recurso

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

    adicionar nova função

  12. Dentro do painel central, aparecerá a janela de criação de funções. Percorra ainda mais e clique na função Custom.

    função personalizada

  13. Percorra a página seguinte, até encontrar o IoT Hub (Event Hub)e, em seguida, clique nele.

    função personalizada

  14. Na lâmina IoT Hub (Event Hub), coloque o Idioma em C# e, em seguida, clique em novos.

    função personalizada

  15. Na janela que vai aparecer, certifique-se de que o IoT Hub está selecionado e o nome do campo IoT Hub corresponde ao nome do seu Serviço IoT Hub que criou anteriormente(passo 8, do Capítulo 3). Em seguida, clique no botão Selecione.

    função personalizada

  16. De volta à lâmina IoT Hub (Event Hub), clique em Criar.

    função personalizada

  17. Será redirecionado para o editor de funções.

    função personalizada

  18. Elimine 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, de modo a que correspondam aos valores adequados (Tabela e valores Armazenamento, dos passos 11 e 13, respectivamente, do Capítulo 11),que encontrará na sua Conta Armazenamento:

    • tableName,com o nome da sua Tabela localizada na sua Conta Armazenamento.
    • tableURL,com o URL da sua tabela localizado na sua Conta Armazenamento.
    • armazenamentoSamede contagem, com o nome do valor correspondente com o nome do seu Armazenamento Nome da Conta.
    • armazenamentoAccountKey, com a Chave que obteve no Serviço de Armazenamento que criou anteriormente.

    função personalizada

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

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

    função personalizada

  22. Um painel deslizará pela direita. Nesse painel, clique em Uploade aparecerá um Browser de Ficheiros.

  23. Navegue para e clique no ficheiro project.json, que criou em Bloco de notas anteriormente, e, em seguida, clique no botão Abrir. Este ficheiro define as bibliotecas que a sua função irá utilizar.

    função personalizada

  24. Quando o ficheiro tiver sido carregado, aparecerá no painel à direita. Clicar nele irá abri-lo dentro do editor de Função. Deve ser exatamente o mesmo que a próxima imagem.

    função personalizada

  25. Neste momento, seria bom testar a capacidade da sua Função para armazenar a mensagem na sua Tabela. No lado superior direito da janela, clique no Teste.

    função personalizada

  26. Insira uma mensagem no corpo 'Pedido',como mostra a imagem acima, e clique em Executar.

  27. A função será executada, exibindo o estado do resultado (irá notar o Status 202 Aceite,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 abrir agora Visual Studio(não Visual Studio Código), pode visualizar o resultado da sua mensagem de teste, uma vez que será armazenado na área da cadeia MessageContent.

função personalizada

Com a Aplicação de Serviço de Mesa e Função no lugar, as suas mensagens de dispositivo Ubuntu aparecerão na sua Tabela IoTMessages. Se ainda não estiver a funcionar, reinicie o seu dispositivo e poderá ver as mensagens de resultados do seu dispositivo e módulo, dentro da sua Tabela, através da utilização Visual Studio Cloud Explorer.

visualizar dados

Capítulo 15 - Configuração Power BI

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

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

    Power BI

  2. Descarregue a aplicação. Uma vez terminado o download, abra-o.

  3. Inicie sessão na Power BI com a sua conta Microsoft 365. Você pode ser redirecionado para um navegador, para se inscrever. Assim que estiver inscrito, volte à aplicação Power BI e inscreva-se novamente.

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

    Power BI

  5. Clique em Azure, Azure Table Armazenamento,em seguida, clique em Ligação.

    Power BI

  6. Será solicitado que insira o URL de tabela que recolheu anteriormente (no passo 13 do Capítulo 11),enquanto cria o seu Serviço de Tabela. Depois de inserir o URL, elimine a parte do caminho referente à "sub-pasta" da tabela (que era IoTMessages, neste curso). O resultado final deve ser apresentado na imagem abaixo. Em seguida, clique em OK.

    Power BI

  7. Será solicitado que insira a chave de Armazenamento que observou ( no passo11 do Capítulo 11) mais cedo, enquanto cria a sua tabela Armazenamento. Em seguida, clique em Ligação.

    Power BI

  8. Será apresentado um Painel de Navegador, marca a caixa ao lado da sua Tabela e clica na Carga.

    Power BI

  9. A sua mesa foi agora carregada em Power BI, mas requer uma consulta para mostrar os valores nele. Para tal, clique com o botão direito no nome da tabela localizado no painel FIELDS no lado direito do ecrã. Em seguida, clique em Editar Consulta.

    Power BI

  10. Um Editor de Consulta de Energia abrir-se-á como uma nova janela, exibindo a sua mesa. Clique na palavra Gravar dentro da coluna conteúdo da tabela, para visualizar o conteúdo armazenado.

    Power BI

  11. Clique em 'Para Dentro da Tabela'( no topo-esquerdo da janela).

    Power BI

  12. Clique em Fechar Aplicar.

    Power BI

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

    Power BI

  14. Clique no ícone do disco azul na parte superior esquerda da janela para guardar o seu trabalho numa pasta à sua escolha.

    Power BI

  15. Pode agora clicar no botão Publicar para fazer o upload da sua tabela para o seu Espaço de Trabalho. Quando solicitado, clique no meu espaço de trabalho e clique em Select. Aguarde que apresente o resultado bem sucedido da submissão.

    Power BI

    Power BI

Aviso

O capítulo seguinte é HoloLens específico. Power BI não está atualmente disponível como uma aplicação imersiva, no entanto pode executar a versão para desktop no Portal Windows Mixed Reality (também conhecido como Cliff House), através da aplicação Desktop.

Capítulo 16 - Mostrar Power BI dados sobre HoloLens

  1. Na sua HoloLens, inicie sessão no Microsoft Store,tocando no seu ícone na lista de aplicações.

    Power BI HL

  2. Procure e, em seguida, descarregue a aplicação Power BI.

    Power BI HL

  3. Comece Power BI da sua lista de candidaturas.

  4. Power BI pode pedir-lhe para iniciar sessão na sua conta Microsoft 365.

  5. Uma vez dentro da aplicação, o espaço de trabalho deve ser exibido por predefinição, como mostra a imagem abaixo. Se isso não acontecer, basta clicar no ícone do espaço de trabalho no lado esquerdo da janela.

    Power BI HL

Terminou a sua aplicação IoT Hub

Parabéns, criou com sucesso um Serviço IoT Hub, com um dispositivo virtual de borda de máquina simulado. O seu dispositivo pode comunicar os resultados de um modelo de machine learning a um Serviço de Mesa Azure, facilitado por uma App de Função Azure, que é lida em Power BI, e visualizada dentro de um Microsoft HoloLens.

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. É melhor recolher mais dados e armazená-lo na mesma tabela, para ser posteriormente exibido.

Exercício 2

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