C# IoT Edge-modul fejlesztése a fájlok Azure Stack Edge Pro-vel való áthelyezéséhezDevelop a C# IoT Edge module to move files with Azure Stack Edge Pro

Ez a cikk bemutatja, hogyan hozhat létre IoT Edge modult az Azure Stack Edge Pro-eszközzel történő üzembe helyezéshez.This article steps you through how to create an IoT Edge module for deployment with your Azure Stack Edge Pro device. Az Azure Stack Edge Pro egy tárolási megoldás, amely lehetővé teszi az adatfeldolgozást és a hálózaton keresztüli küldést az Azure-ba.Azure Stack Edge Pro is a storage solution that allows you to process data and send it over network to Azure.

Az Azure-ba való áttelepítése során Azure IoT Edge modulokat használhat a Azure Stack Edge Pro-val.You can use Azure IoT Edge modules with your Azure Stack Edge Pro to transform the data as it moved to Azure. A cikkben használt modul azt a logikát valósítja meg, hogy egy helyi megosztásból származó fájlt egy Felhőbeli megosztásra másoljon a Azure Stack Edge Pro-eszközön.The module used in this article implements the logic to copy a file from a local share to a cloud share on your Azure Stack Edge Pro device.

Ebben a cikkben az alábbiakkal ismerkedhet meg:In this article, you learn how to:

  • Hozzon létre egy tároló-beállításjegyzéket a modulok tárolásához és kezeléséhez (Docker-lemezképek).Create a container registry to store and manage your modules (Docker images).
  • Hozzon létre egy IoT Edge modult az Azure Stack Edge Pro-eszközön való üzembe helyezéshez.Create an IoT Edge module to deploy on your Azure Stack Edge Pro device.

Tudnivalók a IoT Edge modulrólAbout the IoT Edge module

Az Azure Stack Edge Pro-eszközön IoT Edge modulokat helyezhet üzembe és futtathat.Your Azure Stack Edge Pro device can deploy and run IoT Edge modules. Az Edge-modulok lényegében olyan Docker-tárolók, amelyek egy adott feladatot hajtanak végre, például üzeneteket töltenek le egy eszközről, átalakítanak egy üzenetet, vagy üzeneteket küldenek egy IoT Hubnak.Edge modules are essentially Docker containers that perform a specific task, such as ingest a message from a device, transform a message, or send a message to an IoT Hub. Ebben a cikkben egy olyan modult fog létrehozni, amely egy helyi megosztásból másol fájlokat egy felhőalapú megosztásra az Azure Stack Edge Pro-eszközön.In this article, you will create a module that copies files from a local share to a cloud share on your Azure Stack Edge Pro device.

  1. A fájlok a Azure Stack Edge Pro-eszköz helyi megosztására íródnak.Files are written to the local share on your Azure Stack Edge Pro device.
  2. A fájl esemény-előállítója létrehoz egy fájl eseményt a helyi megosztásba írt minden fájlhoz.The file event generator creates a file event for each file written to the local share. A fájlra vonatkozó eseményeket a rendszer a fájl módosításakor is létrehozza.The file events are also generated when a file is modified. A rendszer ezután elküldi a fájl eseményeit IoT Edge hubhoz (IoT Edge futtatókörnyezetben).The file events are then sent to IoT Edge Hub (in IoT Edge runtime).
  3. A IoT Edge egyéni modul feldolgozza a fájl eseményt, hogy létrehozzon egy fájl-esemény objektumot, amely a fájl relatív elérési útját is tartalmazza.The IoT Edge custom module processes the file event to create a file event object that also contains a relative path for the file. A modul egy abszolút elérési utat generál a fájl relatív elérési útjával, és átmásolja a fájlt a helyi megosztásról a Felhőbeli megosztásra.The module generates an absolute path using the relative file path and copies the file from the local share to the cloud share. A modul ezután törli a fájlt a helyi megosztásról.The module then deletes the file from the local share.

Azure IoT Edge modul működése Azure Stack Edge Pro-ban

Ha a fájl a Felhőbeli megosztásban van, a rendszer automatikusan feltölti az Azure Storage-fiókjába.Once the file is in the cloud share, it automatically gets uploaded to your Azure Storage account.

ElőfeltételekPrerequisites

