C# IoT Edge-modul fejlesztése fájlok áthelyezéséhez az Azure Stack Edge Pro FPGA-val

Fontos

Az Azure Stack Edge Pro FPGA-eszközök 2024 februárjában érik el az üzemidőt. Ha új üzembe helyezéseket fontolgat, javasoljuk, hogy vizsgálja meg az Azure Stack Edge Pro 2-t vagy az Azure Stack Edge Pro GPU-eszközöket a számítási feladatokhoz.

Ez a cikk bemutatja, hogyan hozhat létre IoT Edge-modult üzembe helyezéshez az Azure Stack Edge Pro FPGA-eszközével. Az Azure Stack Edge Pro FPGA egy tárolási megoldás, amely lehetővé teszi az adatok feldolgozását és hálózaton keresztüli küldését az Azure-ba.

Az Azure IoT Edge-modulokkal az Azure Stack Edge Pro FPGA-val átalakíthatja az adatokat az Azure-ba való áthelyezés során. A cikkben használt modul implementálja azt a logikát, amellyel fájlokat másolhat egy helyi megosztásból egy felhőbeli megosztásba az Azure Stack Edge Pro FPGA-eszközön.

Ebben a cikkben az alábbiakkal ismerkedhet meg:

  • Hozzon létre egy tárolóregisztrációs adatbázist a modulok tárolásához és kezeléséhez (Docker-rendszerképek).
  • Hozzon létre egy IoT Edge-modult az Azure Stack Edge Pro FPGA-eszközön való üzembe helyezéshez.

Az IoT Edge modul ismertetése

Az Azure Stack Edge Pro FPGA-eszköz képes IoT Edge-modulok üzembe helyezésére és futtatására. Az Edge-modulok lényegében olyan Docker-tárolók, amelyek egy adott feladatot hajtanak végre, például üzeneteket fogadnak egy eszközről, átalakítanak egy üzenetet, vagy üzenetet küldenek egy IoT Hubnak. Ebben a cikkben egy modult fog létrehozni, amely fájlokat másol egy helyi megosztásról egy felhőbeli megosztásra az Azure Stack Edge Pro FPGA-eszközön.

  1. A fájlokat a rendszer az Azure Stack Edge Pro FPGA-eszközön lévő helyi megosztásra írja.
  2. A fájlesemény-generátor létrehoz egy fájleseményt a helyi megosztásba írt összes fájlhoz. A fájlesemények a fájl módosításakor is létre lesznek hozva. Ezután a rendszer elküldi a fájleseményeket az IoT Edge Hubnak (IoT Edge-futtatókörnyezetben).
  3. Az IoT Edge egyéni modul feldolgozza a fájleseményt egy olyan fájlesemény-objektum létrehozásához, amely a fájl relatív elérési útját is tartalmazza. A modul abszolút elérési utat hoz létre a relatív fájl elérési útjának használatával, és a fájlt a helyi megosztásból a felhőbeli megosztásba másolja. A modul ezután törli a fájlt a helyi megosztásból.

Az Azure IoT Edge modul működése az Azure Stack Edge Pro FPGA-n

Miután a fájl bekerül a felhőbeli megosztásba, a rendszer automatikusan feltölti azt az Azure Storage-fiókjába.

Előfeltételek

Mielőtt hozzákezd, győződjön meg arról, hogy rendelkezik az alábbiakkal:

Container Registry létrehozása

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. A felhőben elérhető két népszerű Docker-beállításjegyzék-szolgáltatás az Azure Container Registry és a Docker Hub. Ez a cikk a Tárolóregisztrációs adatbázist használja.

  1. Böngészőből lépjen be az Azure Portalra.

  2. Válassza az Erőforrástárolók >> tárolóregisztrációs adatbázisának létrehozása lehetőséget. Kattintson a Létrehozás gombra.

  3. Adja meg a következőt:

    1. Egyedi beállításjegyzék-név az Azure-ban, amely 5–50 alfanumerikus karaktert tartalmaz.

    2. Válasszon előfizetést .

    3. Hozzon létre újat, vagy válasszon egy meglévő erőforráscsoportot.

    4. Válasszon ki egy helyet. Javasoljuk, hogy ez a hely ugyanaz legyen, mint az Azure Stack Edge-erőforráshoz társított hely.

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

    6. Állítsa az SKU-t Alapszintűre.

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

  4. Válassza a Létrehozás lehetőséget.

  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.

    Hozzáférési kulcsok lekérése

  6. Másolja a Bejelentkezési kiszolgáló, a Felhasználónév és a Jelszó értékeit. Ezeket az értékeket később felhasználhatja a Docker-rendszerkép beállításjegyzékben való közzétételéhez és a beállításjegyzék hitelesítő adatainak az Azure IoT Edge-futtatókörnyezethez való hozzáadásához.

IoT Edge-modulprojekt létrehozása

Az alábbi lépések létrehoznak egy IoT Edge-modulprojektet a .NET Core 2.1 SDK alapján. A projekt a Visual Studio Code-ot és az Azure IoT Edge-bővítményt használja.

Új megoldás létrehozása

