Vývoj modulu IoT Edge v C# pro přesun souborů pomocí Azure Stack Edge Pro FPGA

Důležité

Zařízení Azure Stack Edge Pro FPGA dosáhnou konce životnosti v únoru 2024. Pokud uvažujete o nových nasazeních, doporučujeme prozkoumat zařízení Azure Stack Edge Pro 2 nebo Azure Stack Edge Pro GPU pro vaše úlohy.

Tento článek vás provede procesem vytvoření modulu IoT Edge pro nasazení pomocí zařízení Azure Stack Edge Pro FPGA. Azure Stack Edge Pro FPGA je řešení úložiště, které umožňuje zpracovávat data a odesílat je přes síť do Azure.

Pomocí modulů Azure IoT Edge se službou Azure Stack Edge Pro FPGA můžete transformovat data při jejich přesunu do Azure. Modul použitý v tomto článku implementuje logiku pro kopírování souboru z místní sdílené složky do cloudové sdílené složky na zařízení Azure Stack Edge Pro FPGA.

V tomto článku získáte informace o těchto tématech:

  • Vytvořte registr kontejneru pro ukládání a správu modulů (imagí Dockeru).
  • Vytvořte modul IoT Edge pro nasazení na zařízení Azure Stack Edge Pro FPGA.

Informace o modulu IoT Edge

Vaše zařízení Azure Stack Edge Pro FPGA může nasazovat a spouštět moduly IoT Edge. Moduly Edge jsou v podstatě kontejnery Dockeru, které provádějí konkrétní úlohu, jako je příjem zprávy ze zařízení, transformace zprávy nebo odeslání zprávy do IoT Hubu. V tomto článku vytvoříte modul, který kopíruje soubory z místní sdílené složky do cloudové sdílené složky na zařízení Azure Stack Edge Pro FPGA.

  1. Soubory se zapisují do místní sdílené složky na zařízení Azure Stack Edge Pro FPGA.
  2. Generátor událostí souboru vytvoří událost souboru pro každý soubor zapsaný do místní sdílené složky. Události souboru se generují také při úpravě souboru. Události souborů se pak odesílají do ioT Edge Hubu (v modulu runtime IoT Edge).
  3. Vlastní modul IoT Edge zpracovává událost souboru a vytvoří objekt události souboru, který obsahuje také relativní cestu k souboru. Modul vygeneruje absolutní cestu pomocí relativní cesty k souboru a zkopíruje soubor z místní sdílené složky do cloudové sdílené složky. Modul pak odstraní soubor z místní sdílené složky.

Jak funguje modul Azure IoT Edge ve službě Azure Stack Edge Pro FPGA

Jakmile je soubor v cloudové sdílené složce, automaticky se nahraje do vašeho účtu Azure Storage.

Požadavky

Dříve začnete, ujistěte se, že máte:

Vytvoření registru kontejneru

Registr kontejnerů Azure je privátním registrem Dockeru v Azure, kde můžete ukládat a spravovat privátní image kontejnerů Dockeru. Dvě oblíbené služby registru Dockeru dostupné v cloudu jsou Azure Container Registry a Docker Hub. Tento článek používá službu Container Registry.

  1. V prohlížeči zarovnáte na web Azure Portal.

  2. Vyberte Vytvořit kontejner kontejnerů > prostředků>. Klikněte na Vytvořit.

  3. Poskytnout:

    1. Jedinečný název registru v Azure, který obsahuje 5 až 50 alfanumerických znaků.

    2. Zvolte Předplatné.

    3. Vytvořte novou nebo zvolte existující skupinu prostředků.

    4. Vyberte Umístění. Doporučujeme, aby toto umístění bylo stejné jako přidružené k prostředku Azure Stack Edge.

    5. Přepněte přepínač Uživatel s rolí správce na Povolit.

    6. Nastavte skladovou položku na Basic.

      Vytvoření registru kontejneru

  4. Vyberte Vytvořit.

  5. Po vytvoření registru kontejneru do něj přejděte a vyberte Přístupové klíče.

    Získání přístupových klíčů

  6. Zkopírujte hodnoty pro Přihlašovací server, Uživatelské jméno a Heslo. Tyto hodnoty použijete později k publikování image Dockeru do registru a k přidání přihlašovacích údajů registru do modulu runtime Azure IoT Edge.

Vytvoření projektu modulu IoT Edge

Následující kroky vytvoří projekt modulu IoT Edge založený na sadě .NET Core 2.1 SDK. Projekt používá Visual Studio Code a rozšíření Azure IoT Edge.

Vytvoření nového řešení