Mielőtt hozzákezd, győződjön meg arról, hogy rendelkezik az alábbiakkal:Before you begin, make sure you have:

Tárolóregisztrációs adatbázis létrehozásaCreate a container registry

Az Azure-beli tároló-beállításjegyzék egy privát Docker-tárolójegyzék az Azure-ban, amelyben tárolhatja és kezelheti privát Docker-tárolóinak rendszerképeit.An Azure container registry is a private Docker registry in Azure where you can store and manage your private Docker container images. A felhőben elérhető két népszerű Docker beállításjegyzék-szolgáltatás Azure Container Registry és a Docker hub.The two popular Docker registry services available in the cloud are Azure Container Registry and Docker Hub. Ez a cikk a Container Registry használja.This article uses the Container Registry.

  1. Jelentkezzen be az Azure Portalra a https://portal.azure.com webhelyen.Sign in to the Azure portal at https://portal.azure.com.

  2. Válassza az erőforrás létrehozása > tárolók > Container Registrylehetőséget.Select Create a resource > Containers > Container Registry. Kattintson a Létrehozás gombra.Click Create.

  3. NyújtProvide:

    1. Egy egyedi, az Azure-ban található, 5 – 50 alfanumerikus karaktert tartalmazó beállításjegyzékbeli név .A unique Registry name within Azure that contains 5 to 50 alphanumeric characters.

    2. Válasszon egy előfizetést.Choose a Subscription.

    3. Hozzon létre egy új csoportot, vagy válasszon ki egy meglévő erőforráscsoportot.Create new or choose an existing Resource group.

    4. Válasszon egy helyet.Select a Location. Azt javasoljuk, hogy ez a hely azonos legyen az Azure Stack Edge-erőforráshoz társított hellyel.We recommend that this location be the same as that is associated with the Azure Stack Edge resource.

    5. A Rendszergazdai felhasználó beállítást váltsa Engedélyezés értékre.Toggle Admin user to Enable.

    6. Az SKU beállítása alapszintűértékre.Set the SKU to Basic.

      Tárolóregisztrációs adatbázis létrehozása

  4. Kattintson a Létrehozás gombra.Select Create.

  5. Miután létrejött a tárolóregisztrációs adatbázis, keresse meg, és válassza a Hozzáférési kulcsok elemet.After your container registry is created, browse to it, and select Access keys.

    Hozzáférési kulcsok beolvasása

  6. Másolja a Bejelentkezési kiszolgáló, a Felhasználónév és a Jelszó értékeit.Copy the values for Login server, Username, and Password. Ezekkel az értékekkel később közzéteheti a Docker-rendszerképet a beállításjegyzékben, és hozzáadhatja a beállításjegyzékbeli hitelesítő adatokat a Azure IoT Edge Runtime szolgáltatáshoz.You use these values later to publish the Docker image to your registry and to add the registry credentials to the Azure IoT Edge runtime.

IoT Edge-modulprojekt létrehozásaCreate an IoT Edge module project

A következő lépésekkel hozzon létre egy IoT Edge modul-projektet a .NET Core 2,1 SDK alapján.The following steps create an IoT Edge module project based on the .NET Core 2.1 SDK. A projekt a Visual Studio Code és a Azure IoT Edge bővítményt használja.The project uses Visual Studio Code and the Azure IoT Edge extension.

Új megoldás létrehozásaCreate a new solution

