Utveckla en C# IoT Edge-modul för att flytta filer med Azure Stack Edge Pro FPGA

Viktigt!

Azure Stack Edge Pro FPGA-enheter når livets slut i februari 2024. Om du överväger nya distributioner rekommenderar vi att du utforskar Azure Stack Edge Pro 2 - eller Azure Stack Edge Pro GPU-enheter för dina arbetsbelastningar.

Den här artikeln beskriver hur du skapar en IoT Edge-modul för distribution med din Azure Stack Edge Pro FPGA-enhet. Azure Stack Edge Pro FPGA är en lagringslösning som gör att du kan bearbeta data och skicka dem via nätverk till Azure.

Du kan använda Azure IoT Edge-moduler med din Azure Stack Edge Pro FPGA för att transformera data när de flyttas till 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 molnresurs på din Azure Stack Edge Pro FPGA-enhet.

I den här artikeln kan du se hur du:

  • Skapa ett containerregister för att lagra och hantera dina moduler (Docker-avbildningar).
  • Skapa en IoT Edge-modul som ska distribueras på din Azure Stack Edge Pro FPGA-enhet.

Om IoT Edge-modulen

Din Azure Stack Edge Pro FPGA-enhet kan distribuera och köra IoT Edge-moduler. Edge-moduler är i huvudsak Docker-containrar som utför en specifik uppgift, till exempel att mata in ett meddelande från en enhet, transformera ett meddelande eller skicka ett meddelande till en IoT Hub. I den här artikeln skapar du en modul som kopierar filer från en lokal resurs till en molnresurs på din Azure Stack Edge Pro FPGA-enhet.

  1. Filer skrivs till den lokala resursen på din Azure Stack Edge Pro FPGA-enhet.
  2. Filhändelsegeneratorn skapar en filhändelse för varje fil som skrivs till den lokala resursen. Filhändelserna genereras också när en fil ändras. Filhändelserna skickas sedan till IoT Edge Hub (i IoT Edge-körning).
  3. Den anpassade IoT Edge-modulen bearbetar filhändelsen för att skapa ett filhändelseobjekt som också innehåller en relativ sökväg för filen. Modulen genererar en absolut sökväg med hjälp av den relativa filsökvägen och kopierar filen från den lokala resursen till molnresursen. Modulen tar sedan bort filen från den lokala resursen.

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

När filen finns i molnresursen laddas den automatiskt upp till ditt Azure Storage-konto.

Förutsättningar

Innan du kan börja bör du kontrollera att du har:

Skapa ett containerregister

Ett Azure-containerregister är ett privat Docker-register i Azure där du kan lagra och hantera dina privata Docker-containeravbildningar. De två populära Docker-registertjänsterna som är tillgängliga i molnet är Azure Container Registry och Docker Hub. I den här artikeln används Container Registry.

  1. Från en webbläsare går du till Azure-portalen.

  2. Välj Skapa ett containerregister för resurscontainrar >>. Klicka på Skapa.

  3. Ge:

    1. Ett unikt registernamn i Azure som innehåller 5 till 50 alfanumeriska tecken.

    2. Välj en prenumeration.

    3. Skapa en ny eller välj en befintlig resursgrupp.

    4. Välj en plats. Vi rekommenderar att den här platsen är samma som den som är associerad med Azure Stack Edge-resursen.

    5. Växla till Administratörsanvändare för att Aktivera.

    6. Ställ in SKU:n på Basic.

      Skapa containerregister

  4. Välj Skapa.

  5. När du har skapat ditt containerregister går du till det och väljer Åtkomstnycklar.

    Hämta åtkomstnycklar

  6. Kopiera värdena för Inloggningsserver, Användarnamn och Lösenord. Du använder dessa värden senare för att publicera Docker-avbildningen i registret och för att lägga till autentiseringsuppgifterna för registret i Azure IoT Edge-körningen.

Skapa ett projekt för IoT Edge-modulen

Följande steg skapar ett IoT Edge-modulprojekt baserat på .NET Core 2.1 SDK. Projektet använder Visual Studio Code och Azure IoT Edge-tillägget.

Skapa en ny lösning

