MR e Azure 313: Servizio Hub IoTMR and Azure 313: IoT Hub Service

Nota

Le esercitazioni di Mixed Reality Academy sono state progettate in base a HoloLens (prima generazione) e ai visori VR immersive di realtà mista.The Mixed Reality Academy tutorials were designed with HoloLens (1st gen) and Mixed Reality Immersive Headsets in mind. Pertanto, riteniamo importante lasciarle a disposizione degli sviluppatori a cui serve ancora materiale sussidiario per lo sviluppo di questi dispositivi.As such, we feel it is important to leave these tutorials in place for developers who are still looking for guidance in developing for those devices. Queste esercitazioni non verranno aggiornate con i set di strumenti o le interazioni più recenti usati per HoloLens 2.These tutorials will not be updated with the latest toolsets or interactions being used for HoloLens 2. Rimarranno invariate per consentire di continuare a lavorare sui dispositivi supportati.They will be maintained to continue working on the supported devices. In futuro sarà disponibile una nuova serie di esercitazioni che illustrano come sviluppare per HoloLens 2.There will be a new series of tutorials that will be posted in the future that will demonstrate how to develop for HoloLens 2. Questo avviso verrà aggiornato con un collegamento a queste esercitazioni quando vengono pubblicate.This notice will be updated with a link to those tutorials when they are posted.

risultato del corso

In questo corso si apprenderà come implementare un servizio Hub Internet degli Azure in una macchina virtuale che esegue il sistema operativo Ubuntu 16,4.In this course, you will learn how to implement an Azure IoT Hub Service on a virtual machine running the Ubuntu 16.4 operating system. Un app per le funzioni di Azure verrà quindi usato per ricevere messaggi dalla macchina virtuale Ubuntu e archiviare il risultato in un servizio tabelle di Azure.An Azure Function App will then be used to receive messages from your Ubuntu VM, and store the result within an Azure Table Service. Sarà quindi possibile visualizzare questi dati usando Power bi su un auricolare Microsoft HoloLens o immersive (VR).You will then be able to view this data using Power BI on Microsoft HoloLens or immersive (VR) headset.

Il contenuto di questo corso è applicabile ai dispositivi IOT Edge, ma ai fini di questo corso, l'attenzione si troverà in un ambiente di macchina virtuale, in modo che l'accesso a un dispositivo perimetrale fisico non sia necessario.The content of this course is applicable to IoT Edge devices, though for the purpose of this course, the focus will be on a virtual machine environment, so that access to a physical Edge device is not necessary.

Completando questo corso, si apprenderà come:By completing this course, you will learn to:

  • Distribuire un modulo IOT Edge in una macchina virtuale (Ubuntu 16 OS), che rappresenterà il dispositivo Internet delle cose.Deploy an IoT Edge module to a Virtual Machine (Ubuntu 16 OS), which will represent your IoT device.
  • Aggiungere un modello Tensorflow di Azure visione personalizzata al modulo perimetrale, con codice che analizzerà le immagini archiviate nel contenitore.Add an Azure Custom Vision Tensorflow Model to the Edge module, with code that will analyze images stored in the container.
  • Configurare il modulo per inviare di nuovo il messaggio di risultato dell'analisi al servizio Hub Internet delle cose.Set up the module to send the analysis result message back to your IoT Hub Service.
  • Usare un app per le funzioni di Azure per archiviare il messaggio all'interno di una tabella di Azure.Use an Azure Function App to store the message within an Azure Table.
  • Configurare Power bi per la raccolta del messaggio archiviato e la creazione di un report.Set up Power BI to collect the stored message and create a report.
  • Visualizza i dati del messaggio Internet all'interno Power bi.Visualize your IoT message data within Power BI.

I servizi che si utilizzeranno includono:The Services you will use include:

  • Hub di Azure è un servizio di Microsoft Azure che consente agli sviluppatori di connettersi, monitorare e gestire le risorse del tutto.Azure IoT Hub is a Microsoft Azure Service which allows developers to connect, monitor, and manage, IoT assets. Per altre informazioni, visita la pagina del servizio Hub Azure.For more information, visit the Azure IoT Hub Service page.

  • Azure container Registry è un servizio di Microsoft Azure che consente agli sviluppatori di archiviare le immagini del contenitore per diversi tipi di contenitori.Azure Container Registry is a Microsoft Azure Service which allows developers to store container images, for various types of containers. Per altre informazioni, visitare la pagina del servizio container Registry di Azure.For more information, visit the Azure Container Registry Service page.

  • Azure app per le funzioni è un servizio Microsoft Azure, che consente agli sviluppatori di eseguire piccole porzioni di codice, "funzioni", in Azure.Azure Function App is a Microsoft Azure Service, which allows developers to run small pieces of code, 'functions', in Azure. Questo consente di delegare il lavoro al cloud, anziché l'applicazione locale, che può avere molti vantaggi.This provides a way to delegate work to the cloud, rather than your local application, which can have many benefits. Funzioni di Azure supporta diversi linguaggi di sviluppo, tra cui C # , F # , Node.js, Java e php.Azure Functions supports several development languages, including C#, F#, Node.js, Java, and PHP. Per altre informazioni, visitare la pagina funzioni di Azure.For more information, visit the Azure Functions page.

  • Archiviazione di Azure: tabelle è un servizio Microsoft Azure, che consente agli sviluppatori di archiviare dati strutturati e non SQL nel cloud, rendendoli facilmente accessibili ovunque.Azure Storage: Tables is a Microsoft Azure Service, which allows developers to store structured, non-SQL, data in the cloud, making it easily accessible anywhere. Il servizio presenta una progettazione senza schema, che consente l'evoluzione delle tabelle in base alle esigenze e pertanto è molto flessibile.The Service boasts a schema-less design, allowing for the evolution of tables as needed, and thus is very flexible. Per altre informazioni, visita la pagina delle tabelle di AzureFor more information, visit the Azure Tables page

Questo corso ti insegnerà come configurare e usare il servizio hub Internet delle cose e quindi visualizzare una risposta fornita da un dispositivo.This course will teach you how to setup and use the IoT Hub Service, and then visualize a response provided by a device. Sarà quindi necessario applicare questi concetti a una configurazione del servizio Hub delle cose personalizzate, che può essere compilata.It will be up to you to apply these concepts to a custom IoT Hub Service setup, which you might be building.

Supporto di dispositiviDevice support

CorsoCourse HoloLensHoloLens Visori VR immersiveImmersive headsets
MR e Azure 313: Servizio Hub IoTMR and Azure 313: IoT Hub Service ✔️✔️ ✔️✔️

PrerequisitiPrerequisites

Per i prerequisiti più aggiornati per lo sviluppo con realtà mista, tra cui con Microsoft HoloLens, vedere l'articolo installare gli strumenti .For the most up-to-date prerequisites for developing with mixed reality, including with the Microsoft HoloLens, visit the Install the tools article.

Nota

Questa esercitazione è progettata per gli sviluppatori che hanno esperienza di base con Python.This tutorial is designed for developers who have basic experience with Python. Tenere inoltre presente che i prerequisiti e le istruzioni scritte in questo documento rappresentano gli elementi testati e verificati al momento della stesura (luglio 2018).Please also be aware that the prerequisites and written instructions within this document represent what has been tested and verified at the time of writing (July 2018). È possibile utilizzare il software più recente, come indicato nell'articolo installare gli strumenti , ma non si presuppone che le informazioni in questo corso corrispondano perfettamente a quelle disponibili nel software più recente rispetto a quanto indicato di seguito.You are free to use the latest software, as listed within the install the tools article, though it should not be assumed that the information in this course will perfectly match what you will find in newer software than that listed below.

Sono necessari i componenti hardware e software seguenti:The following hardware and software is required:

Prima di iniziareBefore you start

  1. Configurare e testare il HoloLens.Set up and test your HoloLens. Se è necessario supporto per la configurazione di HoloLens, vedere l'articolo relativo alla configurazione di HoloLens.If you need support setting up your HoloLens, make sure to visit the HoloLens setup article.
  2. Quando si inizia a sviluppare una nuova app HoloLens, è consigliabile eseguire la taratura e l' ottimizzazione dei sensori , a volte può essere utile per eseguire queste attività per ogni utente.It is a good idea to perform Calibration and Sensor Tuning when beginning developing a new HoloLens app (sometimes it can help to perform those tasks for each user).

Per informazioni sulla calibrazione, seguire questo collegamento all'articolo relativo alla calibrazione di HoloLens.For help on Calibration, please follow this link to the HoloLens Calibration article.

Per informazioni sull'ottimizzazione dei sensori, seguire questo collegamento all'articolo relativo all'ottimizzazione del sensore HoloLens.For help on Sensor Tuning, please follow this link to the HoloLens Sensor Tuning article.

  1. Configurare la macchina virtuale Ubuntu con Hyper-V.Set up your Ubuntu Virtual Machine using Hyper-V. Le risorse seguenti consentiranno di semplificare il processo.The following resources will help you with the process.

    1. Per prima cosa, seguire questo collegamento per scaricare l'immagine ISO 16.04.4 LTS (xenial Xerus) di Ubuntu.First, follow this link to download the Ubuntu 16.04.4 LTS (Xenial Xerus) ISO. Selezionare l' immagine del desktop di 64 bit per PC (amd64).Select the 64-bit PC (AMD64) desktop image.
    2. Verificare che Hyper-V sia abilitato nel computer Windows 10.Make sure Hyper-V is enabled on your Windows 10 machine. È possibile seguire questo collegamento per istruzioni sull' installazione e l'abilitazione di Hyper-V in Windows 10.You can follow this link for guidance on installing and enabling Hyper-V on Windows 10.
    3. Avviare Hyper-V e creare una nuova macchina virtuale Ubuntu.Start Hyper-V and create a new Ubuntu VM. È possibile seguire questo collegamento per una Guida dettagliata su come creare una macchina virtuale con Hyper-V.You can follow this link for a step by step guide on how to create a VM with Hyper-V. Quando viene richiesto di installare un sistema operativo da un file di immagine di avvio, selezionare l'immagine ISO di Ubuntu scaricata in precedenza.When requested to "Install an operating system from a bootable image file", select the Ubuntu ISO you have download earlier.

    Nota

    Non è consigliabile usare la creazione rapida di Hyper-V .Using Hyper-V Quick Create is not suggested.