Létrehozhat egy C#-megoldást, amelyet a saját kódjával testreszabhat.Create a C# solution template that you can customize with your own code.

  1. A Visual Studio Code-ban válassza a megtekintés > parancs paletta elemet a vs Code parancs paletta megnyitásához.In Visual Studio Code, select View > Command Palette to open the VS Code command palette.

  2. A parancskatalógusban írja be és futtassa az Azure: Sign in parancsot, és az utasításokat követve jelentkezzen be az Azure-fiókjába.In the command palette, enter and run the command Azure: Sign in and follow the instructions to sign in your Azure account. Ha már be van jelentkezve, ezt a lépést kihagyhatja.If you're already signed in, you can skip this step.

  3. A parancskatalógusban írja be és futtassa az Azure IoT Edge: New IoT Edge solution parancsot.In the command palette, enter and run the command Azure IoT Edge: New IoT Edge solution. A parancskatalógusban adja meg az alábbi információkat a megoldás létrehozásához:In the command palette, provide the following information to create your solution:

    1. Válassza ki azt a mappát, ahol a megoldást létre szeretné hozni.Select the folder where you want to create the solution.

    2. Adja meg a megoldás nevét, vagy fogadja el az alapértelmezett EdgeSolution nevet.Provide a name for your solution or accept the default EdgeSolution.

      1. új megoldás létrehozása

    3. Válassza a C# modult modul sablonként.Choose C# Module as the module template.

    4. Cserélje le az alapértelmezett modul nevét a hozzárendelni kívánt névre, ebben az esetben ez a FileCopyModule.Replace the default module name with the name you want to assign, in this case, it is FileCopyModule.

      Új megoldás létrehozása 2

    5. Adja meg az előző szakaszban létrehozott tároló-beállításjegyzéket az első modul rendszerkép-tárháza.Specify the container registry that you created in the previous section as the image repository for your first module. Cserélje le a localhost:5000 értéket a bejelentkezési kiszolgáló kimásolt értékére.Replace localhost:5000 with the login server value that you copied.

      A végső sztring így néz ki <Login server name>/<Module name> .The final string looks like <Login server name>/<Module name>. Ebben a példában a karakterlánc a következő: mycontreg2.azurecr.io/filecopymodule .In this example, the string is: mycontreg2.azurecr.io/filecopymodule.

      3. új megoldás létrehozása

  4. Nyissa meg a fájl > Megnyitás mappát.Go to File > Open Folder.

    4. új megoldás létrehozása

  5. Tallózással keresse meg a korábban létrehozott EdgeSolution mappát, és mutasson rá.Browse and point to the EdgeSolution folder that you created earlier. A VS Code ablak az öt legfelső szintű összetevővel tölti be IoT Edge megoldás munkaterületét.The VS Code window loads your IoT Edge solution workspace with its five top-level components. A . vscode mappa, a . gitignore fájl, a . env fájl és a deployment.template.js nem módosítható ebben a cikkben.You won't edit the .vscode folder, .gitignore file, .env file, and the deployment.template.json in this article.

    Az egyetlen módosítható összetevő a modulok mappa.The only component that you modify is the modules folder. Ez a mappa a modul és a Docker-fájlok C# kódját adja meg a modul tároló képként való felépítéséhez.This folder has the C# code for your module and Docker files to build your module as a container image.

    Új megoldás létrehozása 5

