MR 및 Azure 313: IoT Hub 서비스MR and Azure 313: IoT Hub Service


Mixed Reality 아카데미 자습서는 HoloLens(1세대) 및 Mixed Reality 몰입형 헤드셋을 염두에 두고 설계되었습니다.The Mixed Reality Academy tutorials were designed with HoloLens (1st gen) and Mixed Reality Immersive Headsets in mind. 따라서 이러한 디바이스 개발에 대한 지침을 계속 찾고 있는 개발자를 위해 이러한 자습서를 그대로 두는 것이 중요합니다.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. 이러한 자습서는 HoloLens 2에 사용되는 최신 도구 집합 또는 상호 작용으로 업데이트되지 않습니다.These tutorials will not be updated with the latest toolsets or interactions being used for HoloLens 2. 대신 지원되는 디바이스에서 계속 작동하도록 유지 관리됩니다.They will be maintained to continue working on the supported devices. 향후에는 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. 이 알림은 게시 될 때 해당 자습서에 대 한 링크를 사용 하 여 업데이트 됩니다.This notice will be updated with a link to those tutorials when they are posted.

과정 결과

이 과정에서는 Ubuntu 16.4 운영 체제를 실행 하는 가상 머신에서 Azure IoT Hub 서비스 를 구현 하는 방법에 대해 설명 합니다.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. 그런 다음 azure 함수 앱 는 Ubuntu VM에서 메시지를 수신 하 고 azure Table Service 내에 결과를 저장 하는 데 사용 됩니다.An Azure Function App will then be used to receive messages from your Ubuntu VM, and store the result within an Azure Table Service. 그러면 Microsoft HoloLens 또는 모던 (VR) 헤드셋의 Power BI 를 사용 하 여이 데이터를 볼 수 있습니다.You will then be able to view this data using Power BI on Microsoft HoloLens or immersive (VR) headset.

이 과정의 내용은 IoT Edge 장치에 적용 될 수 있지만,이 과정에서는 가상 컴퓨터 환경에 집중 하는 것이 좋습니다. 따라서 실제에 지 장치에 대 한 액세스가 필요 하지 않습니다.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.

이 과정을 완료 하면 다음을 배울 수 있습니다.By completing this course, you will learn to:

  • IoT 장치를 표시 하는 가상 컴퓨터 (Ubuntu 16 OS)에 IoT Edge 모듈 을 배포 합니다.Deploy an IoT Edge module to a Virtual Machine (Ubuntu 16 OS), which will represent your IoT device.
  • 컨테이너에 저장 된 이미지를 분석 하는 코드를 사용 하 여 Azure Custom Vision Tensorflow 모델 을 Edge 모듈에 추가 합니다.Add an Azure Custom Vision Tensorflow Model to the Edge module, with code that will analyze images stored in the container.
  • 분석 결과 메시지를 IoT Hub 서비스로 다시 보내도록 모듈을 설정 합니다.Set up the module to send the analysis result message back to your IoT Hub Service.
  • Azure 함수 앱 을 사용 하 여 azure 테이블 내에 메시지를 저장 합니다.Use an Azure Function App to store the message within an Azure Table.
  • Power BI 설정 하 여 저장 된 메시지를 수집 하 고 보고서를 만듭니다.Set up Power BI to collect the stored message and create a report.
  • Power BI 내에서 IoT 메시지 데이터를 시각화 합니다.Visualize your IoT message data within Power BI.

사용할 서비스는 다음과 같습니다.The Services you will use include:

  • Azure IoT Hub 는 개발자가 IoT 자산을 연결, 모니터링 및 관리 하는 데 사용할 수 있는 Microsoft Azure 서비스입니다.Azure IoT Hub is a Microsoft Azure Service which allows developers to connect, monitor, and manage, IoT assets. 자세한 내용은 Azure IoT Hub 서비스 페이지를 참조 하세요.For more information, visit the Azure IoT Hub Service page.

  • Azure Container Registry 는 개발자가 다양 한 유형의 컨테이너에 대해 컨테이너 이미지를 저장할 수 있도록 하는 Microsoft Azure 서비스입니다.Azure Container Registry is a Microsoft Azure Service which allows developers to store container images, for various types of containers. 자세한 내용은 Azure Container Registry 서비스 페이지를 참조 하세요.For more information, visit the Azure Container Registry Service page.

  • Azure 함수 앱 는 개발자가 azure에서 작은 코드, ' 함수 '를 실행할 수 있도록 하는 Microsoft Azure 서비스입니다.Azure Function App is a Microsoft Azure Service, which allows developers to run small pieces of code, 'functions', in Azure. 이렇게 하면 다양 한 이점을 얻을 수 있는 로컬 응용 프로그램이 아닌 클라우드로 작업을 위임할 수 있습니다.This provides a way to delegate work to the cloud, rather than your local application, which can have many benefits. Azure Functions 는 C # , F # , Node.js, Java 및 PHP를 비롯 한 몇 가지 개발 언어를 지원 합니다.Azure Functions supports several development languages, including C#, F#, Node.js, Java, and PHP. 자세한 내용은 Azure Functions 페이지를 참조 하세요.For more information, visit the Azure Functions page.

  • Azure Storage: Tables 는 개발자가 구조화 된 비 SQL 데이터를 클라우드에 저장 하 여 어디서 나 쉽게 액세스할 수 있도록 하는 Microsoft Azure 서비스입니다.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. 이 서비스는 스키마 없는 디자인을 boasts, 필요에 따라 테이블의 진화를 허용 하므로 매우 유연 합니다.The Service boasts a schema-less design, allowing for the evolution of tables as needed, and thus is very flexible. 자세한 내용은 Azure Tables 페이지를 참조 하세요.For more information, visit the Azure Tables page

이 과정에서는 IoT Hub 서비스를 설정 하 고 사용 하는 방법을 설명 하 고 장치에서 제공 하는 응답을 시각화 합니다.This course will teach you how to setup and use the IoT Hub Service, and then visualize a response provided by a device. 사용자가 빌드할 수 있는 사용자 지정 IoT Hub 서비스 설정에 이러한 개념을 적용 하는 것이 좋습니다.It will be up to you to apply these concepts to a custom IoT Hub Service setup, which you might be building.

디바이스 지원Device support

과정Course HoloLensHoloLens 몰입형 헤드셋Immersive headsets
MR 및 Azure 313: IoT Hub 서비스MR and Azure 313: IoT Hub Service ✔️✔️ ✔️✔️

사전 요구 사항Prerequisites

Microsoft HoloLens를 비롯 하 여 혼합 현실에서 개발 하기 위한 최신 필수 구성 요소는 도구 설치 문서를 참조 하세요.For the most up-to-date prerequisites for developing with mixed reality, including with the Microsoft HoloLens, visit the Install the tools article.


이 자습서는 Python을 사용 하는 기본 경험이 있는 개발자를 위해 작성 되었습니다.This tutorial is designed for developers who have basic experience with Python. 또한이 문서에서 사전 요구 사항 및 작성 된 지침은 작성 시 테스트 되 고 확인 된 내용 (7 월 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). 도구 설치 문서에 나와 있는 것 처럼 최신 소프트웨어를 무료로 사용할 수 있지만,이 과정의 정보가 아래에 나열 된 것과 같은 최신 소프트웨어에서 찾을 수 있는 것으로 가정 하면 안 됩니다.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.

