Utveckla en C# IoT Edge-modul för att flytta filer med Azure Stack Edge ProDevelop a C# IoT Edge module to move files with Azure Stack Edge Pro

Den här artikeln beskriver hur du skapar en IoT Edge-modul för distribution med din Azure Stack Edge Pro-enhet.This article steps you through how to create an IoT Edge module for deployment with your Azure Stack Edge Pro device. Azure Stack Edge Pro är en lagrings lösning som gör att du kan bearbeta data och skicka dem över nätverket till Azure.Azure Stack Edge Pro is a storage solution that allows you to process data and send it over network to Azure.

Du kan använda Azure IoT Edge moduler med Azure Stack Edge Pro för att transformera data när de flyttas till Azure.You can use Azure IoT Edge modules with your Azure Stack Edge Pro to transform the data as it moved to Azure. Modulen som används i den här artikeln implementerar logiken för att kopiera en fil från en lokal resurs till en moln resurs på din Azure Stack Edge Pro-enhet.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.

I den här artikeln kan du se hur du:In this article, you learn how to:

  • Skapa ett behållar register för att lagra och hantera dina moduler (Docker-avbildningar).Create a container registry to store and manage your modules (Docker images).
  • Skapa en IoT Edge-modul som ska distribueras på din Azure Stack Edge Pro-enhet.Create an IoT Edge module to deploy on your Azure Stack Edge Pro device.

Om modulen IoT EdgeAbout the IoT Edge module

Din Azure Stack Edge Pro-enhet kan distribuera och köra IoT Edge moduler.Your Azure Stack Edge Pro device can deploy and run IoT Edge modules. Edge-moduler är i princip Docker-behållare som utför en speciell uppgift, till exempel mata in ett meddelande från en enhet, transformera ett meddelande eller skicka ett meddelande till ett IoT Hub.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. I den här artikeln ska du skapa en modul som kopierar filer från en lokal resurs till en moln resurs på din Azure Stack Edge Pro-enhet.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. Filerna skrivs till den lokala resursen på din Azure Stack Edge Pro-enhet.Files are written to the local share on your Azure Stack Edge Pro device.
  2. Fil händelse generatorn skapar en fil händelse för varje fil som skrivs till den lokala resursen.The file event generator creates a file event for each file written to the local share. Fil händelserna skapas också när en fil ändras.The file events are also generated when a file is modified. Fil händelserna skickas sedan till IoT Edge Hub (i IoT Edge Runtime).The file events are then sent to IoT Edge Hub (in IoT Edge runtime).
  3. Den anpassade modulen IoT Edge bearbetar fil händelsen för att skapa ett fil händelse objekt som också innehåller en relativ sökväg till filen.The IoT Edge custom module processes the file event to create a file event object that also contains a relative path for the file. Modulen genererar en absolut sökväg med den relativa fil Sök vägen och kopierar filen från den lokala resursen till moln resursen.The module generates an absolute path using the relative file path and copies the file from the local share to the cloud share. Modulen tar sedan bort filen från den lokala resursen.The module then deletes the file from the local share.

Så här fungerar Azure IoT Edge-modulen på Azure Stack Edge Pro

När filen finns i moln resursen överförs den automatiskt till ditt Azure Storage-konto.Once the file is in the cloud share, it automatically gets uploaded to your Azure Storage account.

FörutsättningarPrerequisites

Innan du börjar ska du kontrollera att du har:Before you begin, make sure you have:

Skapa ett containerregisterCreate a container registry

Ett Azure-containerregister är ett privat Docker-register i Azure där du kan lagra och hantera dina privata Docker-containeravbildningar.An Azure container registry is a private Docker registry in Azure where you can store and manage your private Docker container images. De två populära Docker-register tjänsterna som är tillgängliga i molnet är Azure Container Registry och Docker Hub.The two popular Docker registry services available in the cloud are Azure Container Registry and Docker Hub. Den här artikeln använder Container Registry.This article uses the Container Registry.

  1. Logga in på Azure Portal på https://portal.azure.com.Sign in to the Azure portal at https://portal.azure.com.

  2. Välj skapa en resurs > behållare > container Registry.Select Create a resource > Containers > Container Registry. Klicka på Skapa.Click Create.

  3. AnvändaProvide:

    1. Ett unikt register namn i Azure som innehåller 5 till 50 alfanumeriska tecken.A unique Registry name within Azure that contains 5 to 50 alphanumeric characters.

    2. Välj en prenumeration.Choose a Subscription.

    3. Skapa en ny eller Välj en befintlig resurs grupp.Create new or choose an existing Resource group.

    4. Välj en plats.Select a Location. Vi rekommenderar att den här platsen är samma som den som är kopplad till Azure Stack Edge-resursen.We recommend that this location be the same as that is associated with the Azure Stack Edge resource.

    5. Växla till Administratörsanvändare för att Aktivera.Toggle Admin user to Enable.

    6. Ange SKU: n till Basic.Set the SKU to Basic.

      Skapa containerregister

  4. Välj Skapa.Select Create.

  5. När du har skapat ditt containerregister går du till det och väljer Åtkomstnycklar.After your container registry is created, browse to it, and select Access keys.

    Hämta åtkomst nycklar

  6. Kopiera värdena för Inloggningsserver, Användarnamn och Lösenord.Copy the values for Login server, Username, and Password. Du kan använda dessa värden senare för att publicera Docker-avbildningen i registret och lägga till registervärdena i Azure IoT Edge Runtime.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.