Capitolo 1-recuperare il modello di Visione personalizzataChapter 1 - Retrieve the Custom Vision model

Con questo corso potrai accedere a un modello di visione personalizzata predefinito che rileva tastiere e topi dalle immagini.With this course you will have access to a pre-built Custom Vision model that detects keyboards and mice from images. Se si usa questa operazione, procedere con il capitolo 2.If you use this, proceed to Chapter 2.

Tuttavia, se si vuole usare il proprio modello di Visione personalizzata, è possibile seguire questa procedura:However, you can follow these steps if you wish to use your own Custom Vision model:

  1. Nel progetto visione personalizzata passare alla scheda prestazioni .In your Custom Vision Project go to the Performance tab.

    Avviso

    Per esportare il modello, il modello deve usare un dominio compatto .Your model must use a compact domain, to export the model. È possibile modificare il dominio dei modelli nelle impostazioni per il progetto.You can change your models domain in the settings for your project.

    scheda prestazioni

  2. Selezionare l' iterazione che si desidera esportare e fare clic su Esporta.Select the Iteration you want to export and click on Export. Verrà visualizzato un pannello.A blade will appear.

    pannello Esporta

  3. Nel pannello fare clic su file Docker.In the blade click Docker File.

    Selezionare Docker

  4. Scegliere Linux dal menu a discesa e quindi fare clic su download.Click Linux in the drop-down menu and then click on Download.

    Fare clic su download

  5. Decomprimere il contenuto.Unzip the content. Che verrà usato più avanti in questo corso.You will use it later in this course.

Capitolo 2-Servizio Container RegistryChapter 2 - The Container Registry Service

Il servizio container Registry è il repository usato per ospitare i contenitori.The Container Registry Service is the repository used to host your containers.

Il servizio Hub Internet delle cose che verrà compilato e usato in questo corso fa riferimento al servizio container Registry per ottenere i contenitori da distribuire nel dispositivo perimetrale.The IoT Hub Service that you will build and use in this course, refers to Container Registry Service to obtain the containers to deploy in your Edge Device.

  1. Per prima cosa, seguire questo collegamento al portale di Azuree accedere con le proprie credenziali.First, follow this link to the Azure Portal, and login with your credentials.

  2. Passare a Crea una risorsa e cercare container Registry.Go to Create a resource and look for Container Registry.

    registro contenitori

  3. Fare clic su Crea.Click on Create.

  4. Impostare i parametri di installazione del servizio:Set the Service setup parameters:

    1. Inserire un nome per il progetto, in questo esempio denominato IoTCRegistry.Insert a name for your project, In this example its called IoTCRegistry.

    2. Scegliere un gruppo di risorse o crearne uno nuovo.Choose a Resource Group or create a new one. Un gruppo di risorse consente di monitorare, controllare l'accesso, effettuare il provisioning e gestire la fatturazione per una raccolta di asset di Azure.A resource group provides a way to monitor, control access, provision, and manage, billing for a collection of Azure assets. Si consiglia di lasciare tutti i servizi di Azure associati a un singolo progetto (ad esempio questi corsi) in un gruppo di risorse comune).It is recommended to keep all the Azure Services associated with a single project (e.g. such as these courses) under a common resource group).

    3. Imposta il percorso del servizio.Set the location of the Service.

    4. Impostare utente amministratore su Abilita.Set Admin user to Enable.

    5. Impostare SKU su Basic.Set SKU to Basic.

  5. Fare clic su Crea e attendere la creazione dei servizi.Click Create and wait for the Services to be created.

  6. Quando viene visualizzata la notifica che informa che la creazione del container Registry è riuscita, fare clic su Vai alla risorsa da reindirizzare alla pagina del servizio.Once the notification pops up informing you of the successful creation of the Container Registry, click on Go to resource to be redirected to your Service page.

  7. Nella pagina servizio container Registry fare clic su chiavi di accesso.In the Container Registry Service page, click on Access keys.

  8. Prendere nota (è possibile usare il blocco note) dei parametri seguenti:Take note (you could use your Notepad) of the following parameters:

    1. Server di accessoLogin Server
    2. Nome utenteUsername
    3. PasswordPassword

Capitolo 3-servizio hub Internet delle coseChapter 3 - The IoT Hub Service

A questo punto si inizierà la creazione e la configurazione del servizio Hub Internet delle cose.Now you will begin the creation and setup of your IoT Hub Service.

  1. Se non è già stato effettuato l'accesso, accedere al portale di Azure.If not already signed in, log into the Azure Portal.

  2. Una volta effettuato l'accesso, fare clic su Crea una risorsa nell'angolo in alto a sinistra e cercare l' Hub Internet e premere invio.Once logged in, click on Create a resource in the top left corner, and search for IoT Hub, and click Enter.