다음 하드웨어 및 소프트웨어가 필요 합니다.The following hardware and software is required:

  • Windows 10의 작성자 업데이트 (또는 그 이상), 개발자 모드 사용Windows 10 Fall Creators Update (or later), Developer Mode enabled


    Windows 10 Home Edition에서 Hyper-v를 사용 하 여 가상 컴퓨터를 실행할 수 없습니다.You cannot run a Virtual Machine using Hyper-V on Windows 10 Home Edition.

  • Windows 10 SDK (최신 버전)Windows 10 SDK (latest version)

  • HoloLens, 개발자 모드 사용A HoloLens, Developer Mode enabled

  • Visual Studio 2017.15.4 (Azure 클라우드 탐색기 액세스 하는 데만 사용 됨)Visual Studio 2017.15.4 (Only used to access the Azure Cloud Explorer)

  • Azure 및 IoT Hub 서비스에 대 한 인터넷 액세스.Internet Access for Azure, and for IoT Hub Service. 자세한 내용은 IoT Hub 서비스 페이지에 대 한 링크를 참조 하세요.For more information, please follow this link to IoT Hub Service page

  • 기계 학습 모델입니다.A machine learning model. 모델을 사용할 준비가 되지 않은 경우 이 과정에서 제공 되는 모델을 사용할 수있습니다.If you do not have your own ready to use model, you can use the model provided with this course.

  • Windows 10 개발 컴퓨터에서 hyper-v 소프트웨어를 사용 하도록 설정 했습니다.Hyper-V software enabled on your Windows 10 development machine.

  • 개발 컴퓨터에서 실행 되는 Ubuntu (16.4 또는 18.4)를 실행 하는 가상 머신 또는 Linux를 실행 하는 별도의 컴퓨터 (Ubuntu 16.4 또는 18.4)를 사용할 수 있습니다.A Virtual Machine running Ubuntu (16.4 or 18.4), running on your development machine or alternatively you can use a separate computer running Linux (Ubuntu 16.4 or 18.4). Windows에서 Hyper-v를 사용 하 여 VM을 만드는 방법에 대 한 자세한 내용은 "시작 하기 전에" 챕터에서 확인할 수 있습니다. ( can find more information on how to create a VM on Windows using Hyper-V in the "Before you Start" chapter.(

시작하기 전에Before you start

  1. HoloLens를 설정 하 고 테스트 합니다.Set up and test your HoloLens. HoloLens를 설정 하는 데 지원이 필요한 경우 hololens 설정 문서를 방문해야 합니다.If you need support setting up your HoloLens, make sure to visit the HoloLens setup article.
  2. 새 HoloLens 앱 개발을 시작할 때 보정센서 조정을 수행 하는 것이 좋습니다 (경우에 따라 각 사용자에 대해 해당 작업을 수행 하는 데 도움이 될 수 있음).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).

보정에 대 한 도움말을 보려면 HoloLens 보정 문서에대 한 다음 링크를 참조 하세요.For help on Calibration, please follow this link to the HoloLens Calibration article.

센서 조정에 대 한 도움말을 보려면 HoloLens 센서 조정 문서에 대 한 링크를참조 하세요.For help on Sensor Tuning, please follow this link to the HoloLens Sensor Tuning article.

  1. Hyper-v 를 사용 하 여 Ubuntu 가상 머신을 설정 합니다.Set up your Ubuntu Virtual Machine using Hyper-V. 프로세스에 도움이 되는 리소스는 다음과 같습니다.The following resources will help you with the process.

    1. 먼저이 링크에 따라 Ubuntu 16.04.4 LTS (Xenial Xerus) ISO를 다운로드합니다.First, follow this link to download the Ubuntu 16.04.4 LTS (Xenial Xerus) ISO. AMD64 (64 비트 PC) 데스크톱 이미지 를 선택 합니다.Select the 64-bit PC (AMD64) desktop image.
    2. Windows 10 컴퓨터에서 hyper-v 를 사용 하도록 설정 했는지 확인 합니다.Make sure Hyper-V is enabled on your Windows 10 machine. Windows 10에서 hyper-v를 설치 하 고 사용 하도록 설정하는 방법에 대 한 지침은이 링크를 참조 하세요.You can follow this link for guidance on installing and enabling Hyper-V on Windows 10.
    3. Hyper-v를 시작 하 고 새 Ubuntu VM을 만듭니다.Start Hyper-V and create a new Ubuntu VM. Hyper-v를 사용 하 여 VM을 만드는 방법에대 한 단계별 가이드는 다음 링크를 참조 하세요.You can follow this link for a step by step guide on how to create a VM with Hyper-V. "부팅 가능한 이미지 파일에서 운영 체제 설치" 를 요청 하는 경우 이전에 다운로드 한 Ubuntu ISO 를 선택 합니다.When requested to "Install an operating system from a bootable image file", select the Ubuntu ISO you have download earlier.


    Hyper-v 빠른 생성 을 사용 하지 않는 것이 좋습니다.Using Hyper-V Quick Create is not suggested.

1 장-Custom Vision 모델 검색Chapter 1 - Retrieve the Custom Vision model

이 과정에서는 이미지에서 키보드와 마우스를 검색 하는 미리 작성 된 Custom Vision 모델 에 액세스할 수 있습니다.With this course you will have access to a pre-built Custom Vision model that detects keyboards and mice from images. 이를 사용 하는 경우 2 장으로이동 합니다.If you use this, proceed to Chapter 2.

그러나 사용자 고유의 Custom Vision 모델을 사용 하려는 경우 다음 단계를 따를 수 있습니다.However, you can follow these steps if you wish to use your own Custom Vision model:

  1. Custom Vision 프로젝트 에서 성능 탭으로 이동 합니다.In your Custom Vision Project go to the Performance tab.


    모델을 내보내려면 compact 도메인을 사용 해야 합니다.Your model must use a compact domain, to export the model. 프로젝트에 대 한 설정에서 모델 도메인을 변경할 수 있습니다.You can change your models domain in the settings for your project.

    성능 탭

  2. 내보내려는 반복 을 선택 하 고 내보내기 를 클릭 합니다.Select the Iteration you want to export and click on Export. 블레이드가 표시 됩니다.A blade will appear.

    블레이드 내보내기

  3. 블레이드에서 Docker 파일 을 클릭 합니다.In the blade click Docker File.

    docker 선택

  4. 드롭다운 메뉴에서 Linux 를 클릭 한 다음 다운로드 를 클릭 합니다.Click Linux in the drop-down menu and then click on Download.

    다운로드 클릭

  5. 콘텐츠 압축을 풉니다.Unzip the content. 이 과정의 뒷부분에서이를 사용 합니다.You will use it later in this course.

2 장-Container Registry 서비스Chapter 2 - The Container Registry Service

Container Registry 서비스 는 컨테이너를 호스트 하는 데 사용 되는 리포지토리입니다.The Container Registry Service is the repository used to host your containers.

이 과정에서 빌드하고 사용할 IoT Hub 서비스 는에 지 장치에 배포할 컨테이너를 얻기 위한 Container Registry 서비스 를 나타냅니다.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. 먼저 Azure Portal에 대한이 링크를 따르고 자격 증명으로 로그인 합니다.First, follow this link to the Azure Portal, and login with your credentials.

  2. 리소스 만들기 로 이동 하 여 Container Registry 찾습니다.Go to Create a resource and look for Container Registry.

    컨테이너 레지스트리

  3. 만들기 를 클릭 합니다.Click on Create.

  4. 서비스 설정 매개 변수를 설정 합니다.Set the Service setup parameters:

    1. 프로젝트의 이름을 삽입 합니다 .이 예제에서는 IoTCRegistry 라고 합니다.Insert a name for your project, In this example its called IoTCRegistry.

    2. 리소스 그룹을 선택 하거나 새 리소스 그룹 을 만듭니다.Choose a Resource Group or create a new one. 리소스 그룹은 Azure 자산 컬렉션에 대 한 모니터링, 제어 액세스, 프로 비전 및 관리를 위한 방법을 제공 합니다.A resource group provides a way to monitor, control access, provision, and manage, billing for a collection of Azure assets. 단일 프로젝트와 연결 된 모든 Azure 서비스 (예: 이러한 과정)를 공용 리소스 그룹에 유지 하는 것이 좋습니다.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. 서비스의 위치를 설정 합니다.Set the location of the Service.

    4. 관리 사용자사용 으로 설정 합니다.Set Admin user to Enable.

    5. SKU기본 으로 설정 합니다.Set SKU to Basic.

  5. 만들기 를 클릭 하 고 서비스를 만들 때까지 기다립니다.Click Create and wait for the Services to be created.

  6. Container Registry 성공적으로 생성 되었음을 알리는 알림이 표시 되 면 서비스로 이동 을 클릭 하 여 서비스 페이지로 리디렉션됩니다.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. Container Registry 서비스 페이지에서 액세스 키 를 클릭 합니다.In the Container Registry Service page, click on Access keys.

  8. 다음 매개 변수를 기록해 둡니다 (메모장을 사용할 수 있음).Take note (you could use your Notepad) of the following parameters:

    1. 로그인 서버Login Server
    2. 사용자 이름Username
    3. 암호Password

3 장-IoT Hub 서비스Chapter 3 - The IoT Hub Service

이제 IoT Hub 서비스 를 만들고 설정 하는 과정을 시작 합니다.Now you will begin the creation and setup of your IoT Hub Service.

  1. 아직 로그인 하지 않은 경우 Azure Portal에 로그인 합니다.If not already signed in, log into the Azure Portal.

  2. 로그인 되 면 왼쪽 위 모서리에서 리소스 만들기 를 클릭 하 고 IoT Hub 를 검색 한 다음 Enter 키 를 누릅니다.Once logged in, click on Create a resource in the top left corner, and search for IoT Hub, and click Enter.

저장소 계정 검색

  1. 새 페이지에 저장소 계정 서비스에 대 한 설명이 제공 됩니다.The new page will provide a description of the Storage account Service. 이 프롬프트의 왼쪽 아래에서 만들기 단추를 클릭 하 여이 서비스의 인스턴스를 만듭니다.At the bottom left of this prompt, click the Create button, to create an instance of this Service.

    저장소 인스턴스 만들기

  2. 만들기 를 클릭 하면 패널이 표시 됩니다.Once you have clicked on Create, a panel will appear:

    1. 리소스 그룹을 선택 하거나 새 리소스 그룹 을 만듭니다.Choose a Resource Group or create a new one. 리소스 그룹은 Azure 자산의 컬렉션에 대 한 청구를 모니터링 하 고, 액세스를 제어 하 고, 프로 비전 하 고, 관리 하는 방법을 제공 합니다.A resource group provides a way to monitor, control access, provision and manage billing for a collection of Azure assets. 단일 프로젝트와 연결 된 모든 Azure 서비스 (예: 이러한 과정)를 공용 리소스 그룹에 유지 하는 것이 좋습니다.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).

      Azure 리소스 그룹에 대 한 자세한 내용을 보려면 리소스 그룹을 관리 하는 방법에 대한 다음 링크를 참조 하세요.If you wish to read more about Azure Resource Groups, please follow this link on how to manage a Resource Group.

    2. 적절 한 위치 를 선택 합니다 .이 과정에서 만드는 모든 서비스에서 동일한 위치를 사용 합니다.Select an appropriate Location (Use the same location across all the Services you create in this course).

    3. 이 서비스 인스턴스의 원하는 이름을 삽입 합니다.Insert your desired Name for this Service instance.

  3. 페이지 맨 아래에서 다음: 크기 및 크기 조정 을 클릭 합니다.On the bottom of the page click on Next: Size and scale.

    저장소 인스턴스 만들기

  4. 이 페이지에서 가격 책정 및 크기 조정 계층 을 선택 합니다 (첫 IoT Hub 서비스 인스턴스인 경우 무료 계층을 사용할 수 있어야 함).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. 검토 + 만들기 를 클릭 합니다.Click on Review + Create.

    저장소 인스턴스 만들기

  6. 설정을 검토 하 고 만들기 를 클릭 합니다.Review your settings and click on Create.

    저장소 인스턴스 만들기

  7. IoT Hub 서비스가 성공적으로 생성 되었음을 알리는 알림이 표시 되 면 서비스로 이동 하 여 서비스로 리디렉션할 수 있습니다. 페이지로 이동 합니다.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.

    저장소 인스턴스 만들기

  8. 자동 장치 관리 가 표시 될 때까지 왼쪽 패널을 스크롤하여 IoT Edge 를 클릭 합니다.Scroll the side panel on the left until you see Automatic Device Management, the click on IoT Edge.

    저장소 인스턴스 만들기

  9. 오른쪽에 표시 되는 창에서 IoT Edge 장치 추가 를 클릭 합니다.In the window that appears to the right, click on Add IoT Edge Device. 블레이드가 오른쪽에 표시 됩니다.A blade will appear to the right.

  10. 블레이드에서 새 장치에 장치 ID (선택한 이름)를 제공 합니다.In the blade, provide your new device a Device ID (a name of your choice). 그런 다음 저장 을 클릭합니다.Then, click Save. 선택 자동 생성 된 경우 기본보조 키 가 자동으로 생성 됩니다.The Primary and Secondary Keys will auto generate, if you have Auto Generate ticked.

    저장소 인스턴스 만들기

  11. 새 장치가 나열 되는 IoT Edge 장치 섹션으로 다시 이동 합니다.You will navigate back to the IoT Edge Devices section, where your new device will be listed. 새 장치를 클릭 합니다 (아래 이미지에서 빨간색으로 표시).Click on your new device (outlined in red in the below image).

    저장소 인스턴스 만들기

  12. 표시 되는 장치 세부 정보 페이지에서 연결 문자열 (기본 키)의 복사본을 가져옵니다.On the Device Details page that appears, take a copy of the Connection String (primary key).

    저장소 인스턴스 만들기

  13. 왼쪽 패널로 돌아가 공유 액세스 정책 을 클릭 하 여 엽니다.Go back to the panel on the left, and click Shared access policies, to open it.

  14. 표시 되는 페이지에서 iothubowner 를 클릭 하면 화면 오른쪽에 블레이드가 표시 됩니다.On the page that appears, click iothubowner, and a blade will appear to the right of the screen.

  15. 연결 문자열 (기본 키)의 연결 문자열 (기본 키)을 기록해 둡니다. 나중에 장치에 대 한 연결 문자열 을 설정할 때 사용 합니다.Take note (on your Notepad) of the Connection string (primary key), for later use when setting the Connection String to your device.

    저장소 인스턴스 만들기