A modul módosítása egyéni kóddalUpdate the module with custom code

  1. A VS Code Explorerben nyissa meg a modules > FileCopyModule > program.cs.In the VS Code explorer, open modules > FileCopyModule > Program.cs.

  2. A FileCopyModule névtértetején adja hozzá a következő using utasításokat a később használt típusokhoz.At the top of the FileCopyModule namespace, add the following using statements for types that are used later. A Microsoft. Azure. Devices. Client. Transport. Mqtt egy protokoll, amely üzeneteket küld IoT Edge hubhoz.Microsoft.Azure.Devices.Client.Transport.Mqtt is a protocol to send messages to IoT Edge Hub.

    namespace FileCopyModule
    {
        using Microsoft.Azure.Devices.Client.Transport.Mqtt;
        using Newtonsoft.Json;
    
  3. Adja hozzá a InputFolderPath és a OutputFolderPath változót a program osztályhoz.Add the InputFolderPath and OutputFolderPath variable to the Program class.

    class Program
        {
            static int counter;
            private const string InputFolderPath = "/home/input";
            private const string OutputFolderPath = "/home/output";
    
  4. Közvetlenül az előző lépés után adja hozzá a FileEvent osztályt az üzenet törzsének definiálásához.Immediately after the previous step, add the FileEvent class to define the message body.

    /// <summary>
    /// The FileEvent class defines the body of incoming messages. 
    /// </summary>
    private class FileEvent
    {
        public string ChangeType { get; set; }
    
        public string ShareRelativeFilePath { get; set; }
    
        public string ShareName { get; set; }
    }
    
  5. Az init metódusbana kód egy ModuleClient objektumot hoz létre és konfigurál.In the Init method, the code creates and configures a ModuleClient object. Ez az objektum lehetővé teszi, hogy a modul az üzenetek küldéséhez és fogadásához a helyi Azure IoT Edge futtatókörnyezethez kapcsolódjon MQTT protokoll használatával.This object allows the module to connect to the local Azure IoT Edge runtime using MQTT protocol to send and receive messages. Az Init metódusban használt kapcsolati sztringet az IoT Edge-futtatókörnyezet biztosítja a modulnak.The connection string that's used in the Init method is supplied to the module by the IoT Edge runtime. A kód regisztrálja a FileCopy visszahívást, hogy üzeneteket fogadjon egy IoT Edge hubhoz az input1 -végponton keresztül.The code registers a FileCopy callback to receive messages from an IoT Edge hub via the input1 endpoint. Cserélje le az init metódust a következő kódra.Replace the Init method with the following code.

    /// <summary>
    /// Initializes the ModuleClient and sets up the callback to receive
    /// messages containing file event information
    /// </summary>
    static async Task Init()
    {
        MqttTransportSettings mqttSetting = new MqttTransportSettings(TransportType.Mqtt_Tcp_Only);
        ITransportSettings[] settings = { mqttSetting };
    
        // Open a connection to the IoT Edge runtime
        ModuleClient ioTHubModuleClient = await ModuleClient.CreateFromEnvironmentAsync(settings);
        await ioTHubModuleClient.OpenAsync();
        Console.WriteLine("IoT Hub module client initialized.");
    
        // Register callback to be called when a message is received by the module
        await ioTHubModuleClient.SetInputMessageHandlerAsync("input1", FileCopy, ioTHubModuleClient);
    }
    
  6. Távolítsa el a PipeMessage metódus kódját, és helyezze be a helyére a FileCopykódot.Remove the code for PipeMessage method and in its place, insert the code for FileCopy.

        /// <summary>
        /// This method is called whenever the module is sent a message from the IoT Edge Hub.
        /// This method deserializes the file event, extracts the corresponding relative file path, and creates the absolute input file path using the relative file path and the InputFolderPath.
        /// This method also forms the absolute output file path using the relative file path and the OutputFolderPath. It then copies the input file to output file and deletes the input file after the copy is complete.
        /// </summary>
        static async Task<MessageResponse> FileCopy(Message message, object userContext)
        {
            int counterValue = Interlocked.Increment(ref counter);
    
            try
            {
                byte[] messageBytes = message.GetBytes();
                string messageString = Encoding.UTF8.GetString(messageBytes);
                Console.WriteLine($"Received message: {counterValue}, Body: [{messageString}]");
    
                if (!string.IsNullOrEmpty(messageString))
                {
                    var fileEvent = JsonConvert.DeserializeObject<FileEvent>(messageString);
    
                    string relativeFileName = fileEvent.ShareRelativeFilePath.Replace("\\", "/");
                    string inputFilePath = InputFolderPath + relativeFileName;
                    string outputFilePath = OutputFolderPath + relativeFileName;
    
                    if (File.Exists(inputFilePath))                
                    {
                        Console.WriteLine($"Moving input file: {inputFilePath} to output file: {outputFilePath}");
                        var outputDir = Path.GetDirectoryName(outputFilePath);
                        if (!Directory.Exists(outputDir))
                        {
                            Directory.CreateDirectory(outputDir);
                        }
    
                        File.Copy(inputFilePath, outputFilePath, true);
                        Console.WriteLine($"Copied input file: {inputFilePath} to output file: {outputFilePath}");
                        File.Delete(inputFilePath);
                        Console.WriteLine($"Deleted input file: {inputFilePath}");
                    } 
                    else
                    {
                        Console.WriteLine($"Skipping this event as input file doesn't exist: {inputFilePath}");   
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Caught exception: {0}", ex.Message);
                Console.WriteLine(ex.StackTrace);
            }
    
            Console.WriteLine($"Processed event.");
            return MessageResponse.Completed;
        }
    
  7. Mentse el ezt a fájlt.Save this file.

  8. A projekthez egy meglévő mintakód is letölthető .You can also download an existing code sample for this project. Ezután érvényesítheti a minta program.cs fájljában mentett fájlt.You can then validate the file that you saved against the program.cs file in this sample.

Az IoT Edge-megoldás összeállításaBuild your IoT Edge solution

Az előző szakaszban létrehozott egy IoT Edge megoldást, és hozzáadta a kódot a FileCopyModule, hogy fájlokat másoljon a helyi megosztásból a Felhőbeli megosztásba.In the previous section, you created an IoT Edge solution and added code to the FileCopyModule to copy files from local share to the cloud share. Most létre kell hoznia a megoldást tárolórendszerképként, és le kell küldenie a tárolóregisztrációs adatbázisba.Now you need to build the solution as a container image and push it to your container registry.

  1. A VSCode-ben nyissa meg a Terminal > New Terminal új Visual Studio Code integrált terminál megnyitásához.In VSCode, go to Terminal > New Terminal to open a new Visual Studio Code integrated terminal.

  2. Jelentkezzen be a Docker-be a következő parancs beírásával az integrált terminálon.Sign in to Docker by entering the following command in the integrated terminal.

    docker login <ACR login server> -u <ACR username>

    Használja a tároló-beállításjegyzékből másolt bejelentkezési kiszolgálót és felhasználónevet.Use the login server and username that you copied from your container registry.

    IoT Edge-megoldás létrehozása és leküldése

  3. Ha a rendszer jelszót kér, adja meg a jelszót.When prompted for password, supply the password. A bejelentkezési kiszolgáló, a Felhasználónév és a jelszó értékeit a Azure Portal tároló beállításjegyzékének hozzáférési kulcsaiból is lekérheti.You can also retrieve the values for login server, username, and password from the Access Keys in your container registry in the Azure portal.

  4. A hitelesítő adatok megadása után leküldheti a modul rendszerképét az Azure Container registrybe.Once the credentials are supplied, you can push your module image to your Azure container registry. A VS Code Explorerben kattintson a jobb gombbal a module.js fájlra, és válassza a IoT Edge megoldás létrehozása és leküldéselehetőséget.In the VS Code Explorer, right-click the module.json file and select Build and Push IoT Edge solution.

    IoT Edge 2. megoldás létrehozása és leküldése

    Ha közli a Visual Studio Code-ot a megoldás létrehozásával, az integrált terminálon két parancsot futtat: a Docker Build és a Docker push.When you tell Visual Studio Code to build your solution, it runs two commands in the integrated terminal: docker build and docker push. A két parancs létrehozza a kódot, tárolóba helyezi a CSharpModule.dll fájlt, majd leküldi a kódot a megoldás inicializálásakor megadott tárolóregisztrációs adatbázisba.These two commands build your code, containerize the CSharpModule.dll, and then push the code to the container registry that you specified when you initialized the solution.

    A rendszer kérni fogja a modul platformjának kiválasztását.You will be prompted to choose the module platform. Válassza ki a Linux rendszernek megfelelő amd64 elemet.Select amd64 corresponding to Linux.

    Platform kiválasztása

    Fontos

    Csak a Linux-modulok támogatottak.Only the Linux modules are supported.

    A következő figyelmeztetést láthatja, amelyet figyelmen kívül hagyhat:You may see the following warning that you can ignore:

    Program. cs (77, 44): figyelmeztetési CS1998: ez az aszinkron metódus nem rendelkezik "várakozási" operátorral, és szinkronban fog futni. Érdemes lehet a "várakozás" operátort használni, hogy a nem blokkoló API-hívásokat, vagy a "várakozási feladat. Run (...)" metódust használja a CPU-kötésű működéshez a háttérben futó szálon.Program.cs(77,44): warning CS1998: This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread.

  5. A VS Code integrált termináljában láthatja a teljes tárolórendszerképet címkével együtt.You can see the full container image address with tag in the VS Code integrated terminal. A képcímet a rendszer a module.jsfájl formátumát tartalmazó információból épül fel <repository>:<version>-<platform> .The image address is built from information that's in the module.json file with the format <repository>:<version>-<platform>. Ehhez a cikkhez hasonlóan kell kinéznie mycontreg2.azurecr.io/filecopymodule:0.0.1-amd64 .For this article, it should look like mycontreg2.azurecr.io/filecopymodule:0.0.1-amd64.

További lépésekNext steps

A modul Azure Stack Edge Pro platformon való üzembe helyezéséhez és futtatásához tekintse meg a modul hozzáadásacímű témakör lépéseit.To deploy and run this module on Azure Stack Edge Pro, see the steps in Add a module.