Létrehozhat egy C#-megoldást, amelyet a saját kódjával testreszabhat.

  1. A Visual Studio Code-ban válassza a Parancskatalógus megtekintése > lehetőséget a VS Code parancskatalógusának megnyitásához.

  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. Ha már be van jelentkezve, ezt a lépést kihagyhatja.

  3. A parancskatalógusban írja be és futtassa az Azure IoT Edge: New IoT Edge solution parancsot. A parancskatalógusban adja meg az alábbi információkat a megoldás létrehozásához:

    1. Válassza ki azt a mappát, ahol a megoldást létre szeretné hozni.

    2. Adja meg a megoldás nevét, vagy fogadja el az alapértelmezett EdgeSolution nevet.

      Új megoldás létrehozása 1

    3. A modul sablonjaként válassza a C# modult.

    4. Cserélje le az alapértelmezett modulnevet a hozzárendelni kívánt névre, ebben az esetben ez a FileCopyModule.

      Új megoldás létrehozása 2

    5. Adja meg az előző szakaszban létrehozott tárolóregisztrációs adatbázist az első modul képadattáraként. Cserélje le a localhost:5000 értéket a bejelentkezési kiszolgáló kimásolt értékére.

      Az utolsó sztring így <Login server name>/<Module name>néz ki: . Ebben a példában a sztring a következő: mycontreg2.azurecr.io/filecopymodule.

      Új megoldás létrehozása 3

  4. Nyissa meg a Fájlmegnyitás > mappát.

    Új megoldás létrehozása 4

  5. Tallózással mutasson a korábban létrehozott EdgeSolution mappára. A VS Code ablak betölti az IoT Edge-megoldás munkaterületét az öt legfelső szintű összetevőjével. A cikkben szereplő .vscode mappát, .gitignore fájlt, .env fájlt és deployment.template.json nem fogja szerkeszteni.

    Az egyetlen módosítandó összetevő a modulok mappája. Ez a mappa tartalmazza a modul C#-kódját és a Docker-fájlokat a modul tárolólemezképként való létrehozásához.

    Új megoldás létrehozása 5

A modul módosítása egyéni kóddal

  1. A VS Code Explorerben nyissa meg a FileCopyModule > Program.cs modulokat>.

  2. A FileCopyModule névtér tetején adja hozzá az alábbi utasításokat a később használt típusokhoz. A Microsoft.Azure.Devices.Client.Transport.Mqtt protokoll használatával üzeneteket küldhet az IoT Edge Hubnak.

    namespace FileCopyModule
    {
        using Microsoft.Azure.Devices.Client.Transport.Mqtt;
        using Newtonsoft.Json;
    
  3. Adja hozzá az InputFolderPath és az OutputFolderPath változót a Program osztályhoz.

    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 meghatározásához.

    /// <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ódus használata esetén a kód létrehoz és konfigurál egy ModuleClient objektumot. Ez az objektum lehetővé teszi, hogy a modul MQTT protokollal csatlakozzon a helyi Azure IoT Edge-futtatókörnyezethez üzenetek küldéséhez és fogadásához. Az Init metódusban használt kapcsolati sztringet az IoT Edge-futtatókörnyezet biztosítja a modulnak. A kód regisztrál egy FileCopy-visszahívást, hogy üzeneteket fogadjon egy IoT Edge-központból a bemeneti1 végponton keresztül. Cserélje le az Init metódust a következő kódra.

    /// <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 a helyén szúrja be a FileCopy kódját.

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

  8. A projekthez egy meglévő kódmintát is letölthet. Ezután ellenőrizheti a mintában szereplő program.cs fájlra mentett fájlt.

Az IoT Edge-megoldás összeállítása

Az előző szakaszban létrehozott egy IoT Edge-megoldást, és kódot adott hozzá a FileCopyModule-hoz a fájlok helyi megosztásból a felhőbeli megosztásba való másolásához. 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.

  1. A VSCode-ban nyissa meg az Új terminál terminált > egy új Integrált Visual Studio Code-terminál megnyitásához.

  2. Jelentkezzen be a Dockerbe az alábbi paranccsal az integrált terminálon.

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

    Használja a tárolóregisztrációs adatbázisból kimásolt bejelentkezési kiszolgálót és felhasználónevet.

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

  3. Amikor a rendszer kéri a jelszót, adja meg a jelszót. A bejelentkezési kiszolgáló, a felhasználónév és a jelszó értékeit az Azure Portal tárolóregisztrációs adatbázisának hozzáférési kulcsaiból is lekérheti.

  4. Miután megadta a hitelesítő adatokat, leküldheti a modul rendszerképét az Azure-tárolóregisztrációs adatbázisba. A VS Code Explorerben kattintson a jobb gombbal a module.json fájlra, és válassza az IoT Edge-megoldás összeállítása és leküldése lehetőséget.

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

    Amikor azt mondja a Visual Studio Code-nak, hogy hozza létre a megoldást, az két parancsot futtat az integrált terminálban: a Docker buildelése és a Docker leküldése. 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.

    A rendszer kérni fogja, hogy válassza ki a modulplatformot. Válassza ki a Linuxnak megfelelő amd64-et .

    Platform kiválasztása

    Fontos

    Csak a Linux-modulok támogatottak.

    A következő figyelmeztetés jelenhet meg, amelyet figyelmen kívül hagyhat:

    Program.cs(77,44): CS1998 figyelmeztetés: Ez az aszinkron metódus nem rendelkezik "várakozási" operátorokkal, és szinkron módon fog futni. Fontolja meg a várakozási operátor használatát a nem blokkoló API-hívásokra való várakozáshoz, vagy a "await Task.Run(...)" függvényt a processzorhoz kötött munka elvégzéséhez egy háttérszálon.

  5. A VS Code integrált termináljában láthatja a teljes tárolórendszerképet címkével együtt. A képcím a module.json fájlban lévő, formátummal <repository>:<version>-<platform>ellátott információkból épül fel. Ebben a cikkben a következőképpen kell kinéznie mycontreg2.azurecr.io/filecopymodule:0.0.1-amd64: .

Következő lépések

A modul Azure Stack Edge Pro FPGA-n való üzembe helyezéséhez és futtatásához tekintse meg a modul hozzáadása című témakör lépéseit.