4 장-개발 환경 설정Chapter 4 - Setting up the development environment

IoT Hub Edge 에 대 한 모듈을 만들고 배포 하려면 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. Windows용 Docker다운로드할 수 있는 계정을 만들도록 요청 합니다.Docker for Windows, it will ask you to create an account to be able to download.

    windows 용 docker 다운로드download docker for windows


    Docker를 실행 하려면 windows 10 PRO, Enterprise 14393 또는 windows Server 2016 RTM 이 필요 합니다.Docker requires Windows 10 PRO, Enterprise 14393, or Windows Server 2016 RTM, to run. 다른 버전의 Windows 10을 실행 하는 경우 Docker 도구 상자를 사용 하 여 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.

    python 3.6 다운로드download python 3.6

  3. Visual Studio Code (VS Code 라고도 함).Visual Studio Code (also known as VS Code).

    다운로드 VS Codedownload VS Code

위에서 언급 한 소프트웨어를 설치한 후에는 컴퓨터를 다시 시작 해야 합니다.After installing the software mentioned above, you will need to restart your machine.

5 장-Ubuntu 환경 설정Chapter 5 - Setting up the Ubuntu environment

이제 UBUNTU OS를 실행 하는 장치 설정으로 이동할 수 있습니다.Now you can move on to setting up your device running Ubuntu OS. 아래 단계에 따라 필요한 소프트웨어를 설치 하 고 보드에 컨테이너를 배포 합니다.Follow the steps below, to install the necessary software, to deploy your containers on your board:


관리 사용자로 실행 하려면 항상 sudo 를 사용 하 여 터미널 명령 앞에와 야 합니다.You should always precede the terminal commands with sudo to run as admin user. i.e:

sudo docker \<option> \<command> \<argument>
  1. Ubuntu 터미널 을 열고 다음 명령을 사용 하 여 pip 를 설치 합니다.Open the Ubuntu Terminal, and use the following command to install pip:

    [! 힌트] 바로 가기 키 ( 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. 이 장에서는 터미널 에서 장치 저장소를 사용할 수 있는 권한을 묻는 메시지가 표시 될 수 있으며 y/n (예 또는 아니요) 을 입력 하enter 키를 눌러 수락 합니다.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. 명령이 완료 되 면 다음 명령을 사용 하 여 말아 넘기기 를 설치 합니다.Once that command has completed, use the following command to install curl:

        sudo apt install curl
  4. Pip말아 가 설치 되 면 다음 명령을 사용 하 여 IoT Edge 런타임을 설치 합니다 .이는 보드의 모듈을 배포 하 고 제어 하는 데 필요 합니다.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 > ./microsoft-prod.list
        sudo cp ./microsoft-prod.list /etc/apt/sources.list.d/
        curl | 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. 이 시점에서 런타임 구성 파일 을 열고, (메모장에서) IoT Hub 서비스 를 만들 때 (13 장의 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). 터미널에서 다음 줄을 실행 하 여 해당 파일을 엽니다.Run the following line on the terminal to open that file:

        sudo nano /etc/iotedge/config.yaml
  6. 다음과 같이 편집할 준비가 된 config.xml 파일이 표시 됩니다.The config.yaml file will be displayed, ready for you to edit:


    이 파일이 열리면 약간 혼란 스 러 울 수 있습니다.When this file opens, it may be somewhat confusing. 터미널 자체 내에서이 파일을 편집 하는 텍스트입니다.You will be text editing this file, within the Terminal itself.

    1. 키보드의 화살표 키를 사용 하 여 아래로 스크롤합니다 (약간 아래로 스크롤해야 하는 경우).Use the arrow keys on your keyboard to scroll down (you will need to scroll down a little way), to reach the line containing":


    2. 괄호를 포함 한 줄을 앞에서 설명한 장치 연결 문자열로 대체 합니다.Substitute line, including the brackets, with the Device Connection String you have noted earlier.

  7. 연결 문자열을 입력 하 고 키보드에서 Ctrl + X 키를 눌러 파일을 저장 합니다.With your Connection String in place, on your keyboard, press the Ctrl-X keys to save the file. Y 를 입력 하 여 확인 하 라는 메시지를 표시 합니다. 그런 다음 enter 키를 눌러 확인 합니다.It will ask you to confirm by typing Y. Then, press the Enter key, to confirm. 그러면 일반 터미널 로 돌아갑니다.You will go back to the regular Terminal.

  8. 이러한 명령이 모두 성공적으로 실행 되 면 IoT Edge 런타임을 설치 하 게 됩니다.Once these commands have all run successfully, you will have installed the IoT Edge Runtime. 초기화 된 후에는 장치가 전원이 공급 될 때마다 런타임이 자체에서 시작 되 고, 백그라운드에서 제공 되어 IoT Hub 서비스 에서 모듈이 배포 될 때까지 기다립니다.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. 다음 명령줄을 실행 하 여 IoT Edge 런타임을 초기화 합니다.Run the following command line to initialize the IoT Edge Runtime:

        sudo systemctl restart iotedge


    .Yaml 파일 또는 위의 설정을 변경 하는 경우에는 터미널 내에서 위의 다시 시작 줄을 다시 실행 해야 합니다.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. 다음 명령줄을 실행 하 여 IoT Edge 런타임 상태를 확인 합니다.Check the IoT Edge Runtime status by running the following command line. 런타임이 녹색 텍스트로 활성 (실행 중) 상태로 표시 되어야 합니다.The runtime should appear with the status active (running) in green text.

        sudo systemctl status iotedge
  11. Ctrl + C 키를 눌러 상태 페이지를 종료 합니다.Press the Ctrl-C keys, to exit the status page. 다음 명령을 입력 하 여 IoT Edge 런타임이 컨테이너를 올바르게 풀링 하 고 있는지 확인할 수 있습니다.You can verify that the IoT Edge Runtime is pulling the containers correctly by typing the following command:

        sudo docker ps
  12. 두 개의 (2) 컨테이너가 있는 목록이 표시 됩니다.A list with two (2) containers should appear. 이러한 모듈은 IoT Hub 서비스 (edgeAgent 및 edgeHub)에 의해 자동으로 생성 되는 기본 모듈입니다.These are the default modules that are automatically created by the IoT Hub Service (edgeAgent and edgeHub). 사용자 고유의 모듈을 만들고 배포 하면이 목록에서 기본 모듈 아래에 표시 됩니다.Once you create and deploy your own modules, they will appear in this list, underneath the default ones.

6 장-확장 설치Chapter 6 - Install the extensions


다음 몇 장 (6-9)은 Windows 10 컴퓨터에서 수행 됩니다.The next few Chapters (6-9) are to be performed on your Windows 10 machine.

  1. VS Code 를 엽니다.Open VS Code.

  2. VS Code 왼쪽 막대에서 확장 (정사각형) 단추를 클릭 하 여 확장 패널 을 엽니다.Click on the Extensions (square) button on the left bar of VS Code, to open the Extensions panel.

  3. 아래 이미지에 표시 된 것 처럼 다음 확장을 검색 하 고 설치 합니다.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

    컨테이너 만들기

  4. 확장이 설치 되 면 VS Code를 닫았다가 다시 엽니다.Once the extensions are installed, close and re-open VS Code.

  5. VS Code를 한 번 더 열면 > 통합 터미널 보기로 이동 합니다.With VS Code open once more, navigate to View > Integrated terminal.

  6. 이제 Cookiecutter 를 설치 합니다.You will now install Cookiecutter. 터미널에서 다음 bash 명령을 실행 합니다.In the terminal run the following bash command:

        pip install --upgrade --user cookiecutter

    [! 힌트] 명령을 사용 하는 데 문제가 있는 경우:[!HINT] If you have trouble with this command:

    1. VS Code 및/또는 컴퓨터를 다시 시작 합니다.Restart VS Code, and/ or your computer.
    2. Python을 설치 하는 데 사용 하는 것으로 VS Code 터미널 을 전환 해야 할 수도 있습니다. 즉 , 특히 python 환경이 컴퓨터에 이미 설치 되어 있는 경우에 한 합니다.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). 터미널이 열리면 터미널의 오른쪽에 있는 드롭다운 메뉴를 찾을 수 있습니다.With the Terminal open, you will find the drop down menu on the right side of the Terminal. 컨테이너 만들기Create your container
    3. Python 설치 경로가 컴퓨터에 환경 변수로 추가 되었는지 확인 합니다.Make sure the Python installation path is added as Environment Variable on your machine. Cookiecutter는 동일한 위치 경로의 일부 여야 합니다.Cookiecutter should be part of the same location path. 환경 변수에 대 한 자세한 내용은 다음 링크를 참조 하세요.Please follow this link for more information on Environment Variables,
  7. Cookiecutter 설치가 완료 되 면 시스템 환경 내에서 Cookiecutter 가 명령으로 인식 되도록 컴퓨터를 다시 시작 해야 합니다.Once Cookiecutter has finished installing, you should restart your machine, so that Cookiecutter is recognized as a command, within your System's environment.