Vytvořte šablonu řešení v jazyce C#, kterou můžete přizpůsobit pomocí vlastního kódu.

  1. V editoru Visual Studio Code výběrem palety příkazů Zobrazit > otevřete paletu příkazů VS Code.

  2. Na paletě příkazů zadejte a spusťte příkaz Azure: Sign in (Azure: Přihlásit se) a postupujte podle pokynů pro přihlášení k účtu Azure. Pokud už přihlášení jste, můžete tento krok přeskočit.

  3. Na paletě příkazů zadejte a spusťte příkaz Azure IoT Edge: New IoT Edge solution (Azure IoT Edge: Nové řešení IoT Edge). Na paletě příkazů zadejte následující informace k vytvoření řešení:

    1. Vyberte složku, ve které chcete vytvořit řešení.

    2. Zadejte název pro vaše řešení nebo přijměte výchozí název EdgeSolution.

      Vytvoření nového řešení 1

    3. Jako šablonu modulu zvolte C# Module.

    4. Nahraďte výchozí název modulu názvem, který chcete přiřadit, v tomto případě fileCopyModule.

      Vytvoření nového řešení 2

    5. Jako úložiště image pro první modul zadejte registr kontejneru, který jste vytvořili v předchozí části. Nahraďte localhost:5000 hodnotou pro přihlašovací server, kterou jste zkopírovali.

      Konečný řetězec vypadá takto <Login server name>/<Module name>. V tomto příkladu je řetězec: mycontreg2.azurecr.io/filecopymodule.

      Vytvoření nového řešení 3

  4. Přejděte do složky Otevřít soubor>.

    Vytvoření nového řešení 4

  5. Přejděte do složky EdgeSolution, kterou jste vytvořili dříve. Okno VS Code načte pracovní prostor řešení IoT Edge s pěti komponentami nejvyšší úrovně. Nebudete upravovat složku .vscode , soubor .gitignore , soubor .env a deployment.template.json v tomto článku.

    Jedinou komponentou, kterou upravíte, je složka modulů. Tato složka obsahuje kód jazyka C# pro modul a soubory Dockeru pro sestavení modulu jako image kontejneru.

    Vytvoření nového řešení 5

Aktualizace modulu pomocí vlastního kódu

  1. V průzkumníku VS Code otevřete moduly > FileCopyModule > Program.cs.

  2. V horní části oboru názvů FileCopyModule přidejte následující příkazy using pro typy, které se používají později. Microsoft.Azure.Devices.Client.Transport.Mqtt je protokol pro odesílání zpráv do ioT Edge Hubu.

    namespace FileCopyModule
    {
        using Microsoft.Azure.Devices.Client.Transport.Mqtt;
        using Newtonsoft.Json;
    
  3. Přidejte do třídy Program proměnnou InputFolderPath a OutputFolderPath .

    class Program
        {
            static int counter;
            private const string InputFolderPath = "/home/input";
            private const string OutputFolderPath = "/home/output";
    
  4. Ihned po předchozím kroku přidejte třídu FileEvent pro definování textu zprávy.

    /// <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. V metodě Init kódem vytvoříte a nakonfigurujete objekt ModuleClient. Tento objekt umožňuje modulu připojit se k místnímu modulu runtime Azure IoT Edge pomocí protokolu MQTT pro odesílání a příjem zpráv. Modul runtime IoT Edge poskytne modulu připojovací řetězec používaný metodou Init. Kód zaregistruje zpětné volání FileCopy pro příjem zpráv z centra IoT Edge prostřednictvím koncového bodu input1 . Nahraďte inicializační metodu následujícím kódem.

    /// <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. Odeberte kód metody PipeMessage a na jeho místě vložte kód pro 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. Soubor uložte.

  8. Můžete si také stáhnout existující ukázku kódu pro tento projekt. Pak můžete ověřit soubor, který jste uložili do souboru program.cs v této ukázce.

Vytvoření řešení IoT Edge

V předchozí části jste vytvořili řešení IoT Edge a do FileCopyModule jste přidali kód pro kopírování souborů z místní sdílené složky do cloudové sdílené složky. Teď je potřeba sestavit toto řešení jako image kontejneru a odeslat ho do registru kontejneru.

  1. V nástroji VSCode přejděte do terminálu > New Terminal a otevřete nový integrovaný terminál editoru Visual Studio Code.

  2. Přihlaste se k Dockeru zadáním následujícího příkazu v integrovaném terminálu.

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

    Použijte přihlašovací server a uživatelské jméno, které jste zkopírovali z registru kontejneru.

    Sestavování a nabízení řešení IoT Edge

  3. Po zobrazení výzvy k zadání hesla zadejte heslo. Hodnoty přihlašovacího serveru, uživatelského jména a hesla můžete načíst také z přístupových klíčů v registru kontejneru na webu Azure Portal.

  4. Po zadání přihlašovacích údajů můžete image modulu odeslat do registru kontejneru Azure. V Průzkumníku VS Code klikněte pravým tlačítkem na soubor module.json a vyberte Sestavit a odeslat řešení IoT Edge.

    Sestavování a nabízení řešení IoT Edge 2

    Když visual Studio Code řeknete, aby sestavil řešení, spustí v integrovaném terminálu dva příkazy: docker build a docker push. Tyto dva příkazy sestaví kód, provedou kontejnerizaci vaší knihovny CSharpModule.dll a odešlou ji do registru kontejneru, který jste zadali při inicializaci řešení.

    Zobrazí se výzva k výběru platformy modulu. Vyberte amd64 odpovídající Linuxu.

    Vybrat platformu

    Důležité

    Podporují se jenom moduly Linuxu.

    Může se zobrazit následující upozornění, které můžete ignorovat:

    Program.cs(77;44): upozornění CS1998: Tato asynchronní metoda nemá operátory await a spustí se synchronně. Zvažte použití operátoru await k čekání neblokujících volání rozhraní API nebo operátor await Task.Run(...) k provedení práce vázané na procesor na vlákně na pozadí.

  5. Úplnou adresu image kontejneru se značkou můžete vidět v integrovaném terminálu VS Code. Adresa obrázku je sestavena z informací, které jsou v souboru module.json ve formátu <repository>:<version>-<platform>. Pro tento článek by měl vypadat jako mycontreg2.azurecr.io/filecopymodule:0.0.1-amd64.

Další kroky

Pokud chcete tento modul nasadit a spustit v Azure Stack Edge Pro FPGA, přečtěte si postup v tématu Přidání modulu.