Cerca account di archiviazione

  1. La nuova pagina fornirà una descrizione del servizio dell' account di archiviazione .The new page will provide a description of the Storage account Service. Nella parte inferiore sinistra del prompt, fare clic sul pulsante Crea per creare un'istanza del servizio.At the bottom left of this prompt, click the Create button, to create an instance of this Service.

    Crea istanza di archiviazione

  2. Una volta fatto clic su Crea, verrà visualizzato un pannello:Once you have clicked on Create, a panel will appear:

    1. Scegliere un gruppo di risorse o crearne uno nuovo.Choose a Resource Group or create a new one. Un gruppo di risorse consente di monitorare, controllare l'accesso, effettuare il provisioning e gestire la fatturazione per una raccolta di asset di Azure.A resource group provides a way to monitor, control access, provision and manage billing for a collection of Azure assets. Si consiglia di lasciare tutti i servizi di Azure associati a un singolo progetto (ad esempio questi corsi) in un gruppo di risorse comune).It is recommended to keep all the Azure Services associated with a single project (e.g. such as these courses) under a common resource group).

      Per altre informazioni sui gruppi di risorse di Azure, seguire questo collegamento per informazioni su come gestire un gruppo di risorse.If you wish to read more about Azure Resource Groups, please follow this link on how to manage a Resource Group.

    2. Selezionare un percorso appropriato (usare la stessa posizione in tutti i servizi creati in questo corso).Select an appropriate Location (Use the same location across all the Services you create in this course).

    3. Inserire il nome desiderato per l'istanza del servizio.Insert your desired Name for this Service instance.

  3. Nella parte inferiore della pagina fare clic su Next: size and scale.On the bottom of the page click on Next: Size and scale.

    Crea istanza di archiviazione

  4. In questa pagina selezionare il piano tariffario e il livello di scalabilità (se si tratta della prima istanza del servizio hub Internet, sarà disponibile un livello gratuito).In this page, select your Pricing and scale tier (if this is your first IoT Hub Service instance, a free tier should be available to you).

  5. Fare clic su Verifica + crea.Click on Review + Create.

    Crea istanza di archiviazione

  6. Verificare le impostazioni e fare clic su Crea.Review your settings and click on Create.

    Crea istanza di archiviazione

  7. Quando viene visualizzata la notifica che informa che la creazione del servizio Hub Internet è stata completata, fare clic su Vai alla risorsa da reindirizzare alla pagina del servizio.Once the notification pops up informing you of the successful creation of the IoT Hub Service, click on Go to resource to be redirected to your Service page.

    Crea istanza di archiviazione

  8. Scorrere il pannello laterale a sinistra fino a quando non viene visualizzata la gestione automatica dei dispositivi, facendo clic su IOT Edge.Scroll the side panel on the left until you see Automatic Device Management, the click on IoT Edge.

    Crea istanza di archiviazione

  9. Nella finestra visualizzata a destra fare clic su aggiungi IOT Edge dispositivo.In the window that appears to the right, click on Add IoT Edge Device. Verrà visualizzato un pannello a destra.A blade will appear to the right.

  10. Nel pannello fornire al nuovo dispositivo un ID dispositivo , ovvero un nome di propria scelta.In the blade, provide your new device a Device ID (a name of your choice). Fare quindi clic su Salva.Then, click Save. Le chiavi primarie e secondarie vengono generate automaticamente se è stato generato automaticamente il segno di generazione.The Primary and Secondary Keys will auto generate, if you have Auto Generate ticked.

    Crea istanza di archiviazione

  11. Si tornerà alla sezione dispositivi IOT Edge , in cui verrà elencato il nuovo dispositivo.You will navigate back to the IoT Edge Devices section, where your new device will be listed. Fare clic sul nuovo dispositivo (descritto in rosso nell'immagine seguente).Click on your new device (outlined in red in the below image).

    Crea istanza di archiviazione

  12. Nella pagina Dettagli dispositivo visualizzata, eseguire una copia della stringa di connessione (chiave primaria).On the Device Details page that appears, take a copy of the Connection String (primary key).

    Crea istanza di archiviazione

  13. Tornare al pannello a sinistra e fare clic su criteri di accesso condiviso per aprirlo.Go back to the panel on the left, and click Shared access policies, to open it.

  14. Nella pagina visualizzata fare clic su iothubowner. verrà visualizzato un pannello a destra della schermata.On the page that appears, click iothubowner, and a blade will appear to the right of the screen.

  15. Prendere nota (sul blocco note) della stringa di connessione (chiave primaria), da usare in un secondo momento quando si imposta la stringa di connessione sul dispositivo.Take note (on your Notepad) of the Connection string (primary key), for later use when setting the Connection String to your device.

    Crea istanza di archiviazione

Capitolo 4-configurazione dell'ambiente di sviluppoChapter 4 - Setting up the development environment

Per creare e distribuire i moduli per il perimetro dell'hub Internet delle cose, è necessario che i componenti seguenti siano installati nel computer di sviluppo che esegue Windows 10:In order to create and deploy modules for IoT Hub Edge, you will require the following components installed on your development machine running Windows 10:

  1. Docker per Windows, verrà richiesto di creare un account per poterlo scaricare.Docker for Windows, it will ask you to create an account to be able to download.

    Scarica Docker per Windowsdownload docker for windows

    Importante

    Docker richiede Windows 10 Pro, Enterprise 14393 o Windows Server 2016 RTM per l'esecuzione.Docker requires Windows 10 PRO, Enterprise 14393, or Windows Server 2016 RTM, to run. Se si eseguono altre versioni di Windows 10, è possibile provare a installare Docker usando la casella degli strumenti di Docker.If you are running other versions of Windows 10, you can try installing Docker using the Docker Toolbox.

  2. Python 3,6.Python 3.6.

    scaricare Python 3,6download python 3.6

  3. Visual Studio Code (noto anche come vs code).Visual Studio Code (also known as VS Code).

    Scarica VS Codedownload VS Code

Dopo aver installato il software menzionato in precedenza, sarà necessario riavviare il computer.After installing the software mentioned above, you will need to restart your machine.

Capitolo 5-configurazione dell'ambiente UbuntuChapter 5 - Setting up the Ubuntu environment

A questo punto è possibile passare alla configurazione del dispositivo che esegue Ubuntu OS.Now you can move on to setting up your device running Ubuntu OS. Attenersi alla procedura seguente per installare il software necessario per distribuire i contenitori nella lavagna:Follow the steps below, to install the necessary software, to deploy your containers on your board:

Importante

È sempre necessario precedere i comandi del terminale con sudo per l'esecuzione come utente amministratore.You should always precede the terminal commands with sudo to run as admin user. cioèi.e:

sudo docker \<option> \<command> \<argument>
  1. Aprire il terminale Ubuntu e usare il comando seguente per installare PIP:Open the Ubuntu Terminal, and use the following command to install pip:

    [! HINT] è possibile aprire facilmente il terminale usando i tasti di scelta rapida: CTRL + ALT + T.[!HINT] You can open Terminal very easily through using the keyboard shortcut: Ctrl + Alt + T.

        sudo apt-get install python-pip
    
  2. In questo capitolo, è possibile che venga richiesto, dal terminale, per l'autorizzazione all'uso dell'archiviazione del dispositivo e per l'input di y/n (Sì o no), digitare "y", quindi premere il tasto invio per accettare.Throughout this Chapter, you may be prompted, by Terminal, for permission to use your device storage, and for you to input y/n (yes or no), type 'y', and then press the Enter key, to accept.

  3. Al termine del comando, usare il comando seguente per installare curl:Once that command has completed, use the following command to install curl:

        sudo apt install curl
    
  4. Dopo l'installazione di PIP e curl , usare il comando seguente per installare il runtime di IOT Edge, necessario per distribuire e controllare i moduli sulla lavagna:Once pip and curl are installed, use the following command to install the IoT Edge runtime, this is necessary to deploy and control the modules on your board:

        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. A questo punto verrà chiesto di aprire il file di configurazione di runtime per inserire la stringa di connessione del dispositivo annotata (nel blocco note) quando si crea il servizio Hub Internet (nel passaggio 14 del capitolo 3).At this point you will be prompted to open up the runtime config file, to insert the Device Connection String, that you noted down (in your Notepad), when creating the IoT Hub Service (at step 14, of Chapter 3). Eseguire la riga seguente nel terminale per aprire il file:Run the following line on the terminal to open that file:

        sudo nano /etc/iotedge/config.yaml
    
  6. Verrà visualizzato il file config. YAML , pronto per la modifica:The config.yaml file will be displayed, ready for you to edit:

    Avviso

    Quando si apre questo file, è possibile che si verifichi una certa confusione.When this file opens, it may be somewhat confusing. Il file verrà modificato dal testo nel terminale stesso.You will be text editing this file, within the Terminal itself.

    1. Usare i tasti di direzione sulla tastiera per scorrere verso il basso (sarà necessario scorrere verso il basso), per raggiungere la riga contenente ":Use the arrow keys on your keyboard to scroll down (you will need to scroll down a little way), to reach the line containing":

      "<ADD DEVICE CONNECTION STRING HERE>"."<ADD DEVICE CONNECTION STRING HERE>".

    2. Sostituire la riga, incluse le parentesi, con la stringa di connessione del dispositivo annotata in precedenza.Substitute line, including the brackets, with the Device Connection String you have noted earlier.

  7. Con la stringa di connessione sul posto, sulla tastiera premere i tasti CTRL + X per salvare il file.With your Connection String in place, on your keyboard, press the Ctrl-X keys to save the file. Verrà richiesto di confermare digitando Y. Premere quindi il tasto invio per confermare.It will ask you to confirm by typing Y. Then, press the Enter key, to confirm. Si tornerà al terminale normale.You will go back to the regular Terminal.

  8. Una volta che tutti i comandi sono stati eseguiti correttamente, il runtime di IOT Edge sarà installato.Once these commands have all run successfully, you will have installed the IoT Edge Runtime. Una volta inizializzato, il runtime si avvierà in modo autonomo ogni volta che il dispositivo viene acceso e si troverà in background, in attesa che i moduli vengano distribuiti dal servizio Hub Internet delle cose.Once initialized, the runtime will start on its own every time the device is powered up, and will sit in the background, waiting for modules to be deployed from the IoT Hub Service.

  9. Eseguire la seguente riga di comando per inizializzare il runtime di IOT Edge:Run the following command line to initialize the IoT Edge Runtime:

        sudo systemctl restart iotedge
    

    Importante

    Se si apportano modifiche al file con estensione YAML o al programma di installazione precedente, sarà necessario eseguire nuovamente la riga di riavvio precedente, all'interno del terminale.If you make changes to your .yaml file, or the above setup, you will need to run the above restart line again, within Terminal.

  10. Verificare lo stato di Runtime IOT Edge eseguendo la riga di comando seguente.Check the IoT Edge Runtime status by running the following command line. Il runtime verrà visualizzato con lo stato attivo (in esecuzione) in testo verde.The runtime should appear with the status active (running) in green text.

        sudo systemctl status iotedge
    
  11. Premere i tasti CTRL + C per uscire dalla pagina stato.Press the Ctrl-C keys, to exit the status page. È possibile verificare che il runtime di IOT Edge stia effettuando correttamente il pull dei contenitori digitando il comando seguente:You can verify that the IoT Edge Runtime is pulling the containers correctly by typing the following command:

        sudo docker ps
    
  12. Verrà visualizzato un elenco con due contenitori (2).A list with two (2) containers should appear. Si tratta dei moduli predefiniti che vengono creati automaticamente dal servizio hub Internet delle cose (edgeAgent e edgeHub).These are the default modules that are automatically created by the IoT Hub Service (edgeAgent and edgeHub). Una volta creati e distribuiti i moduli, questi verranno visualizzati in questo elenco, sotto quelli predefiniti.Once you create and deploy your own modules, they will appear in this list, underneath the default ones.

Capitolo 6: installare le estensioniChapter 6 - Install the extensions

Importante

I prossimi capitoli (6-9) devono essere eseguiti nel computer Windows 10.The next few Chapters (6-9) are to be performed on your Windows 10 machine.

  1. Aprire vs code.Open VS Code.

  2. Fare clic sul pulsante estensioni (quadrato) nella barra di sinistra di vs code per aprire il Pannello estensioni.Click on the Extensions (square) button on the left bar of VS Code, to open the Extensions panel.

  3. Cercare e installare le estensioni seguenti (come illustrato nell'immagine seguente):Search for, and install, the following extensions (as shown in the image below):

    1. Azure IoT EdgeAzure IoT Edge
    2. Azure IoT ToolkitAzure IoT Toolkit
    3. DockerDocker

    Creare il contenitore

  4. Una volta installate le estensioni, chiuderlo e riaprirlo VS Code.Once the extensions are installed, close and re-open VS Code.

  5. Con vs code Apri ancora una volta, passare a Visualizza > terminale integrato.With VS Code open once more, navigate to View > Integrated terminal.

  6. Si installerà ora tagliatore.You will now install Cookiecutter. Nel terminale eseguire il comando bash seguente:In the terminal run the following bash command:

        pip install --upgrade --user cookiecutter
    

    [! HINT] Se si riscontrano problemi con questo comando:[!HINT] If you have trouble with this command:

    1. Riavviare VS Code e/o il computer.Restart VS Code, and/ or your computer.
    2. Potrebbe essere necessario passare il terminale vs code a quello usato per installare Python, ad esempio PowerShell (soprattutto se l'ambiente Python è già installato nel computer).It might be necessary to switch the VS Code Terminal to the one you have been using to install Python, i.e. Powershell (especially in case the Python environment was already installed on your machine). Con il terminale aperto è possibile trovare il menu a discesa sul lato destro del terminale.With the Terminal open, you will find the drop down menu on the right side of the Terminal. Creare il contenitoreCreate your container
    3. Verificare che il percorso di installazione di Python venga aggiunto come variabile di ambiente nel computer.Make sure the Python installation path is added as Environment Variable on your machine. Tagliatore deve far parte dello stesso percorso.Cookiecutter should be part of the same location path. Per ulteriori informazioni sulle variabili di ambiente, seguire questo collegamento.Please follow this link for more information on Environment Variables,
  7. Al termine dell'installazione di tagliatore , è necessario riavviare il computer, in modo che tagliatore venga riconosciuto come comando nell'ambiente del sistema.Once Cookiecutter has finished installing, you should restart your machine, so that Cookiecutter is recognized as a command, within your System's environment.

Capitolo 7: creare una soluzione contenitoreChapter 7 - Create your container solution

A questo punto, è necessario creare il contenitore, con il modulo, per eseguire il push nel container Registry.At this point, you need to create the container, with the module, to be pushed into the Container Registry. Dopo aver eseguito il push del contenitore, si userà il servizio Edge Hub Internet per distribuirlo nel dispositivo, che esegue il runtime di IOT Edge.Once you have pushed your container, you will use the IoT Hub Edge Service to deploy it to your device, which is running the IoT Edge runtime.

  1. In vs code fare clic su Visualizza > riquadro comandi.From VS Code, click View > Command palette.

  2. Nella tavolozza, cercare ed eseguire Azure IOT Edge: nuova soluzione Edge.In the palette, search and run Azure IoT Edge: New Iot Edge Solution.

  3. Individuare un percorso in cui si desidera creare la soluzione.Browse into a location where you want to create your solution. Premere il tasto invio per accettare il percorso.Press the Enter key, to accept the location.

  4. Assegnare un nome alla soluzione.Give a name to your solution. Premere il tasto invio per confermare il nome fornito.Press the Enter key, to confirm your provided name.

  5. A questo punto verrà richiesto di scegliere il Framework modello per la soluzione.Now you will be prompted to choose the template framework for your solution. Fare clic su modulo Python.Click Python Module. Premere il tasto invio per confermare la scelta.Press the Enter key, to confirm this choice.

  6. Assegnare un nome al modulo.Give a name to your module. Premere il tasto invio per confermare il nome del modulo.Press the Enter key, to confirm the name of your module. Assicurarsi di prendere nota del nome del modulo (con il blocco note), perché verrà usato in un secondo momento.Make sure to take a note (with your Notepad) of the module name, as it is used later.

  7. Si noterà che nella tavolozza verrà visualizzato un indirizzo predefinito del repository di immagini Docker .You will notice a pre-built Docker Image Repository address will appear on the palette. L'aspetto sarà simile al seguente:It will look like:

    localhost: 5000/-nome del modulo-.localhost:5000/-THE NAME OF YOUR MODULE-.

  8. Elimina localhost: 5000 e al suo posto inserire l'indirizzo del Server di accesso container Registry , annotato durante la creazione del servizio di container Registry (nel passaggio 8 del capitolo 2).Delete localhost:5000, and in its place insert the Container Registry Login Server address, which you noted when creating the Container Registry Service (in step 8, of Chapter 2). Premere il tasto invio per confermare l'indirizzo.Press the Enter key, to confirm the address.

  9. A questo punto, verrà creata la soluzione contenente il modello per il modulo Python e la relativa struttura verrà visualizzata nella scheda Esplora, di vs code, sul lato sinistro dello schermo.At this point, the solution containing the template for your Python module will be created and its structure will be displayed in the Explore Tab, of VS Code, on the left side of the screen. Se la scheda Esplora non è aperta, è possibile aprirla facendo clic sul pulsante in primo piano nella barra a sinistra.If the Explore Tab is not open, you can open it by clicking the top-most button, in the bar on the left.

    Creare il contenitore

  10. L'ultimo passaggio per questo capitolo consiste nel fare clic e aprire il file con estensione ENV, nella scheda Esplora e aggiungere il nome utente e la password del container Registry .The last step for this Chapter, is to click and open the .env file, from within the Explore Tab, and add your Container Registry username and password. Questo file viene ignorato da git, ma quando si compila il contenitore, le credenziali verranno impostate per accedere al servizio container Registry.This file is ignored by git, but on building the container, will set the credentials to access the Container Registry Service.

    Creare il contenitore

Capitolo 8-modifica della soluzione contenitoreChapter 8 - Editing your container solution

A questo punto è necessario completare la soluzione contenitore aggiornando i file seguenti:You will now complete the container solution, by updating the following files:

  • script Python Main . py .main.py python script.
  • requirements.txt.requirements.txt.
  • deployment.template.js.deployment.template.json.
  • Dockerfile. amd64Dockerfile.amd64

Si creerà quindi la cartella images usata dallo script Python per verificare la presenza di immagini corrispondenti al modello di visione personalizzata.You will then create the images folder, used by the python script to check for images to match against your Custom Vision model. Infine, si aggiungerà il file di labels.txt , per facilitare la lettura del modello e il file Model. PB , che rappresenta il modello.Lastly, you will add the labels.txt file, to help read your model, and the model.pb file, which is your model.

  1. Con VS Code aperto, passare alla cartella del modulo e cercare lo script denominato Main . py.With VS Code open, navigate to your module folder, and look for the script called main.py. Fare doppio clic per aprirlo.Double-click to open it.

  2. Eliminare il contenuto del file e inserire il codice seguente:Delete the content of the file and insert the following code:

    # 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. Aprire il file denominato requirements.txt e sostituirne il contenuto con il codice seguente:Open the file called requirements.txt, and substitute its content with the following:

    azure-iothub-device-client==1.4.0.0b3
    opencv-python==3.3.1.11
    tensorflow==1.8.0
    pillow==5.1.0
    
  4. Aprire il file denominato deployment.template.json e sostituirne il contenuto attenendosi alla seguente guida:Open the file called deployment.template.json, and substitute its content following the below guideline:

    1. Poiché la struttura JSON è personalizzata, sarà necessario modificarla manualmente, invece di copiare un esempio di.Because you will have your own, unique, JSON structure, you will need to edit it by hand (rather than copying an example). Per semplificare questa operazione, usare l'immagine seguente come guida.To make this easy, use the below image as a guide.

    2. Le aree che hanno un aspetto diverso per l'utente, ma che non devono essere modificate sono evidenziate in giallo.Areas which will look different to yours, but which you should NOT change are highlighted yellow.

    3. Le sezioni che è necessario eliminare sono evidenziate in rosso.Sections which you need to delete, are a highlighted red.

    4. Prestare attenzione a eliminare le parentesi quadre corrette e rimuovere anche le virgole.Be careful to delete the correct brackets, and also remove the commas.

      Creare il contenitore

    5. Il file JSON completato dovrebbe essere simile all'immagine seguente (Tuttavia, con le differenze univoche: nome utente/password/nome modulo/riferimenti modulo):The completed JSON should look like the following image (though, with your unique differences: username/password/module name/module references):

      Creare il contenitore

  5. Aprire il file denominato Dockerfile. amd64 e sostituirne il contenuto con il codice seguente:Open the file called Dockerfile.amd64, and substitute its content with the following:

    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. Fare clic con il pulsante destro del mouse sulla cartella sotto i moduli (il nome fornito in precedenza, nell'esempio più avanti, è denominato pythonmodule) e fare clic su nuova cartella.Right-click on the folder beneath modules (it will have the name you provided previously; in the example further down, it is called pythonmodule), and click on New Folder. Denominare le Immagini della cartella.Name the folder images.

  7. All'interno della cartella aggiungere alcune immagini che contengono il mouse o la tastiera.Inside the folder, add some images containing mouse or keyboard. Si tratta delle immagini che verranno analizzate dal modello Tensorflow.Those will be the images that will be analyzed by the Tensorflow model.

    Avviso

    Se si usa un modello personalizzato, è necessario modificarlo in modo da riflettere i dati dei modelli personalizzati.If you are using your own model, you will need to change this to reflect your own models data.

  8. A questo punto è necessario recuperare i file labels.txt e Model. PB dalla cartella del modello, che è stata precedentemente scaricata (o creata dal proprio servizio visione artificiale personalizzato), nel capitolo 1.You will now need to retrieve the labels.txt and model.pb files from the model folder, which you previous downloaded (or created from your own Custom Vision Service), in Chapter 1. Dopo aver creato i file, posizionarli all'interno della soluzione, insieme ad altri file.Once you have the files, place them within your solution, alongside the other files. Il risultato finale dovrebbe essere simile all'immagine seguente:The final result should look like the image below:

    Creare il contenitore

Capitolo 9: creare un pacchetto della soluzione come contenitoreChapter 9 - Package the solution as a container

  1. A questo punto è possibile creare il pacchetto dei file come contenitore ed eseguirne il push nel container Registry di Azure.You are now ready to "package" your files as a container and push it to your Azure Container Registry. All'interno vs code aprire il terminale integrato (visualizzare il > terminale integrato o CTRL + ` ) e usare la riga seguente per accedere a Docker (sostituire i valori del comando con le credenziali del container Registry di Azure (ACR)):Within VS Code, open the Integrated Terminal (View > Integrated Terminal or Ctrl+`), and use the following line to login to Docker (substitute the values of the command with the credentials of your Azure Container Registry (ACR)):

        docker login -u <ACR username> -p <ACR password> <ACR login server>
    
  2. Fare clic con il pulsante destro del mouse sul file deployment.template.js e scegliere Compila IOT Edge soluzione.Right-click on the file deployment.template.json, and click Build IoT Edge Solution. Questo processo di compilazione richiede molto tempo (a seconda del dispositivo), quindi prepararsi ad attendere.This build process takes quite some time (depending on your device), so be prepared to wait. Al termine del processo di compilazione, in una nuova cartella denominata config sarà stato creato un deployment.jssul file.After the build process finishes, a deployment.json file will have been created inside a new folder called config.

    Crea distribuzione

  3. Aprire di nuovo il riquadro comandi e cercare Azure: Sign in (accedi).Open the Command Palette again, and search for Azure: Sign In. Seguire le istruzioni usando le credenziali dell'account Azure. VS Code fornirà un'opzione per la copia e l'apertura, che consente di copiare il codice del dispositivo che sarà presto necessario e di aprire il Web browser predefinito.Follow the prompts using your Azure Account credentials; VS Code will provide you with an option to Copy and Open, which will copy the device code you will soon need, and open your default web browser. Quando viene richiesto, incollare il codice del dispositivo per autenticare il computer.When asked, paste the device code, to authenticate your machine.

    copia e Apri

  4. Una volta effettuato l'accesso, si noterà che, nella parte inferiore del pannello di esplorazione , è presente una nuova sezione denominata dispositivi dell'hub Azure.Once signed in you will notice, on the bottom side of the Explore panel, a new section called Azure IoT Hub Devices. Fare clic su questa sezione per espanderla.Click this section to expand it.

    dispositivo perimetrale

  5. Se il dispositivo non è disponibile, è necessario fare clic con il pulsante destro del mouse su dispositivi dell'hub Azure, quindi fare clic su Imposta stringa di connessione dell'hub Internet.If your device is not here, you will need to right-click Azure IoT Hub Devices, and then click Set IoT Hub Connection String. Si noterà che il riquadro comandi (nella parte superiore di vs code) richiederà di immettere la stringa di connessione.You will then see that the Command Palette (at the top of VS Code), will prompt you to input your Connection String. Si tratta della stringa di connessione annotata alla fine del capitolo 3.This is the Connection String you noted down at the end of Chapter 3. Premere il tasto invio dopo aver copiato la stringa in.Press the Enter key, once you have copied the string in.

  6. Il dispositivo deve essere caricato e visualizzato.Your device should load, and appear. Fare clic con il pulsante destro del mouse sul nome del dispositivo e quindi scegliere Crea distribuzione per singolo dispositivo.Right-click on the device name, and then click, Create Deployment for Single Device.

    Crea distribuzione

  7. Verrà visualizzato un prompt di Esplora file , in cui è possibile passare alla cartella config e quindi selezionare il deployment.jssu file.You will get a File Explorer prompt, where you can navigate to the config folder, and then select the deployment.json file. Con il file selezionato, fare clic sul pulsante Seleziona manifesto di distribuzione Edge .With that file selected, click the Select Edge Deployment Manifest button.

    Crea distribuzione

  8. A questo punto è stato fornito il servizio Hub Internet con il manifesto per la distribuzione del contenitore, come modulo, dal container Registry di Azure, in modo da distribuirlo nel dispositivo.At this point you have provided your IoT Hub Service with the manifest for it to deploy your container, as a module, from your Azure Container Registry, effectively deploying it to your device.

  9. Per visualizzare i messaggi inviati dal dispositivo all'hub Internet, fare di nuovo clic con il pulsante destro del mouse sul nome del dispositivo nella sezione dispositivi dell'hub Azure Internet Explorer, nel pannello di esplorazione e fare clic su Avvia il monitoraggio del messaggio D2C.To view the messages sent from your device to the IoT Hub, right-click again on your device name in the Azure IoT Hub Devices section, in the Explorer panel, and click on Start Monitoring D2C Message. I messaggi inviati dal dispositivo verranno visualizzati nel terminale di Visual Studio.The messages sent from your device should appear in the VS Terminal. Essere paziente, perché questa operazione potrebbe richiedere del tempo.Be patient, as this may take some time. Vedere il capitolo successivo per il debug e verificare se la distribuzione è stata completata correttamente.See the next Chapter for debugging, and checking if deployment was successful.

Questo modulo consente ora di eseguire un'iterazione tra le immagini nella cartella images e di analizzarle, con ogni iterazione.This module will now iterate between the images in the images folder and analyze them, with each iteration. Questo è ovviamente solo una dimostrazione di come ottenere il modello di apprendimento automatico di base per il funzionamento in un ambiente IoT Edge dispositivo.This is obviously just a demonstration of how to get the basic machine learning model to work in an IoT Edge device environment.

Per espandere la funzionalità di questo esempio, è possibile procedere in diversi modi.To expand the functionality of this example, you could proceed in several ways. Un modo potrebbe includere il codice nel contenitore, che acquisisce le foto da una webcam connessa al dispositivo e salva le immagini nella cartella immagini.One way could be including some code in the container, that captures photos from a webcam that is connected to the device, and saves the images in the images folder.

Un altro modo potrebbe copiare le immagini dal dispositivo Internet delle cose nel contenitore.Another way could be copying the images from the IoT device into the container. Un modo pratico per eseguire questa operazione consiste nell'eseguire il comando seguente nel terminale del dispositivo Internet delle cose, ad esempio se si desidera automatizzare il processo.A practical way to do that is to run the following command in the IoT device Terminal (perhaps a small app could do the job, if you wished to automate the process). È possibile testare questo comando eseguendolo manualmente dal percorso della cartella in cui sono archiviati i file:You can test this command by running it manually from the folder location where your files are stored:

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

Capitolo 10-debug del runtime di IoT EdgeChapter 10 - Debugging the IoT Edge Runtime

Di seguito è riportato un elenco di righe di comando e suggerimenti che consentono di monitorare ed eseguire il debug dell'attività di messaggistica del runtime di IOT Edge, dal dispositivo Ubuntu.The following are a list of command lines, and tips, to help you monitor and debug the messaging activity of the IoT Edge Runtime, from your Ubuntu device.

  • Verificare lo stato di Runtime IOT Edge eseguendo la riga di comando seguente:Check the IoT Edge Runtime status by running the following command line:

        sudo systemctl status iotedge
    

    Nota

    Ricordarsi di premere CTRL + C per completare la visualizzazione dello stato.Remember to press Ctrl + C, to finish viewing the status.

  • Elenca i contenitori attualmente distribuiti.List the containers that are currently deployed. Se il servizio Hub Internet delle cose ha distribuito correttamente i contenitori, verranno visualizzati eseguendo la riga di comando seguente:If the IoT Hub Service has deployed the containers successfully, they will be displayed by running the following command line:

        sudo iotedge list
    

    OppureOr

        sudo docker ps
    

    Nota

    Questo è un buon metodo per verificare se il modulo è stato distribuito correttamente, perché verrà visualizzato nell'elenco; in caso contrario, si vedranno solo edgeHub e edgeAgent.The above is a good way to check whether your module has been deployed successfully, as it will appear in the list; you will otherwise only see the edgeHub and edgeAgent.

  • Per visualizzare i log del codice di un contenitore, eseguire la riga di comando seguente:To display the code logs of a container, run the following command line:

        journalctl -u iotedge
    

Comandi utili per gestire il runtime di IoT Edge:Useful commands to manage the IoT Edge Runtime:

  • Per eliminare tutti i contenitori nell'host:To delete all containers in the host:

        sudo docker rm -f $(sudo docker ps -aq)
    
  • Per arrestare il runtime di IOT Edge:To stop the IoT Edge Runtime:

        sudo systemctl stop iotedge
    

Capitolo 11-creazione del servizio tabelleChapter 11 - Create Table Service

Tornare al portale di Azure, in cui si creerà un servizio tabelle di Azure creando una risorsa di archiviazione.Navigate back to your Azure Portal, where you will create an Azure Tables Service, by creating a Storage resource.

  1. Se non è già stato effettuato l'accesso, accedere al portale di Azure.If not already signed in, log into the Azure Portal.

  2. Una volta effettuato l'accesso, fare clic su Crea una risorsa, nell'angolo in alto a sinistra e cercare account di archiviazione e premere invio per avviare la ricerca.Once logged in, click on Create a resource, in the top left corner, and search for Storage account, and press the Enter key, to start the search.

  3. Una volta visualizzato, fare clic su account di archiviazione: BLOB, file, tabelle, code nell'elenco.Once it has appeared, click Storage account - blob, file, table, queue from the list.

    Cerca account di archiviazione

  4. La nuova pagina fornirà una descrizione del servizio dell' account di archiviazione .The new page will provide a description of the Storage account Service. Nella parte inferiore sinistra del prompt, fare clic sul pulsante Crea per creare un'istanza del servizio.At the bottom left of this prompt, click the Create button, to create an instance of this Service.

    Crea istanza di archiviazione

  5. Una volta fatto clic su Crea, verrà visualizzato un pannello:Once you have clicked on Create, a panel will appear:

    1. Inserire il nome desiderato per l'istanza del servizio (deve essere in lettere minuscole).Insert your desired Name for this Service instance (must be all lowercase).

    2. Per modello di distribuzione, fare clic su Resource Manager.For Deployment model, click Resource manager.

    3. Per tipo di account, usando il menu a discesa, fare clic su archiviazione (utilizzo generico V1).For Account kind, using the dropdown menu, click Storage (general purpose v1).

    4. Fare clic su un percorso appropriato.Click an appropriate Location.

    5. Per il menu a discesa replica , fare clic su archiviazione con ridondanza geografica e accesso in lettura (RA-GRS).For the Replication dropdown menu, click Read-access-geo-redundant storage (RA-GRS).

    6. Per prestazioni, fare clic su standard.For Performance, click Standard.

    7. Nella sezione trasferimento sicuro obbligatorio fare clic su disabilitato.Within the Secure transfer required section, click Disabled.

    8. Dal menu a discesa sottoscrizione fare clic su una sottoscrizione appropriata.From the Subscription dropdown menu, click an appropriate subscription.

    9. Scegliere un gruppo di risorse o crearne uno nuovo.Choose a Resource Group or create a new one. Un gruppo di risorse consente di monitorare, controllare l'accesso, effettuare il provisioning e gestire la fatturazione per una raccolta di asset di Azure.A resource group provides a way to monitor, control access, provision, and manage, billing for a collection of Azure assets. Si consiglia di lasciare tutti i servizi di Azure associati a un singolo progetto (ad esempio questi corsi) in un gruppo di risorse comune).It is recommended to keep all the Azure Services associated with a single project (e.g. such as these courses) under a common resource group).

      Per altre informazioni sui gruppi di risorse di Azure, seguire questo collegamento per informazioni su come gestire un gruppo di risorse.If you wish to read more about Azure Resource Groups, please follow this link on how to manage a Resource Group.

    10. Lasciare le reti virtuali disabilitate, se questa è un'opzione.Leave Virtual networks as Disabled, if this is an option for you.

    11. Fare clic su Crea.Click Create.

      specificare i dettagli di archiviazione

  6. Una volta fatto clic su Crea, sarà necessario attendere il completamento della creazione del servizio. l'operazione potrebbe richiedere un minuto.Once you have clicked on Create, you will have to wait for the Service to be created, this might take a minute.

  7. Dopo la creazione dell'istanza del servizio, verrà visualizzata una notifica nel portale.A notification will appear in the Portal once the Service instance is created. Fare clic sulle notifiche per esplorare la nuova istanza del servizio.Click on the notifications to explore your new Service instance.

    nuova notifica di archiviazione

  8. Fare clic sul pulsante Vai alla risorsa nella notifica. verrà quindi eseguita la nuova pagina Panoramica dell'istanza del servizio di archiviazione.Click the Go to resource button in the notification, and you will be taken to your new Storage Service instance overview page.

    Vai alla risorsa

  9. Nella pagina Panoramica fare clic su tabelle sul lato destro.From the overview page, to the right-hand side, click Tables.

    tables

  10. Il pannello a destra cambierà in modo da visualizzare le informazioni sul servizio tabelle , in cui è necessario aggiungere una nuova tabella.The panel on the right will change to show the Table Service information, wherein you need to add a new table. A tale scopo, fare clic sul pulsante + tabella nell'angolo superiore sinistro.Do this by clicking the + Table button to the top-left corner.

    Apri tabelle

  11. Verrà visualizzata una nuova pagina, in cui è necessario immettere un nome di tabella.A new page will be shown, wherein you need to enter a Table name. Si tratta del nome che verrà usato per fare riferimento ai dati nell'applicazione nei capitoli successivi (creazione di app per le funzioni e Power BI).This is the name you will use to refer to the data in your application in later Chapters (creating Function App, and Power BI). Inserire IoTMessages come nome (è possibile sceglierne un altro, ricordarlo se usato più avanti in questo documento) e fare clic su OK.Insert IoTMessages as the name (you can choose your own, just remember it when used later in this document) and click OK.

  12. Una volta creata la nuova tabella, sarà possibile visualizzarla nella pagina del servizio tabelle (nella parte inferiore).Once the new table has been created, you will be able to see it within the Table Service page (at the bottom).

    nuova tabella creata

  13. A questo punto, fare clic su chiavi di accesso e copiare il nome e la chiave dell' account di archiviazione (usando il blocco note). questi valori verranno usati più avanti in questo corso, quando si crea il app per le funzioni di Azure.Now click on Access keys and take a copy of the Storage account name and Key (using your Notepad), you will use these values later in this course, when creating the Azure Function App.

    nuova tabella creata

  14. Utilizzando di nuovo il pannello a sinistra, scorrere fino alla sezione servizio tabelle, fare clic su tabelle (o esplorare le tabelle, in portali più recenti) ed eseguire una copia dell'URL della tabella (usando il blocco note).Using the panel on the left again, scroll to the Table Service section, and click Tables (or Browse Tables, in newer Portals) and take a copy of the Table URL (using your Notepad). Questo valore verrà usato più avanti in questo corso, quando si collega la tabella all'applicazione Power bi .You will use this value later in this course, when linking your table to your Power BI application.

    nuova tabella creata

Capitolo 12-completamento della tabella di AzureChapter 12 - Completing the Azure Table

Ora che l'account di archiviazione del servizio tabelle è stato configurato, è possibile aggiungervi dati, che verranno usati per archiviare e recuperare le informazioni.Now that your Table Service storage account has been setup, it is time to add data to it, which will be used to store and retrieve information. La modifica delle tabelle può essere eseguita tramite Visual Studio.The editing of your Tables can be done through Visual Studio.

  1. Aprire Visual Studio (non Visual Studio Code).Open Visual Studio (not Visual Studio Code).

  2. Dal menu fare clic su Visualizza > Cloud Explorer.From the menu, click View > Cloud Explorer.

    Aprire Cloud Explorer

  3. Il Cloud Explorer verrà aperto come elemento ancorato (essere paziente, perché il caricamento potrebbe richiedere tempo).The Cloud Explorer will open as a docked item (be patient, as loading may take time).

    Avviso

    Se la sottoscrizione usata per creare gli account di archiviazione non è visibile, assicurarsi di disporre di:If the subscription you used to create your Storage Accounts is not visible, ensure that you have:

    • Si è connessi allo stesso account usato per il portale di Azure.Logged in to the same account as the one you used for the Azure Portal.

    • È stata selezionata la sottoscrizione dalla pagina di gestione degli account. potrebbe essere necessario applicare un filtro dalle impostazioni dell'account:Selected your subscription from the Account Management page (you may need to apply a filter from your account settings):

      trova sottoscrizione

  4. Verranno visualizzati i servizi cloud di Azure.Your Azure cloud Services will be shown. Trovare gli account di archiviazione e fare clic sulla freccia a sinistra di per espandere gli account.Find Storage Accounts and click the arrow to the left of that to expand your accounts.

    aprire gli account di archiviazione

  5. Una volta espansa, l' account di archiviazione appena creato dovrebbe essere disponibile.Once expanded, your newly created Storage account should be available. Fare clic sulla freccia a sinistra della risorsa di archiviazione, quindi, una volta espansa, trovare le tabelle e fare clic sulla freccia accanto a questa, per visualizzare la tabella creata nell'ultimo capitolo.Click the arrow to the left of your storage, and then once that is expanded, find Tables and click the arrow next to that, to reveal the Table you created in the last Chapter. Fare doppio clic sulla tabella.Double-click your Table.

  6. La tabella verrà aperta al centro della finestra di Visual Studio.Your table will be opened in the center of your Visual Studio window. Fare clic sull'icona della tabella con il + segno (più).Click the table icon with the + (plus) on it.

    Aggiungi nuova tabella

  7. Verrà visualizzata una finestra con la richiesta di aggiungere un'entità.A window will appear prompting for you to Add Entity. Si creerà solo un'entità, anche se avranno tre proprietà.You will create only one entity, though it will have three properties. Si noterà che PartitionKey e RowKey sono già disponibili, perché vengono usati dalla tabella per trovare i dati.You will notice that PartitionKey and RowKey are already provided, as these are used by the table to find your data.

    chiave di partizione e di riga

  8. Aggiornare i valori seguenti:Update the following values:

    • Nome: PartitionKey, valore: PK_IoTMessagesName: PartitionKey, Value: PK_IoTMessages

    • Nome: RowKey, valore: RK_1_IoTMessagesName: RowKey, Value: RK_1_IoTMessages

  9. Quindi, fare clic su Aggiungi proprietà (in basso a sinistra della finestra Aggiungi entità ) e aggiungere la proprietà seguente:Then, click Add property (to the lower left of the Add Entity window) and add the following property:

    • MessageContent, sotto forma di stringa, lasciare vuoto il valore.MessageContent, as a string, leave the Value empty.
  10. La tabella deve corrispondere a quella dell'immagine seguente:Your table should match the one in the image below:

    Aggiungi valori corretti

    Nota

    Il motivo per cui l'entità ha il numero 1 nella chiave di riga è perché potrebbe essere necessario aggiungere altri messaggi, qualora si desideri sperimentare ulteriormente questo corso.The reason why the entity has the number 1 in the row key, is because you might want to add more messages, should you desire to experiment further with this course.

  11. Al termine, fare clic su OK .Click OK when you are finished. La tabella è ora pronta per essere usata.Your table is now ready to be used.

Capitolo 13: creare una app per le funzioni di AzureChapter 13 - Create an Azure Function App

A questo punto è necessario creare un app per le funzioni di Azure, che verrà chiamato dal servizio Hub Internet delle cose per archiviare i messaggi di IOT Edge dispositivo nel servizio tabelle , creato nel capitolo precedente.It is now time to create an Azure Function App, which will be called by the IoT Hub Service to store the IoT Edge device messages in the Table Service, which you created in the previous Chapter.

In primo luogo, è necessario creare un file che consentirà alla funzione di Azure di caricare le librerie necessarie.First, you need to create a file that will allow your Azure Function to load the libraries you need.

  1. Aprire il blocco note (premere il tasto Windows e digitare notepad).Open Notepad (press the Windows Key, and type notepad).

    Apri blocco note

  2. Con blocco note aperto, inserire la struttura JSON riportata di seguito.With Notepad open, insert the JSON structure below into it. Una volta eseguita questa operazione, salvarla sul desktop come project.js.Once you have done that, save it on your desktop as project.json. Questo file definisce le librerie che la funzione utilizzerà.This file defines the libraries your function will use. Se è stato usato NuGet, avrà un aspetto familiare.If you have used NuGet, it will look familiar.

    Avviso

    È importante che la denominazione sia corretta; Assicurarsi che non disponga di un'estensione di file txt .It is important that the naming is correct; ensure it does NOT have a .txt file extension. Per informazioni di riferimento, vedere di seguito:See below for reference:

    Salvataggio JSON

    {
    "frameworks": {
        "net46":{
        "dependencies": {
            "WindowsAzure.Storage": "9.2.0"
        }
        }
    }
    }
    
  3. Accedere al portale di Azure.Log in to the Azure Portal.

  4. Una volta effettuato l'accesso, fare clic su Crea una risorsa nell'angolo in alto a sinistra e cercare app per le funzioni e premere il tasto invio per eseguire la ricerca.Once you are logged in, click on Create a resource in the top left corner, and search for Function App, and press the Enter key, to search. Fare clic su app per le funzioni nei risultati per aprire un nuovo pannello.Click Function App from the results, to open a new panel.

    Cerca app per le funzioni

  5. Il nuovo pannello fornirà una descrizione del servizio app per le funzioni .The new panel will provide a description of the Function App Service. Nella parte inferiore sinistra di questo pannello fare clic sul pulsante Crea per creare un'associazione con il servizio.At the bottom left of this panel, click the Create button, to create an association with this Service.

    istanza dell'app per le funzioni

  6. Una volta fatto clic su Crea, compilare quanto segue:Once you have clicked on Create, fill in the following:

    1. Per nome app, inserire il nome desiderato per l'istanza del servizio.For App name, insert your desired name for this Service instance.

    2. Selezionare una Sottoscrizione.Select a Subscription.

    3. Selezionare il piano tariffario appropriato, se è la prima volta che si crea un servizio app per le funzioni, sarà disponibile un livello gratuito.Select the pricing tier appropriate for you, if this is the first time creating a Function App Service, a free tier should be available to you.

    4. Scegliere un gruppo di risorse o crearne uno nuovo.Choose a Resource Group or create a new one. Un gruppo di risorse consente di monitorare, controllare l'accesso, effettuare il provisioning e gestire la fatturazione per una raccolta di asset di Azure.A resource group provides a way to monitor, control access, provision, and manage, billing for a collection of Azure assets. Si consiglia di lasciare tutti i servizi di Azure associati a un singolo progetto (ad esempio questi corsi) in un gruppo di risorse comune).It is recommended to keep all the Azure Services associated with a single project (e.g. such as these courses) under a common resource group).

      Per altre informazioni sui gruppi di risorse di Azure, seguire questo collegamento per informazioni su come gestire un gruppo di risorse.If you wish to read more about Azure Resource Groups, please follow this link on how to manage a Resource Group.

    5. Per sistema operativo, fare clic su Windows, che corrisponde alla piattaforma desiderata.For OS, click Windows, as that is the intended platform.

    6. Selezionare un piano di hosting . questa esercitazione usa un piano a consumo.Select a Hosting Plan (this tutorial is using a Consumption Plan.

    7. Selezionare un percorso (scegliere la stessa posizione della risorsa di archiviazione compilata nel passaggio precedente)Select a Location (choose the same location as the storage you have built in the previous step)

    8. Per la sezione archiviazione è necessario selezionare il servizio di archiviazione creato nel passaggio precedente.For the Storage section, you must select the Storage Service you created in the previous step.

    9. Non sarà necessario Application Insights in questa app, quindi è possibile lasciarla disattivata.You will not need Application Insights in this app, so feel free to leave it Off.

    10. Fare clic su Crea.Click Create.

      Crea nuova istanza

  7. Una volta fatto clic su Crea, sarà necessario attendere il completamento della creazione del servizio. l'operazione potrebbe richiedere un minuto.Once you have clicked on Create, you will have to wait for the Service to be created, this might take a minute.

  8. Dopo la creazione dell'istanza del servizio, verrà visualizzata una notifica nel portale.A notification will appear in the Portal once the Service instance is created.

    nuova notifica

  9. Fare clic sulla notifica, una volta completata la distribuzione.Click on the notification, once deployment is successful (has finished).

  10. Fare clic sul pulsante Vai alla risorsa nella notifica per esplorare la nuova istanza del servizio.Click the Go to resource button in the notification to explore your new Service instance.

    Vai alla risorsa

  11. Sul lato sinistro del nuovo pannello, fare clic sull' + icona (segno più) accanto a funzioni per creare una nuova funzione.In the left side of the new panel, click the + (plus) icon next to Functions, to create a new function.

    Aggiungi nuova funzione

  12. All'interno del pannello centrale verrà visualizzata la finestra di creazione della funzione .Within the central panel, the Function creation window will appear. Scorrere ulteriormente verso il basso e fare clic su funzione personalizzata.Scroll down further, and click on Custom function.

    funzione personalizzata

  13. Scorrere verso il basso la pagina successiva finché non viene trovato l'hub delle cose (hub eventi), quindi fare clic su di esso.Scroll down the next page, until you find IoT Hub (Event Hub), then click on it.

    funzione personalizzata

  14. Nel Pannello Hub eventi (hub eventi) impostare la lingua su C# e quindi fare clic su nuovo.In the IoT Hub (Event Hub) blade, set the Language to C# and then click on new.

    funzione personalizzata

  15. Nella finestra che verrà visualizzata verificare che sia selezionata l'opzione Hub Internet e che il nome del campo dell' Hub Internet corrisponda al nome del servizio Hub Internet che è stato creato in precedenza (nel passaggio 8 del capitolo 3).In the window that will appear, make sure that IoT Hub is selected and the name of the IoT Hub field corresponds with the name of your IoT Hub Service that you have created previously (in step 8, of Chapter 3). Fare quindi clic sul pulsante Seleziona .Then click the Select button.

    funzione personalizzata

  16. Tornare al Pannello Hub eventi (hub eventi) , fare clic su Crea.Back on the IoT Hub (Event Hub) blade, click on Create.

    funzione personalizzata

  17. Si verrà reindirizzati all'editor di funzioni.You will be redirected to the function editor.

    funzione personalizzata

  18. Eliminare tutto il codice e sostituirlo con quanto segue:Delete all the code in it and replace it with the following:

    #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. Modificare le variabili seguenti, in modo che corrispondano ai valori appropriati (valori di tabella e di archiviazione , rispettivamente dal passaggio 11 e 13 del capitolo 11), che si troveranno nell'account di archiviazione:Change the following variables, so that they correspond to the appropriate values (Table and Storage values, from step 11 and 13, respectively, of Chapter 11), that you will find in your Storage Account:

    • TableName, con il nome della tabella che si trova nell' account di archiviazione.tableName, with the name of your Table located in your Storage Account.
    • tableURL, con l'URL della tabella che si trova nell' account di archiviazione.tableURL, with the URL of your Table located in your Storage Account.
    • storageAccountName, con il nome del valore corrispondente al nome del nome dell' account di archiviazione .storageAccountName, with the name of the value corresponding with the name of your Storage Account name.
    • storageAccountKey, con la chiave ottenuta nel servizio di archiviazione creato in precedenza.storageAccountKey, with the Key you have obtained in the Storage Service you have created previously.

    funzione personalizzata

  20. Con il codice sul posto, fare clic su Salva.With the code in place, click Save.

  21. Fare quindi clic sull' < icona (freccia) sul lato destro della pagina.Next, click the < (arrow) icon, on the right-hand side of the page.

    funzione personalizzata

  22. Un pannello scorrerà verso destra.A panel will slide in from the right. In tale pannello fare clic su carica e verrà visualizzato un browser file .In that panel, click Upload, and a File Browser will appear.

  23. Passare a e fare clic sul file project.js , creato in precedenza nel blocco note , quindi fare clic sul pulsante Apri .Navigate to, and click, the project.json file, which you created in Notepad previously, and then click the Open button. Questo file definisce le librerie che la funzione utilizzerà.This file defines the libraries that your function will use.

    funzione personalizzata

  24. Quando il file è stato caricato, verrà visualizzato nel pannello a destra.When the file has uploaded, it will appear in the panel on the right. Facendo clic su di esso verrà aperto nell'editor di funzioni .Clicking it will open it within the Function editor. Deve essere esattamente uguale all'immagine successiva.It must look exactly the same as the next image.

    funzione personalizzata

  25. A questo punto sarebbe opportuno testare la funzionalità della funzione per archiviare il messaggio nella tabella.At this point it would be good to test the capability of your Function to store the message on your Table. Sul lato superiore destro della finestra fare clic su test.On the top right side of the window, click on Test.

    funzione personalizzata

  26. Inserire un messaggio sul corpo della richiesta, come illustrato nell'immagine precedente, e fare clic su Run (Esegui).Insert a message on the Request body, as shown in the image above, and click on Run.

  27. La funzione verrà eseguita, visualizzando lo stato del risultato (si noterà lo stato verde 202 accettato, sopra la finestra di output , il che significa che è stata effettuata una chiamata riuscita):The function will run, displaying the result status (you will notice the green Status 202 Accepted, above the Output window, which means it was a successful call):

    Risultato output

Capitolo 14-visualizzare i messaggi attiviChapter 14 - View active messages

Se ora si apre Visual Studio (non Visual Studio Code), è possibile visualizzare il risultato del messaggio di test, in quanto verrà archiviato nell'area della stringa MessageContent .If you now open Visual Studio (not Visual Studio Code), you can visualize your test message result, as it will be stored in the MessageContent string area.

funzione personalizzata

Con il servizio tabelle e app per le funzioni sul posto, i messaggi di Ubuntu Device verranno visualizzati nella tabella IoTMessages .With the Table Service and Function App in place, your Ubuntu device messages will appear in your IoTMessages Table. Se non è già in esecuzione, riavviare il dispositivo e sarà possibile visualizzare i messaggi di risultato dal dispositivo e il modulo nella tabella tramite l'uso di Visual Studio Cloud Explorer.If not already running, start your device again, and you will be able to see the result messages from your device, and module, within your Table, through using Visual Studio Cloud Explorer.

Visualizza dati

Capitolo 15-installazione di Power BIChapter 15 - Power BI Setup

Per visualizzare i dati dal dispositivo Internet delle cose, configurare Power bi (versione desktop), per raccogliere i dati dal servizio tabelle appena creato.To visualize the data from your IOT device you will setup Power BI (desktop version), to collect the data from the Table Service, which you just created. La versione HoloLens di Power bi utilizzerà quindi i dati per visualizzare il risultato.The HoloLens version of Power BI will then use that data to visualize the result.

  1. Aprire il Microsoft Store in Windows 10 e cercare Power bi desktop.Open the Microsoft Store on Windows 10 and search for Power BI Desktop.

    Power BI

  2. Scaricare l'applicazione.Download the application. Al termine del download, aprirlo.Once it has finished downloading, open it.

  3. Accedere a Power bi con l' account di Microsoft 365.Log into Power BI with your Microsoft 365 account. Per iscriversi, è possibile essere reindirizzati a un browser.You may be redirected to a browser, to sign up. Una volta effettuata l'iscrizione, tornare all'app Power BI ed eseguire di nuovo l'accesso.Once you are signed up, go back to the Power BI app, and sign in again.

  4. Fare clic su Ottieni dati , quindi fare clic su altro.Click on Get Data and then click on More....

    Power BI

  5. Fare clic su Azure, archiviazione tabelle di Azure e quindi su Connetti.Click Azure, Azure Table Storage, then click on Connect.

    Power BI

  6. Verrà richiesto di inserire l'URL della tabella raccolto in precedenza (nel passaggio 13 del capitolo 11), durante la creazione del servizio tabelle.You will be prompted to insert the Table URL that you collected earlier (in step 13 of Chapter 11), while creating your Table Service. Dopo aver inserito l'URL, eliminare la parte del percorso che fa riferimento alla tabella "subfolder" (che è stata IoTMessages, in questo corso).After inserting the URL, delete the portion of the path referring to the Table "sub-folder" (which was IoTMessages, in this course). Il risultato finale dovrebbe essere come visualizzato nell'immagine seguente.The final result should be as displayed in the image below. Fare quindi clic su OK.Then click on OK.

    Power BI

  7. Verrà richiesto di inserire la chiave di archiviazione annotata (nel passaggio 11 del capitolo 11) inprecedenza durante la creazione dell'archiviazione tabelle.You will be prompted to insert the Storage Key that you noted (in step 11 of Chapter 11) earlier while creating your Table Storage. Fare quindi clic su Connetti.Then click on Connect.

    Power BI

  8. Verrà visualizzato un Pannello dello strumento di navigazione , quindi selezionare la casella accanto alla tabella e fare clic su carica.A Navigator Panel will be displayed, tick the box next to your Table and click on Load.

    Power BI

  9. La tabella è stata caricata in Power BI, ma richiede una query per visualizzare i valori in esso contenuti.Your table has now been loaded on Power BI, but it requires a query to display the values in it. A tale scopo, fare clic con il pulsante destro del mouse sul nome della tabella che si trova nel Pannello campi sul lato destro dello schermo.To do so, right-click on the table name located in the FIELDS panel at the right side of the screen. Quindi fare clic su modifica query.Then click on Edit Query.

    Power BI

  10. Un Editor Power query si aprirà come nuova finestra, visualizzando la tabella.A Power Query Editor will open up as a new window, displaying your table. Fare clic sul record di parole nella colonna contenuto della tabella per visualizzare il contenuto archiviato.Click on the word Record within the Content column of the table, to visualize your stored content.

    Power BI

  11. Fare clic su nella tabella nella parte superiore sinistra della finestra.Click on Into Table, at the top-left of the window.

    Power BI

  12. Fare clic su chiudi & applica.Click on Close & Apply.

    Power BI

  13. Al termine del caricamento della query, all'interno del Pannello campi, sul lato destro dello schermo, selezionare le caselle corrispondenti al nome e al valore dei parametri per visualizzare il contenuto della colonna MessageContent .Once it has finished loading the query, within the FIELDS panel, on the right side of the screen, tick the boxes corresponding to the parameters Name and Value, to visualize the MessageContent column content.

    Power BI

  14. Fare clic sull' icona del disco Blu nella parte superiore sinistra della finestra per salvare il lavoro in una cartella di propria scelta.Click on the blue disk icon at the top left of the window to save your work in a folder of your choice.

    Power BI

  15. È ora possibile fare clic sul pulsante pubblica per caricare la tabella nell'area di lavoro.You can now click on the Publish button to upload your table to your Workspace. Quando richiesto, fare clic su area di lavoro personale e fare clic su Seleziona.When prompted, click My workspace and click Select. Attendere che visualizzi il risultato corretto dell'invio.Wait for it to display the successful result of the submission.

    Power BI

    Power BI

Avviso

Il capitolo seguente è specifico di HoloLens.The following Chapter is HoloLens specific. Power BI non è attualmente disponibile come applicazione immersiva, ma è possibile eseguire la versione desktop nel portale per la realtà mista di Windows (noto anche come Cliff House), tramite l'app desktop.Power BI is not currently available as an immersive application, however you can run the desktop version in the Windows Mixed Reality Portal (aka Cliff House), through the Desktop app.

Capitolo 16: visualizzare i dati Power BI in HoloLensChapter 16 - Display Power BI data on HoloLens

  1. Nella HoloLens accedere al Microsoft Store, toccando la relativa icona nell'elenco delle applicazioni.On your HoloLens, log in to the Microsoft Store, by tapping on its icon in the applications list.

    Power BI HL

  2. Cercare e scaricare l'applicazione Power bi .Search and then download the Power BI application.

    Power BI HL

  3. Avviare Power bi dall'elenco delle applicazioni.Start Power BI from your applications list.

  4. Power bi possibile richiedere l'accesso all'account di Microsoft 365.Power BI might ask you to login to your Microsoft 365 account.

  5. Una volta all'interno dell'app, l'area di lavoro verrà visualizzata per impostazione predefinita, come illustrato nell'immagine seguente.Once inside the app, the workspace should display by default as shown in the image below. Se ciò non accade, è sufficiente fare clic sull'icona dell'area di lavoro sul lato sinistro della finestra.If that does not happen, simply click on the workspace icon on the left side of the window.

    Power BI HL

L'applicazione dell'hub Internet è stata completataYour finished your IoT Hub application

Congratulazioni, è stato creato un servizio hub Internet delle cose con un dispositivo periferico della macchina virtuale simulato.Congratulations, you have successfully created an IoT Hub Service, with a simulated Virtual Machine Edge device. Il dispositivo può comunicare i risultati di un modello di apprendimento automatico a un servizio tabelle di Azure, semplificato da un app per le funzioni di Azure, che viene letto in Power BI e visualizzato all'interno di una HoloLens Microsoft.Your device can communicate the results of a machine learning model to an Azure Table Service, facilitated by an Azure Function App, which is read into Power BI, and visualized within a Microsoft HoloLens.

Power BI

Esercizi aggiuntiviBonus exercises

Esercizio 1Exercise 1

Espandere la struttura di messaggistica archiviata nella tabella e visualizzarla come grafico.Expand the messaging structure stored in the table and display it as a graph. È possibile che si desideri raccogliere più dati e archiviarli nella stessa tabella per essere visualizzati in un secondo momento.You might want to collect more data and store it in the same table, to be later displayed.

Esercizio 2Exercise 2

Creare un ulteriore modulo "acquisizione fotocamera" da distribuire nella bacheca degli utenti, in modo che possa acquisire immagini attraverso la fotocamera da analizzare.Create an additional "camera capture" module to be deployed on the IoT board, so that it can capture images through the camera to be analyzed.