7 장-컨테이너 솔루션 만들기Chapter 7 - Create your container solution

이 시점에서 모듈을 사용 하 여 Container Registry 에 푸시할 컨테이너를 만들어야 합니다.At this point, you need to create the container, with the module, to be pushed into the Container Registry. 컨테이너를 푸시한 후에는 IoT Hub Edge 서비스를 사용 하 여 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. VS Code에서 보기 > 명령 팔레트 를 클릭 합니다.From VS Code, click View > Command palette.

  2. 색상표에서 Azure IoT Edge: 새 IoT Edge 솔루션 을 검색 하 고 실행 합니다.In the palette, search and run Azure IoT Edge: New Iot Edge Solution.

  3. 솔루션을 만들려는 위치로 이동 합니다.Browse into a location where you want to create your solution. Enter 키를 눌러 위치를 적용 합니다.Press the Enter key, to accept the location.

  4. 솔루션에 이름을 지정 합니다.Give a name to your solution. Enter 키를 눌러 제공 된 이름을 확인 합니다.Press the Enter key, to confirm your provided name.

  5. 이제 솔루션에 대 한 템플릿 프레임 워크를 선택 하 라는 메시지가 표시 됩니다.Now you will be prompted to choose the template framework for your solution. Python 모듈 을 클릭 합니다.Click Python Module. Enter 키를 눌러이 선택을 확인 합니다.Press the Enter key, to confirm this choice.

  6. 모듈에 이름을 지정 합니다.Give a name to your module. Enter 키를 눌러 모듈의 이름을 확인 합니다.Press the Enter key, to confirm the name of your module. 나중에 사용 되므로 모듈 이름에 대해 메모장을 사용 하 여 메모를 작성 해야 합니다.Make sure to take a note (with your Notepad) of the module name, as it is used later.

  7. 미리 빌드된 Docker 이미지 리포지토리 주소가 색상표에 표시 됩니다.You will notice a pre-built Docker Image Repository address will appear on the palette. 다음과 같이 표시 됩니다.It will look like:

    localhost: 5000/-모듈의 이름-.localhost:5000/-THE NAME OF YOUR MODULE-.

  8. Localhost: 5000 을 삭제 하 고 해당 위치에서 Container Registry 서비스 를 만들 때 기록한 Container Registry 로그인 서버 주소 (2 장의 8 단계)를 삽입 합니다.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). Enter 키를 눌러 주소를 확인 합니다.Press the Enter key, to confirm the address.

  9. 이 시점에서 Python 모듈에 대 한 템플릿이 포함 된 솔루션이 만들어지고 해당 구조가 화면 왼쪽에 있는 VS Code의 탐색 탭 에 표시 됩니다.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. 탐색 탭 이 열려 있지 않으면 왼쪽 표시줄에서 맨 위에 있는 단추를 클릭 하 여 열 수 있습니다.If the Explore Tab is not open, you can open it by clicking the top-most button, in the bar on the left.

    컨테이너 만들기

  10. 이 챕터의 마지막 단계에서는 탐색 탭 내에서 env 파일 을 클릭 하 여 열고 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. 이 파일은 git에서 무시 되지만 컨테이너를 빌드하는 동안 Container Registry 서비스 에 액세스 하기 위한 자격 증명을 설정 합니다.This file is ignored by git, but on building the container, will set the credentials to access the Container Registry Service.

    컨테이너 만들기

8 장-컨테이너 솔루션 편집Chapter 8 - Editing your container solution

이제 다음 파일을 업데이트 하 여 컨테이너 솔루션을 완료 합니다.You will now complete the container solution, by updating the following files:

  • py python 스크립트입니다 python script.
  • requirements.txt.requirements.txt.
  • deployment.template.js 합니다.deployment.template.json.
  • Dockerfile. amd64Dockerfile.amd64