Skapa ett projekt för IoT Edge-modulenCreate an IoT Edge module project

Följande steg skapar ett IoT Edge module-projekt baserat på .NET Core 2,1 SDK.The following steps create an IoT Edge module project based on the .NET Core 2.1 SDK. Projektet använder Visual Studio Code och Azure IoT Edge-tillägget.The project uses Visual Studio Code and the Azure IoT Edge extension.

Skapa en ny lösningCreate a new solution

Skapa en C#-lösningsmall som du kan anpassa med din egen kod.Create a C# solution template that you can customize with your own code.

  1. I Visual Studio Code väljer du visa > kommando palett för att öppna kommando paletten vs Code.In Visual Studio Code, select View > Command Palette to open the VS Code command palette.

  2. Ange och kör kommandot Azure: Logga in i kommandopaletten och följ anvisningarna för att logga in med ditt Azure-konto.In the command palette, enter and run the command Azure: Sign in and follow the instructions to sign in your Azure account. Om du redan är inloggad kan du hoppa över det här steget.If you're already signed in, you can skip this step.

  3. Skriv och kör kommandot Azure IoT Edge: New IoT Edge solution (Ny IoT Edge-lösning) på kommandopaletten.In the command palette, enter and run the command Azure IoT Edge: New IoT Edge solution. Ange följande information i kommandopaletten för att skapa din lösning:In the command palette, provide the following information to create your solution:

    1. Välj den mapp där du vill skapa lösningen.Select the folder where you want to create the solution.

    2. Ange ett namn för din lösning eller välj standardnamnet EdgeSolution.Provide a name for your solution or accept the default EdgeSolution.

      Skapa ny lösning 1

    3. Välj C#-modul som mall.Choose C# Module as the module template.

    4. Ersätt namnet på standardmodulen med det namn som du vill tilldela, i det här fallet är det FileCopyModule.Replace the default module name with the name you want to assign, in this case, it is FileCopyModule.

      Skapa ny lösning 2

    5. Ange det behållar register som du skapade i föregående avsnitt som avbildnings lagrings plats för din första modul.Specify the container registry that you created in the previous section as the image repository for your first module. Ersätt localhost:5000 med det serverinloggningsvärde som du kopierade.Replace localhost:5000 with the login server value that you copied.

      Den slutliga strängen ser ut som <Login server name>/<Module name> .The final string looks like <Login server name>/<Module name>. I det här exemplet är strängen: mycontreg2.azurecr.io/filecopymodule .In this example, the string is: mycontreg2.azurecr.io/filecopymodule.

      Skapa ny lösning 3

  4. Gå till filen > öppna mappen.Go to File > Open Folder.

    Skapa ny lösning 4

  5. Bläddra och peka på EdgeSolution -mappen som du skapade tidigare.Browse and point to the EdgeSolution folder that you created earlier. VS Code-fönstret läser in din IoT Edge lösnings arbets yta med dess fem toppnivå komponenter.The VS Code window loads your IoT Edge solution workspace with its five top-level components. Du kan inte redigera . VSCode -mappen, . gitignore -filen, . miljö filen och deployment.template.js i i den här artikeln.You won't edit the .vscode folder, .gitignore file, .env file, and the deployment.template.json in this article.

    Den enda komponent som du ändrar är mappen moduler.The only component that you modify is the modules folder. Den här mappen har C#-koden för din modul och Docker-filer för att bygga modulen som en behållar avbildning.This folder has the C# code for your module and Docker files to build your module as a container image.

    Skapa ny lösning 5