Skapa en C#-lösningsmall som du kan anpassa med din egen kod.

  1. I Visual Studio Code väljer du Visa > kommandopalett för att öppna kommandopaletten för VS Code.

  2. Ange och kör kommandot Azure: Logga in på kommandopaletten och följ anvisningarna för att logga in med ditt Azure-konto. Om du redan är inloggad kan du hoppa över det här steget.

  3. Skriv och kör kommandot Azure IoT Edge: New IoT Edge solution (Ny IoT Edge-lösning) på kommandopaletten. Ange följande information i kommandopaletten för att skapa din lösning:

    1. Välj den mapp där du vill skapa lösningen.

    2. Ange ett namn för din lösning eller välj standardnamnet EdgeSolution.

      Skapa ny lösning 1

    3. Välj C# Module som mall för modulen.

    4. Ersätt standardmodulnamnet med det namn som du vill tilldela, i det här fallet är det FileCopyModule.

      Skapa ny lösning 2

    5. Ange det containerregister som du skapade i föregående avsnitt som avbildningslagringsplats för din första modul. Ersätt localhost:5000 med serverinloggningsvärdet som du kopierade.

      Den sista strängen ser ut som <Login server name>/<Module name>. I det här exemplet är strängen: mycontreg2.azurecr.io/filecopymodule.

      Skapa ny lösning 3

  4. Gå till Öppna filmapp>.

    Skapa ny lösning 4

  5. Bläddra och peka på mappen EdgeSolution som du skapade tidigare. VS Code-fönstret läser in din IoT Edge-lösningsarbetsyta med sina fem komponenter på den översta nivån. Du kommer inte att redigera .vscode-mappen, .gitignore-filen, .env-filen och deployment.template.json i den här artikeln.

    Den enda komponent som du ändrar är modulmappen. Den här mappen har C#-koden för din modul och Docker-filer för att skapa modulen som en containeravbildning.

    Skapa ny lösning 5

Uppdatera modulen med anpassad kod

  1. Öppna modulerna > FileCopyModule > Program.cs i VS Code-utforskaren.

  2. Överst i FileCopyModule-namnområdet lägger du till följande using-instruktioner för typer som används senare. Microsoft.Azure.Devices.Client.Transport.Mqtt är ett protokoll för att skicka meddelanden till IoT Edge Hub.

    namespace FileCopyModule
    {
        using Microsoft.Azure.Devices.Client.Transport.Mqtt;
        using Newtonsoft.Json;
    
  3. Lägg till variabeln InputFolderPath och OutputFolderPath i klassen Program.

    class Program
        {
            static int counter;
            private const string InputFolderPath = "/home/input";
            private const string OutputFolderPath = "/home/output";
    
  4. Omedelbart efter föregående steg lägger du till klassen FileEvent för att definiera meddelandetexten.

    /// <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 metoden Init skapar och konfigurerar koden ett ModuleClient-objekt. Med det här objektet kan modulen ansluta till den lokala Azure IoT Edge-körningen med hjälp av MQTT-protokollet för att skicka och ta emot meddelanden. Anslutningssträngen som används i Init-metoden skickas till modulen av IoT Edge-körningen. Koden registrerar ett FileCopy-återanrop för att ta emot meddelanden från en IoT Edge-hubb via indata1-slutpunkten . Ersätt Init-metoden med följande kod.

    /// <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 PipeMessage-metoden och infoga koden för FileCopy i stället.

        /// <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.

  8. Du kan också ladda ned ett befintligt kodexempel för det här projektet. Du kan sedan verifiera filen som du sparade mot den program.cs filen i det här exemplet.

Skapa din IoT Edge-lösning

I föregående avsnitt skapade du en IoT Edge-lösning och lade till kod i FileCopyModule för att kopiera filer från lokal resurs till molnresursen. Nu behöver du bygga lösningen som en containeravbildning och push-överföra den till ditt containerregister.

  1. I VSCode går du till Terminal > New Terminal för att öppna en ny integrerad Terminal för Visual Studio Code.

  2. Logga in på Docker genom att ange följande kommando i den integrerade terminalen.

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

    Använd inloggningsservern och användarnamnet som du kopierade från containerregistret.

    Skapa och push-överföra IoT Edge-lösning

  3. Ange lösenordet när du uppmanas att ange lösenord. Du kan också hämta värdena för inloggningsserver, användarnamn och lösenord från åtkomstnycklarna i containerregistret i Azure-portalen.

  4. När autentiseringsuppgifterna har angetts kan du skicka modulavbildningen till azure-containerregistret. I VS Code Explorer högerklickar du på filen module.json och väljer Build and Push IoT Edge solution (Skapa och push-lösning för IoT Edge).

    Skapa och push-överföra IoT Edge-lösning 2

    När du uppmanar Visual Studio Code att skapa din lösning körs två kommandon i den integrerade terminalen: docker build och 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.

    Du uppmanas att välja modulplattformen. Välj amd64 som motsvarar Linux.

    Välj plattform

    Viktigt!

    Endast Linux-moduler stöds.

    Du kan se följande varning som du kan ignorera:

    Program.cs(77,44): varning CS1998: Den här asynkrona metoden saknar "await"-operatorer och körs synkront. Överväg att använda operatorn "await" för att vänta på icke-blockerande API-anrop, eller "await Task.Run(...)" för att utföra CPU-bundet arbete i en bakgrundstråd.

  5. Den fullständiga adressen med tagg för containeravbildningen finns i den integrerade VS Code-terminalen. Avbildningsadressen skapas från information som finns i filen module.json med formatet <repository>:<version>-<platform>. I den här artikeln bör den se ut som mycontreg2.azurecr.io/filecopymodule:0.0.1-amd64.

Nästa steg

Information om hur du distribuerar och kör den här modulen på Azure Stack Edge Pro FPGA finns i stegen i Lägg till en modul.