그런 다음 python 스크립트에서 Custom Vision 모델 에 대해 일치 시킬 이미지를 확인 하는 데 사용 하는 images 폴더를 만듭니다.You will then create the images folder, used by the python script to check for images to match against your Custom Vision model. 마지막으로, 모델을 읽는 데 도움이 되는 labels.txt 파일을 추가 하 고 모델인 모델 pb 파일을 추가 합니다.Lastly, you will add the labels.txt file, to help read your model, and the model.pb file, which is your model.

  1. VS Code 열린 상태에서 모듈 폴더로 이동 하 고 py 라는 스크립트를 찾습니다.With VS Code open, navigate to your module folder, and look for the script called 이 로그를 두 번 클릭하여 엽니다.Double-click to open it.

  2. 파일의 내용을 삭제 하 고 다음 코드를 삽입 합니다.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.
    # global counters
    # 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 =
        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:
                tf.import_graph_def(graph_def, name='')
            # Create a list of labels
            with open(labels_filename, 'rt') as lf:
                for l in lf:
            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'):
                image ="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)
                    with tf.Session() as sess:     
                        prob_tensor = sess.graph.get_tensor_by_name(output_layer)
                        predictions, =, {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")
            json_message = json.dumps(results_dic)
            print("Json result")
            # 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))      
            # This is the wait time before repeating the analysis
            # Currently set to 10 seconds
    class HubManager(object):
        def __init__(
            self.client_protocol = protocol
            self.client = IoTHubModuleClient()
            # 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):
                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):
            hub_manager = HubManager(protocol)
            while True:
        except IoTHubError as iothub_error:
            print ( "Unexpected error %s from IoTHub" % iothub_error )
        except KeyboardInterrupt:
            print ( "IoTHubModuleClient sample stopped" )
    if __name__ == '__main__':
  3. requirements.txt 파일을 열고 해당 콘텐츠를 다음으로 바꿉니다.Open the file called requirements.txt, and substitute its content with the following:

  4. 에서deployment.template.js 이라고 하는 파일을 열고 아래 지침에 따라 해당 콘텐츠를 대체 합니다.Open the file called deployment.template.json, and substitute its content following the below guideline:

    1. 고유 하 고 고유한 JSON 구조가 있으므로 예제를 복사 하는 대신 직접 편집 해야 합니다.Because you will have your own, unique, JSON structure, you will need to edit it by hand (rather than copying an example). 이 작업을 쉽게 하려면 아래 이미지를 가이드로 사용 합니다.To make this easy, use the below image as a guide.

    2. 사용자와 다르게 보이지만 변경 하지 않아야 하는 영역이 노란색으로 강조 표시 됩니다.Areas which will look different to yours, but which you should NOT change are highlighted yellow.

    3. 삭제 해야 하는 섹션은 빨간색으로 강조 표시 됩니다.Sections which you need to delete, are a highlighted red.

    4. 올바른 대괄호를 삭제 하 고 쉼표도 제거 해야 합니다.Be careful to delete the correct brackets, and also remove the commas.

      컨테이너 만들기

    5. 완성 된 JSON은 다음 이미지와 같이 표시 되어야 합니다. 단, 사용자 이름/암호/모듈 이름/모듈 참조 와 같은 고유한 차이점이 있습니다.The completed JSON should look like the following image (though, with your unique differences: username/password/module name/module references):

      컨테이너 만들기

  5. Dockerfile. amd64 라는 파일을 열고 콘텐츠를 다음으로 바꿉니다.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 \ 
    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", "./" ]
  6. 모듈 아래에 있는 폴더를 마우스 오른쪽 단추로 클릭 하 고 (이전에 입력 한 이름을 포함 합니다. 아래 예제에서는 pythonmodule 라고 함) 새 폴더 를 클릭 합니다.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. 폴더 이름을 images 로 합니다.Name the folder images.

  7. 폴더 안에 마우스나 키보드를 포함 하는 일부 이미지를 추가 합니다.Inside the folder, add some images containing mouse or keyboard. 이러한 이미지는 Tensorflow 모델에서 분석할 이미지가 됩니다.Those will be the images that will be analyzed by the Tensorflow model.


    사용자 고유의 모델을 사용 하는 경우 고유한 모델 데이터를 반영 하도록이를 변경 해야 합니다.If you are using your own model, you will need to change this to reflect your own models data.

  8. 이제 1 장에서 이전에 다운로드 했거나 사용자 고유의 Custom Vision Service 에서 만든 모델 폴더에서 labels.txt모델 pb 파일을 검색 해야 합니다.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. 파일이 있으면 다른 파일과 함께 솔루션 내에 추가 합니다.Once you have the files, place them within your solution, alongside the other files. 최종 결과는 아래 이미지와 같아야 합니다.The final result should look like the image below:

    컨테이너 만들기

9 장-솔루션을 컨테이너로 패키지Chapter 9 - Package the solution as a container

  1. 이제 파일을 컨테이너로 "패키지" 하 고 Azure Container Registry 에 푸시할 수 있습니다.You are now ready to "package" your files as a container and push it to your Azure Container Registry. VS Code 내에서 통합 터미널 (View > integrated terminal 또는 Ctrl)을 열고 + ` 다음 줄을 사용 하 여 Docker 에 로그인 합니다 (명령 값을 ACR (Azure Container Registry 의 자격 증명으로 대체).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. deployment.template.js 파일을 마우스 오른쪽 단추로 클릭 하 고 IoT Edge 솔루션 빌드 를 클릭 합니다.Right-click on the file deployment.template.json, and click Build IoT Edge Solution. 이 빌드 프로세스는 장치에 따라 상당한 시간이 걸리므로 대기할 준비가 됩니다.This build process takes quite some time (depending on your device), so be prepared to wait. 빌드 프로세스가 완료 된 후에 파일 에 대 한deployment.jsconfig 라는 새 폴더 내에 생성 됩니다.After the build process finishes, a deployment.json file will have been created inside a new folder called config.

    배포 만들기

  3. 명령 팔레트 를 다시 열고 Azure: 로그인 을 검색 합니다.Open the Command Palette again, and search for Azure: Sign In. Azure 계정 자격 증명을 사용 하 여 프롬프트를 따릅니다. VS Code은 복사 하 여 수 있는 옵션을 제공 합니다 .이 옵션을 사용 하면 곧 필요한 장치 코드를 복사 하 여 기본 웹 브라우저를 열 수 있습니다.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. 메시지가 표시 되 면 장치 코드를 붙여넣어 컴퓨터를 인증 합니다.When asked, paste the device code, to authenticate your machine.

    복사 및 열기

  4. 일단 로그인 하면 탐색 패널의 아래쪽에 Azure IoT Hub 장치 라는 새 섹션이 표시 됩니다.Once signed in you will notice, on the bottom side of the Explore panel, a new section called Azure IoT Hub Devices. 이 섹션을 클릭 하 여 확장 합니다.Click this section to expand it.

    edge 장치

  5. 장치를 사용할 수 없는 경우 Azure IoT Hub 장치 를 마우스 오른쪽 단추로 클릭 한 다음 IoT Hub 연결 문자열 설정 을 클릭 해야 합니다.If your device is not here, you will need to right-click Azure IoT Hub Devices, and then click Set IoT Hub Connection String. 그러면 명령 팔레트 (VS Code 위쪽)에 연결 문자열 을 입력 하 라는 메시지가 표시 됩니다.You will then see that the Command Palette (at the top of VS Code), will prompt you to input your Connection String. 3 장끝에 적어 둔 연결 문자열 입니다.This is the Connection String you noted down at the end of Chapter 3. 에서 문자열을 복사한 후 enter 키를 누릅니다.Press the Enter key, once you have copied the string in.

  6. 장치가 로드 되 고 표시 됩니다.Your device should load, and appear. 장치 이름을 마우스 오른쪽 단추로 클릭 한 다음 단일 장치에 대 한 배포 만들기 를 클릭 합니다.Right-click on the device name, and then click, Create Deployment for Single Device.

    배포 만들기

  7. 파일 탐색기 프롬프트가 표시 됩니다. 여기서 config 폴더로 이동한 다음 파일 에서deployment.js 를 선택할 수 있습니다.You will get a File Explorer prompt, where you can navigate to the config folder, and then select the deployment.json file. 해당 파일을 선택한 상태에서 Edge 배포 매니페스트 선택 단추를 클릭 합니다.With that file selected, click the Select Edge Deployment Manifest button.

    배포 만들기

  8. 이제 Azure Container Registry 에서 컨테이너를 모듈로 배포 하 여 장치에 효과적으로 배포 하는 데 필요한 매니페스트와 함께 IoT Hub 서비스 를 제공 했습니다.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. 장치에서 IoT Hub 전송 된 메시지를 보려면 탐색기 패널의 Azure IoT Hub 장치 섹션에서 장치 이름을 다시 마우스 오른쪽 단추로 클릭 하 고 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. 장치에서 전송 된 메시지는 VS 터미널에 표시 되어야 합니다.The messages sent from your device should appear in the VS Terminal. 다소 시간이 걸릴 수 있으므로 잠시 기다려 주십시오.Be patient, as this may take some time. 다음 챕터에서 디버깅을 참조 하 고 배포에 성공 했는지 확인 합니다.See the next Chapter for debugging, and checking if deployment was successful.

이 모듈은 이제 각 반복에서 이미지 폴더의 이미지를 반복 하 고 분석 합니다.This module will now iterate between the images in the images folder and analyze them, with each iteration. 이는 IoT Edge 장치 환경에서 기본적인 기계 학습 모델을 사용 하는 방법을 보여 주는 것입니다.This is obviously just a demonstration of how to get the basic machine learning model to work in an IoT Edge device environment.

이 예제의 기능을 확장 하기 위해 여러 가지 방법으로 진행할 수 있습니다.To expand the functionality of this example, you could proceed in several ways. 한 가지 방법은 컨테이너에 일부 코드를 포함 하 여 장치에 연결 된 웹캠에서 사진을 캡처하고 이미지 폴더에 이미지를 저장 하는 것입니다.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.

또 다른 방법은 IoT 장치에서 컨테이너로 이미지를 복사 하는 것입니다.Another way could be copying the images from the IoT device into the container. 이 작업을 수행 하는 실용적인 방법은 IoT 장치 터미널에서 다음 명령을 실행 하는 것입니다. 프로세스를 자동화 하려는 경우 작은 앱이 작업을 수행할 수 있습니다.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). 파일이 저장 되는 폴더 위치에서 수동으로 실행 하 여이 명령을 테스트할 수 있습니다.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>

10 장-IoT Edge 런타임 디버깅Chapter 10 - Debugging the IoT Edge Runtime

다음은 Ubuntu 장치 에서 IoT Edge 런타임의 메시징 활동을 모니터링 하 고 디버깅 하는 데 도움이 되는 명령줄 목록과 팁입니다.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.

  • 다음 명령줄을 실행 하 여 IoT Edge 런타임 상태를 확인 합니다.Check the IoT Edge Runtime status by running the following command line:

        sudo systemctl status iotedge


    상태 보기를 마치려면 ctrl + C 를 눌러야 합니다.Remember to press Ctrl + C, to finish viewing the status.

  • 현재 배포 된 컨테이너를 나열 합니다.List the containers that are currently deployed. IoT Hub 서비스가 성공적으로 컨테이너를 배포 하면 다음 명령줄을 실행 하 여 표시 됩니다.If the IoT Hub Service has deployed the containers successfully, they will be displayed by running the following command line:

        sudo iotedge list


        sudo docker ps


    위의 내용은 목록에 표시 되는 대로 모듈이 성공적으로 배포 되었는지 여부를 확인 하는 좋은 방법입니다. 그렇지 않으면 edgeHubedgeAgent 표시 됩니다.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.

  • 컨테이너의 코드 로그를 표시 하려면 다음 명령줄을 실행 합니다.To display the code logs of a container, run the following command line:

        journalctl -u iotedge

IoT Edge 런타임을 관리 하는 데 유용한 명령:Useful commands to manage the IoT Edge Runtime:

  • 호스트의 모든 컨테이너를 삭제 하려면 다음을 수행 합니다.To delete all containers in the host:

        sudo docker rm -f $(sudo docker ps -aq)
  • IoT Edge 런타임을 중지 하려면:To stop the IoT Edge Runtime:

        sudo systemctl stop iotedge

11 장-테이블 서비스 만들기Chapter 11 - Create Table Service

저장소 리소스를 만들어 azure Tables 서비스를 만들 Azure Portal로 다시 이동 합니다.Navigate back to your Azure Portal, where you will create an Azure Tables Service, by creating a Storage resource.

  1. 아직 로그인 하지 않은 경우 Azure Portal에 로그인 합니다.If not already signed in, log into the Azure Portal.

  2. 로그인 되 면 왼쪽 위 모서리에서 리소스 만들기 를 클릭 하 고 저장소 계정 을 검색 한 다음 enter 키를 눌러 검색을 시작 합니다.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. 표시 되 면 목록에서 저장소 계정-blob, 파일, 테이블, 큐 를 클릭 합니다.Once it has appeared, click Storage account - blob, file, table, queue from the list.

    저장소 계정 검색

  4. 새 페이지에 저장소 계정 서비스에 대 한 설명이 제공 됩니다.The new page will provide a description of the Storage account Service. 이 프롬프트의 왼쪽 아래에서 만들기 단추를 클릭 하 여이 서비스의 인스턴스를 만듭니다.At the bottom left of this prompt, click the Create button, to create an instance of this Service.

    저장소 인스턴스 만들기

  5. 만들기 를 클릭 하면 패널이 표시 됩니다.Once you have clicked on Create, a panel will appear:

    1. 이 서비스 인스턴스의 원하는 이름을 삽입 합니다 (모두 소문자 여야 함).Insert your desired Name for this Service instance (must be all lowercase).

    2. 배포 모델 에서 리소스 관리자 를 클릭 합니다.For Deployment model, click Resource manager.

    3. 계정 종류 의 경우 드롭다운 메뉴에서 저장소 (범용 v1) 를 클릭 합니다.For Account kind, using the dropdown menu, click Storage (general purpose v1).

    4. 적절 한 위치 를 클릭 합니다.Click an appropriate Location.

    5. 복제 드롭다운 메뉴에서 읽기 액세스-지역 중복 저장소 (RA-GRS) 를 클릭 합니다.For the Replication dropdown menu, click Read-access-geo-redundant storage (RA-GRS).

    6. 성능 으로 표준 을 클릭 합니다.For Performance, click Standard.

    7. 보안 전송 필요 섹션에서 사용 안 함 을 클릭 합니다.Within the Secure transfer required section, click Disabled.

    8. 구독 드롭다운 메뉴에서 적절 한 구독을 클릭 합니다.From the Subscription dropdown menu, click an appropriate subscription.

    9. 리소스 그룹을 선택 하거나 새 리소스 그룹 을 만듭니다.Choose a Resource Group or create a new one. 리소스 그룹은 Azure 자산 컬렉션에 대 한 모니터링, 제어 액세스, 프로 비전 및 관리를 위한 방법을 제공 합니다.A resource group provides a way to monitor, control access, provision, and manage, billing for a collection of Azure assets. 단일 프로젝트와 연결 된 모든 Azure 서비스 (예: 이러한 과정)를 공용 리소스 그룹에 유지 하는 것이 좋습니다.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).

      Azure 리소스 그룹에 대 한 자세한 내용을 보려면 리소스 그룹을 관리 하는 방법에 대한 다음 링크를 참조 하세요.If you wish to read more about Azure Resource Groups, please follow this link on how to manage a Resource Group.

    10. 이 옵션을 선택 하는 경우 가상 네트워크사용 안 함 으로 유지 합니다.Leave Virtual networks as Disabled, if this is an option for you.

    11. 만들기 를 클릭합니다.Click Create.

      저장소 정보 입력

  6. 만들기 를 클릭 한 후에는 서비스를 만들 때까지 기다려야 합니다 .이 작업이 몇 분 정도 걸릴 수 있습니다.Once you have clicked on Create, you will have to wait for the Service to be created, this might take a minute.

  7. 서비스 인스턴스를 만든 후 알림이 포털에 표시 됩니다.A notification will appear in the Portal once the Service instance is created. 알림을 클릭 하 여 새 서비스 인스턴스를 탐색 합니다.Click on the notifications to explore your new Service instance.

    새 저장소 알림

  8. 알림에서 리소스로 이동 단추를 클릭 하면 새 저장소 서비스 인스턴스 개요 페이지가 표시 됩니다.Click the Go to resource button in the notification, and you will be taken to your new Storage Service instance overview page.

    리소스로 이동

  9. 개요 페이지에서 오른쪽에 있는 테이블 을 클릭 합니다.From the overview page, to the right-hand side, click Tables.


  10. 오른쪽 패널은 새 테이블을 추가 해야 하는 테이블 서비스 정보를 표시 하도록 변경 됩니다.The panel on the right will change to show the Table Service information, wherein you need to add a new table. 왼쪽 위 모서리에서 + 테이블 단추를 클릭 하 여이 작업을 수행 합니다.Do this by clicking the + Table button to the top-left corner.

    테이블 열기

  11. 테이블 이름을 입력 해야 하는 새 페이지가 표시 됩니다.A new page will be shown, wherein you need to enter a Table name. 이 이름은 이후 챕터의 응용 프로그램에서 데이터를 참조 하는 데 사용 됩니다 (함수 앱 만들기 및 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). 이름으로 Iotmessages 를 삽입 하 고이 문서의 뒷부분에서 사용 되는 경우에만 기억할 수 있으며 확인 을 클릭 합니다.Insert IoTMessages as the name (you can choose your own, just remember it when used later in this document) and click OK.

  12. 새 테이블을 만든 후에는 테이블 서비스 페이지 (아래쪽)에서 볼 수 있습니다.Once the new table has been created, you will be able to see it within the Table Service page (at the bottom).

    새 테이블을 만들었습니다.

  13. 이제 액세스 키 를 클릭 하 고 저장소 계정 이름 의 복사본을 가져옵니다 (메모장 사용) .이 과정의 뒷부분에서 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.

    새 테이블을 만들었습니다.

  14. 왼쪽의 패널을 다시 사용 하 여 테이블 서비스 섹션으로 스크롤하고 테이블 (또는 새 포털에서 테이블 찾아보기) 을 클릭 하테이블 URL (메모장 사용)의 복사본을 가져옵니다.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). 이 과정에서 나중에 테이블을 Power BI 응용 프로그램에 연결할 때이 값을 사용 합니다.You will use this value later in this course, when linking your table to your Power BI application.

    새 테이블을 만들었습니다.

12 장-Azure 테이블 완료Chapter 12 - Completing the Azure Table

이제 Table Service storage 계정이 설정 되었으므로 데이터를 추가 하 여 정보를 저장 하 고 검색 하는 데 사용 됩니다.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. 테이블 편집은 Visual Studio 를 통해 수행할 수 있습니다.The editing of your Tables can be done through Visual Studio.

  1. Visual Studio 를 엽니다 (Visual Studio Code 하지 않음 ).Open Visual Studio (not Visual Studio Code).

  2. 메뉴에서 클라우드 탐색기 보기 를 클릭 > 합니다.From the menu, click View > Cloud Explorer.

    클라우드 탐색기 열기

  3. 클라우드 탐색기 은 도킹 된 항목으로 열립니다. 로드 시 시간이 걸릴 수 있으므로 잠시 기다려 주십시오.The Cloud Explorer will open as a docked item (be patient, as loading may take time).


    저장소 계정을 만드는 데 사용한 구독이 표시 되지 않는 경우 다음을 확인 합니다.If the subscription you used to create your Storage Accounts is not visible, ensure that you have:

    • Azure Portal에 사용한 것과 동일한 계정에 로그인 합니다.Logged in to the same account as the one you used for the Azure Portal.

    • 계정 관리 페이지에서 구독을 선택 했습니다 (계정 설정에서 필터를 적용 해야 할 수 있음).Selected your subscription from the Account Management page (you may need to apply a filter from your account settings):

      구독 찾기

  4. Azure cloud Services가 표시 됩니다.Your Azure cloud Services will be shown. 저장소 계정을 찾고 왼쪽에 있는 화살표를 클릭 하 여 계정을 확장 합니다.Find Storage Accounts and click the arrow to the left of that to expand your accounts.

    저장소 계정 열기

  5. 확장 되 면 새로 만든 저장소 계정을 사용할 수 있습니다.Once expanded, your newly created Storage account should be available. 저장소 왼쪽에 있는 화살표를 클릭 한 다음 확장 되 면 테이블 을 찾아 해당 옆의 화살표를 클릭 하 여 마지막 챕터에서 만든 테이블 을 표시 합니다.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. 테이블 을 두 번 클릭 합니다.Double-click your Table.

  6. Visual Studio 창의 중앙에서 테이블이 열립니다.Your table will be opened in the center of your Visual Studio window. (더하기)가 있는 테이블 아이콘을 클릭 + 합니다.Click the table icon with the + (plus) on it.

    새 테이블 추가

  7. 엔터티를 추가 하 라는 창이 표시 됩니다.A window will appear prompting for you to Add Entity. 3 개의 속성을 포함 하지만 엔터티는 하나만 만듭니다.You will create only one entity, though it will have three properties. PartitionKeyrowkey 는 테이블에서 데이터를 찾기 위해 사용 되므로 이미 제공 된 것을 알 수 있습니다.You will notice that PartitionKey and RowKey are already provided, as these are used by the table to find your data.

    파티션 및 행 키

  8. 다음 값을 업데이트합니다.Update the following values:

    • 이름: PartitionKey, 값: PK_IoTMessagesName: PartitionKey, Value: PK_IoTMessages

    • 이름: Rowkey, 값: RK_1_IoTMessagesName: RowKey, Value: RK_1_IoTMessages

  9. 그런 다음 엔터티 추가 창의 왼쪽 아래에 있는 속성 추가 를 클릭 하 고 다음 속성을 추가 합니다.Then, click Add property (to the lower left of the Add Entity window) and add the following property:

    • MessageContent, 문자열, 값을 비워 둡니다.MessageContent, as a string, leave the Value empty.
  10. 테이블은 아래 이미지에 있는 것과 일치 해야 합니다.Your table should match the one in the image below:

    올바른 값 추가


    엔터티가 행 키에 숫자 1을 갖는 이유는이 과정을 통해 더 많은 메시지를 추가 하려고 할 수 있기 때문입니다.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. 작업이 완료 되 면 확인을 클릭 합니다.Click OK when you are finished. 이제 테이블을 사용할 준비가 되었습니다.Your table is now ready to be used.

13 장-Azure 함수 앱 만들기Chapter 13 - Create an Azure Function App

이제 이전 장에서 만든 Table service에 IoT Edge 장치 메시지를 저장 하기 위해 IoT Hub 서비스 에 의해 호출 되는 Azure 함수 앱 를 만들어야 합니다.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.

먼저 Azure 함수에서 필요한 라이브러리를 로드 하도록 허용 하는 파일을 만들어야 합니다.First, you need to create a file that will allow your Azure Function to load the libraries you need.

  1. 메모장 을 엽니다 ( Windows 키 를 누른 다음 notepad 를 입력).Open Notepad (press the Windows Key, and type notepad).

    메모장 열기

  2. 메모장을 열고 아래에 JSON 구조를 삽입 합니다.With Notepad open, insert the JSON structure below into it. 이 작업을 완료 한 후 에는project.js 바탕 화면에 저장 합니다.Once you have done that, save it on your desktop as project.json. 이 파일은 함수에서 사용할 라이브러리를 정의 합니다.This file defines the libraries your function will use. NuGet을 사용한 경우 익숙할 것입니다.If you have used NuGet, it will look familiar.


    이름을 올바르게 지정 해야 합니다. .txt 파일 확장명이 없는지 확인 합니다.It is important that the naming is correct; ensure it does NOT have a .txt file extension. 참조는 아래를 참조 하세요.See below for reference:

    JSON 저장

    "frameworks": {
        "dependencies": {
            "WindowsAzure.Storage": "9.2.0"
  3. Azure Portal에 로그인합니다.Log in to the Azure Portal.

  4. 로그인 되 면 왼쪽 위 모서리에서 리소스 만들기 를 클릭 하 고 함수 앱 를 검색 한 다음 enter 키를 눌러 검색 합니다.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. 결과에서 함수 앱 를 클릭 하 여 새 패널을 엽니다.Click Function App from the results, to open a new panel.

    함수 앱 검색

  5. 새 패널은 함수 앱 서비스에 대 한 설명을 제공 합니다.The new panel will provide a description of the Function App Service. 이 패널의 왼쪽 아래에서 만들기 단추를 클릭 하 여이 서비스와의 연결을 만듭니다.At the bottom left of this panel, click the Create button, to create an association with this Service.

    함수 앱 인스턴스

  6. 만들기 를 클릭 한 후에는 다음을 입력 합니다.Once you have clicked on Create, fill in the following:

    1. 앱 이름 에 대해 원하는 이름을이 서비스 인스턴스에 삽입 합니다.For App name, insert your desired name for this Service instance.

    2. 구독 을 선택합니다.Select a Subscription.

    3. 적절 한 가격 책정 계층을 선택 합니다. 함수 앱 서비스 를 처음 만드는 경우 무료 계층을 사용할 수 있어야 합니다.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. 리소스 그룹을 선택 하거나 새 리소스 그룹 을 만듭니다.Choose a Resource Group or create a new one. 리소스 그룹은 Azure 자산 컬렉션에 대 한 모니터링, 제어 액세스, 프로 비전 및 관리를 위한 방법을 제공 합니다.A resource group provides a way to monitor, control access, provision, and manage, billing for a collection of Azure assets. 단일 프로젝트와 연결 된 모든 Azure 서비스 (예: 이러한 과정)를 공용 리소스 그룹에 유지 하는 것이 좋습니다.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).

      Azure 리소스 그룹에 대 한 자세한 내용을 보려면 리소스 그룹을 관리 하는 방법에 대한 다음 링크를 참조 하세요.If you wish to read more about Azure Resource Groups, please follow this link on how to manage a Resource Group.

    5. OS 의 경우 원하는 플랫폼인 Windows를 클릭 합니다.For OS, click Windows, as that is the intended platform.

    6. 호스팅 계획 을 선택 합니다 .이 자습서는 소비 계획 을 사용 합니다.Select a Hosting Plan (this tutorial is using a Consumption Plan.

    7. 위치 선택 (이전 단계에서 빌드한 저장소와 동일한 위치 선택)Select a Location (choose the same location as the storage you have built in the previous step)

    8. 저장소 섹션의 경우 이전 단계에서 만든 저장소 서비스를 선택 해야 합니다.For the Storage section, you must select the Storage Service you created in the previous step.

    9. 이 앱에 Application Insights 필요 하지 않으므로 자유롭게 그대로 둡니다.You will not need Application Insights in this app, so feel free to leave it Off.

    10. 만들기 를 클릭합니다.Click Create.

      새 인스턴스 만들기

  7. 만들기 를 클릭 한 후에는 서비스를 만들 때까지 기다려야 합니다 .이 작업이 몇 분 정도 걸릴 수 있습니다.Once you have clicked on Create, you will have to wait for the Service to be created, this might take a minute.

  8. 서비스 인스턴스를 만든 후 알림이 포털에 표시 됩니다.A notification will appear in the Portal once the Service instance is created.

    새 알림

  9. 배포가 성공적으로 완료 되 면 알림을 클릭 합니다 (완료 됨).Click on the notification, once deployment is successful (has finished).

  10. 알림에서 리소스로 이동 단추를 클릭 하 여 새 서비스 인스턴스를 탐색 합니다.Click the Go to resource button in the notification to explore your new Service instance.

    리소스로 이동

  11. 새 패널의 왼쪽에서 함수 옆에 있는 + 더하기 () 아이콘을 클릭 하 여 새 함수를 만듭니다.In the left side of the new panel, click the + (plus) icon next to Functions, to create a new function.

    새 함수 추가

  12. 중앙 패널 내에서 함수 만들기 창이 표시 됩니다.Within the central panel, the Function creation window will appear. 아래로 스크롤하여 사용자 지정 함수 를 클릭 합니다.Scroll down further, and click on Custom function.

    사용자 지정 함수

  13. IoT Hub (이벤트 허브) 를 찾을 때까지 다음 페이지 아래로 스크롤한 다음 클릭 합니다.Scroll down the next page, until you find IoT Hub (Event Hub), then click on it.

    사용자 지정 함수

  14. IoT Hub (이벤트 허브) 블레이드에서 언어c # 으로 설정 하 고 새로 만들기 를 클릭 합니다.In the IoT Hub (Event Hub) blade, set the Language to C# and then click on new.

    사용자 지정 함수

  15. 표시 되는 창에서 IoT Hub 가 선택 되어 있는지 확인 하 고 IoT Hub 필드 이름이 이전에 만든 IoT Hub 서비스 의 이름 (3 장의 8 단계)과 일치 하는지 확인 합니다.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). 그런 다음 선택 단추를 클릭 합니다.Then click the Select button.

    사용자 지정 함수

  16. IoT Hub (이벤트 허브) 블레이드로 돌아가서 만들기 를 클릭 합니다.Back on the IoT Hub (Event Hub) blade, click on Create.

    사용자 지정 함수

  17. 그러면 함수 편집기로 리디렉션됩니다.You will be redirected to the function editor.

    사용자 지정 함수

  18. 모든 코드를 삭제 하 고 다음으로 바꿉니다.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 = "";
        // 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. 다음 변수를 변경 하 여 저장소 계정 에서 찾을 수 있는 적절 한 값 ( 11 장에서 각각 11 장, 13 단계)에 해당 하 는 값에 해당 하는 변수를 변경 합니다.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- 저장소 계정 에 있는 테이블 의 이름을 사용 합니다.tableName, with the name of your Table located in your Storage Account.
    • Tableurl- 저장소 계정 에 있는 테이블 의 url을 사용 합니다.tableURL, with the URL of your Table located in your Storage Account.
    • Storageaccountname, 저장소 계정 이름 이름에 해당 하는 값의 이름을 사용 합니다.storageAccountName, with the name of the value corresponding with the name of your Storage Account name.
    • 이전에 만든 저장소 서비스에서 가져온 키를 사용 하 여 storageAccountKey.storageAccountKey, with the Key you have obtained in the Storage Service you have created previously.

    사용자 지정 함수

  20. 코드가 준비 되 면 저장 을 클릭 합니다.With the code in place, click Save.

  21. 그런 다음 < 페이지의 오른쪽에 있는 (화살표) 아이콘을 클릭 합니다.Next, click the < (arrow) icon, on the right-hand side of the page.

    사용자 지정 함수

  22. 패널은 오른쪽에서 오른쪽으로 이동 합니다.A panel will slide in from the right. 해당 패널에서 업로드 를 클릭 하면 파일 브라우저가 나타납니다.In that panel, click Upload, and a File Browser will appear.

  23. 로 이동 하 여 이전에 메모장 에서 만든 파일 의project.js 를 클릭 한 다음 열기 단추를 클릭 합니다.Navigate to, and click, the project.json file, which you created in Notepad previously, and then click the Open button. 이 파일은 함수에서 사용할 라이브러리를 정의 합니다.This file defines the libraries that your function will use.

    사용자 지정 함수

  24. 파일이 업로드 되 면 오른쪽의 패널에 표시 됩니다.When the file has uploaded, it will appear in the panel on the right. 이 단추를 클릭 하면 함수 편집기 내에서 열립니다.Clicking it will open it within the Function editor. 이 이미지는 다음 이미지와 정확히 동일 하 표시 되어야 합니다.It must look exactly the same as the next image.

    사용자 지정 함수

  25. 이 시점에서 함수 기능을 테스트 하 여 테이블 에 메시지를 저장 하는 것이 좋습니다.At this point it would be good to test the capability of your Function to store the message on your Table. 창의 오른쪽 위에서 테스트 를 클릭 합니다.On the top right side of the window, click on Test.

    사용자 지정 함수

  26. 위의 이미지에 표시 된 것 처럼 요청 본문 에 메시지를 삽입 하 고 실행 을 클릭 합니다.Insert a message on the Request body, as shown in the image above, and click on Run.

  27. 함수를 실행 하 여 결과 상태를 표시 합니다. 출력 창 위에 녹색 상태 202이 수락 되었음을 알 수 있습니다 .이는 성공적인 호출 임을 의미 합니다.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):

    출력 결과

14 장-활성 메시지 보기Chapter 14 - View active messages

이제 Visual Studio를 열 때 (Visual Studio Code 하지 않음 ) 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.

사용자 지정 함수

Table Service와 함수 앱를 사용 하 여 Ubuntu 장치 메시지가 I이상 메시지 테이블에 표시 됩니다.With the Table Service and Function App in place, your Ubuntu device messages will appear in your IoTMessages Table. 아직 실행 중이 아닌 경우 장치를 다시 시작 하면 Visual Studio 클라우드 탐색기 를 사용 하 여 장치 및 모듈의 결과 메시지를 테이블 내에서 볼 수 있습니다.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.

데이터 시각화

15 장-Power BI 설치Chapter 15 - Power BI Setup

IOT 장치에서 데이터를 시각화 하려면 Power BI (데스크톱 버전)을 설치 하 여 방금 만든 테이블 서비스에서 데이터를 수집 합니다.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. Power BI의 HoloLens 버전은 해당 데이터를 사용 하 여 결과를 시각화 합니다.The HoloLens version of Power BI will then use that data to visualize the result.

  1. Windows 10에서 Microsoft Store를 열고 Power BI Desktop 를 검색 합니다.Open the Microsoft Store on Windows 10 and search for Power BI Desktop.

    Power BI

  2. 응용 프로그램을 다운로드 합니다.Download the application. 다운로드가 완료 되 면 엽니다.Once it has finished downloading, open it.

  3. Microsoft 365 계정 으로 Power BI 에 로그인 합니다.Log into Power BI with your Microsoft 365 account. 등록 하려면 브라우저로 리디렉션될 수 있습니다.You may be redirected to a browser, to sign up. 등록 하면 Power BI 앱으로 돌아가서 다시 로그인 합니다.Once you are signed up, go back to the Power BI app, and sign in again.

  4. 데이터 가져오기 를 클릭 하 고 자세히...를 클릭 합니다.Click on Get Data and then click on More....

    Power BI

  5. Azure, azure Table Storage 를 클릭 한 다음 연결 을 클릭 합니다.Click Azure, Azure Table Storage, then click on Connect.

    Power BI

  6. 테이블 서비스를 만드는 동안 이전에 수집한 테이블 URL (11 장의 13 단계)을 삽입 하 라는 메시지가 표시 됩니다.You will be prompted to insert the Table URL that you collected earlier (in step 13 of Chapter 11), while creating your Table Service. URL을 삽입 한 후에 "하위 폴더" 테이블을 참조 하는 경로 부분을 삭제 합니다 (이 과정에서는 I이상 메시지).After inserting the URL, delete the portion of the path referring to the Table "sub-folder" (which was IoTMessages, in this course). 최종 결과는 아래 이미지에 표시 된 것과 같아야 합니다.The final result should be as displayed in the image below. 그런 다음 확인 을 클릭 합니다.Then click on OK.

    Power BI

  7. Table Storage를 만드는 동안 앞에서 설명한 저장소 키 (11 장 11 단계)를 삽입 하 라는 메시지가 표시 됩니다.You will be prompted to insert the Storage Key that you noted (in step 11 of Chapter 11) earlier while creating your Table Storage. 그런 다음 연결 을 클릭 합니다.Then click on Connect.

    Power BI

  8. 탐색기 패널이 표시 되 면 테이블 옆의 상자에 상자를 표시 하 고 로드 를 클릭 합니다.A Navigator Panel will be displayed, tick the box next to your Table and click on Load.

    Power BI

  9. 이제 테이블이 Power BI에 로드 되었지만 쿼리를 사용 하 여 값을 표시 해야 합니다.Your table has now been loaded on Power BI, but it requires a query to display the values in it. 이렇게 하려면 화면 오른쪽에 있는 필드 패널 에 있는 테이블 이름을 마우스 오른쪽 단추로 클릭 합니다.To do so, right-click on the table name located in the FIELDS panel at the right side of the screen. 그런 다음 쿼리 편집 을 클릭 합니다.Then click on Edit Query.

    Power BI

  10. 파워 쿼리 편집기 가 새 창으로 열리고 테이블이 표시 됩니다.A Power Query Editor will open up as a new window, displaying your table. 테이블의 내용 열에서 레코드 를 클릭 하 여 저장 된 콘텐츠를 시각화 합니다.Click on the word Record within the Content column of the table, to visualize your stored content.

    Power BI

  11. 창의 왼쪽 위에서 를 클릭 합니다.Click on Into Table, at the top-left of the window.

    Power BI

  12. 닫기 & 적용 을 클릭 합니다.Click on Close & Apply.

    Power BI

  13. 쿼리 로드를 완료 한 후에는 필드 패널 내에서 화면 오른쪽에 있는 MessageContent 열 내용을 시각화 하기 위해 매개 변수 이름 에 해당 하는 상자를 tick.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. 창의 왼쪽 위에서 파란색 디스크 아이콘 을 클릭 하 여 선택한 폴더에 작업을 저장 합니다.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. 이제 게시 단추를 클릭 하 여 작업 영역에 테이블을 업로드할 수 있습니다.You can now click on the Publish button to upload your table to your Workspace. 메시지가 표시 되 면 내 작업 영역 을 클릭 하 고 선택 을 클릭 합니다.When prompted, click My workspace and click Select. 전송의 성공적인 결과가 표시 될 때까지 기다립니다.Wait for it to display the successful result of the submission.

    Power BI

    Power BI


다음 장은 HoloLens 전용입니다.The following Chapter is HoloLens specific. Power BI 현재 모던 응용 프로그램으로 사용할 수 없지만 데스크톱 앱을 통해 Windows Mixed Reality 포털 (즉, 절벽 집)에서 데스크톱 버전을 실행할 수 있습니다.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.

16 장-HoloLens에 Power BI 데이터 표시Chapter 16 - Display Power BI data on HoloLens

  1. HoloLens의 응용 프로그램 목록에서 아이콘을 탭 하 여 Microsoft Store 에 로그인 합니다.On your HoloLens, log in to the Microsoft Store, by tapping on its icon in the applications list.

    Power BI HL

  2. Power BI 응용 프로그램을 검색 한 후 다운로드 합니다.Search and then download the Power BI application.

    Power BI HL

  3. 응용 프로그램 목록에서 Power BI 을 시작 합니다.Start Power BI from your applications list.

  4. Power BI 에서 Microsoft 365 계정 에 로그인 하 라는 메시지가 표시 될 수 있습니다.Power BI might ask you to login to your Microsoft 365 account.

  5. 앱 내에서 작업 영역은 아래 이미지와 같이 기본적으로 표시 되어야 합니다.Once inside the app, the workspace should display by default as shown in the image below. 이 문제가 발생 하지 않으면 창의 왼쪽에 있는 작업 영역 아이콘을 클릭 하면 됩니다.If that does not happen, simply click on the workspace icon on the left side of the window.

    Power BI HL

IoT Hub 응용 프로그램을 완료 했습니다.Your finished your IoT Hub application

축 하 합니다. 시뮬레이트된 가상 머신에 지 장치를 사용 하 여 IoT Hub 서비스를 만들었습니다.Congratulations, you have successfully created an IoT Hub Service, with a simulated Virtual Machine Edge device. 장치는 azure 함수 앱에서 활용 하 여 기계 학습 모델의 결과를 Azure 테이블 서비스에 전달할 수 있으며,이를 통해 Power BI으로 읽어 Microsoft HoloLens 내에서 시각화할 수 있습니다.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

보너스 연습Bonus exercises

연습 1Exercise 1

테이블에 저장 된 메시징 구조를 확장 하 고 그래프로 표시 합니다.Expand the messaging structure stored in the table and display it as a graph. 나중에 표시 하기 위해 더 많은 데이터를 수집 하 여 동일한 테이블에 저장할 수 있습니다.You might want to collect more data and store it in the same table, to be later displayed.

연습 2Exercise 2

분석할 카메라를 통해 이미지를 캡처할 수 있도록 IoT 보드에 배포할 추가 "카메라 캡처" 모듈을 만듭니다.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.