Uppdatera modulen med anpassad kodUpdate the module with custom code

  1. I VS Code-Utforskaren öppnar du moduler > FileCopyModule > program.cs.In the VS Code explorer, open modules > FileCopyModule > Program.cs.

  2. Längst upp i FileCopyModule- namnområdetlägger du till följande using-instruktioner för typer som används senare.At the top of the FileCopyModule namespace, add the following using statements for types that are used later. Microsoft. Azure. devices. client. transport. MQTT är ett protokoll för att skicka meddelanden till IoT Edge Hub.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. Lägg till variabeln InputFolderPath och OutputFolderPath i program klassen.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. Direkt efter föregående steg lägger du till FileEvent -klassen för att definiera meddelande texten.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. I init-metodenskapar och konfigurerar koden ett ModuleClient -objekt.In the Init method, the code creates and configures a ModuleClient object. Med det här objektet kan modulen ansluta till den lokala Azure IoT Edge runtime med hjälp av MQTT-protokollet för att skicka och ta emot meddelanden.This object allows the module to connect to the local Azure IoT Edge runtime using MQTT protocol to send and receive messages. Anslutningssträngen som används i Init-metoden skickas till modulen av IoT Edge-körningen.The connection string that's used in the Init method is supplied to the module by the IoT Edge runtime. Koden registrerar ett FileCopy-återanrop för att ta emot meddelanden från en IoT Edge hubb via INPUT1 -slutpunkten.The code registers a FileCopy callback to receive messages from an IoT Edge hub via the input1 endpoint. Ersätt init-metoden med följande kod.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. Ta bort koden för metoden PipeMessage och infoga koden för FileCopyi dess ställe.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. Spara filen.Save this file.

  8. Du kan också Hämta ett befintligt kod exempel för det här projektet.You can also download an existing code sample for this project. Du kan sedan validera filen som du sparade mot filen program.cs i det här exemplet.You can then validate the file that you saved against the program.cs file in this sample.

Skapa din IoT Edge-lösningBuild your IoT Edge solution

I föregående avsnitt skapade du en IoT Edge-lösning och lagt till kod i FileCopyModule för att kopiera filer från lokal resurs till moln resursen.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. Nu behöver du skapa lösningen som en containeravbildning och push-överföra den till ditt containerregister.Now you need to build the solution as a container image and push it to your container registry.

  1. I VSCode går du till Terminal > New Terminal för att öppna en ny Visual Studio Code-integrerad Terminal.In VSCode, go to Terminal > New Terminal to open a new Visual Studio Code integrated terminal.

  2. Logga in på Docker genom att ange följande kommando i den integrerade terminalen.Sign in to Docker by entering the following command in the integrated terminal.

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

    Använd den inloggnings Server och det användar namn som du kopierade från behållar registret.Use the login server and username that you copied from your container registry.

    Lösning för att bygga och push IoT Edge

  3. Ange lösen ordet när du uppmanas att ange lösen ord.When prompted for password, supply the password. Du kan också hämta värdena för inloggnings Server, användar namn och lösen ord från åtkomst nycklarna i behållar registret i Azure Portal.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. När du har angett autentiseringsuppgifterna kan du skicka modulens avbildning till Azure Container Registry.Once the credentials are supplied, you can push your module image to your Azure container registry. I VS Code-Utforskaren högerklickar du på module.jspå filen och väljer Build och push IoT Edge-lösning.In the VS Code Explorer, right-click the module.json file and select Build and Push IoT Edge solution.

    Build och push IoT Edge lösning 2

    När du anger Visual Studio Code för att bygga lösningen, körs två kommandon i den integrerade terminalen: Docker-build och 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. Dessa två kommandon skapar din kod, bäddar in CSharpModule.dll i en container och skickar sedan koden till det containerregister som du angav när du initierade lösningen.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.

    Du uppmanas att välja modul-plattformen.You will be prompted to choose the module platform. Välj amd64 som motsvarar Linux.Select amd64 corresponding to Linux.

    Välj plattform

    Viktigt

    Endast Linux-moduler stöds.Only the Linux modules are supported.

    Du kan se följande varning att du kan ignorera:You may see the following warning that you can ignore:

    Program. CS (77, 44): varning CS1998: den här asynkrona metoden saknar await-operatorer och kommer att köras synkront. Överväg att använda operatorn "await" för att vänta på icke-blockerande API-anrop, eller "vänta aktivitet. Run (...)" för att göra CPU-kopplat arbete på en bakgrunds tråd.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. Den fullständiga adressen med tagg för containeravbildningen finns i den integrerade VS Code-terminalen.You can see the full container image address with tag in the VS Code integrated terminal. Bild adressen skapas utifrån den information som finns i module.jsfilen med formatet <repository>:<version>-<platform> .The image address is built from information that's in the module.json file with the format <repository>:<version>-<platform>. I den här artikeln bör den se ut mycontreg2.azurecr.io/filecopymodule:0.0.1-amd64 .For this article, it should look like mycontreg2.azurecr.io/filecopymodule:0.0.1-amd64.

Nästa stegNext steps

Om du vill distribuera och köra modulen på Azure Stack Edge Pro, se stegen i lägga till en modul.To deploy and run this module on Azure Stack Edge Pro, see the steps in Add a module.