Aracılığıyla paylaş


Azure Stack Edge Pro'da dosyaları taşımak için C# IoT Edge modülü geliştirme

ŞUNLAR IÇIN GEÇERLIDIR:Pro GPU SKU için Evet Azure Stack Edge Pro - GPUPro 2 SKU için EvetAzure Stack Edge Pro 2Pro R SKU için EvetAzure Stack Edge Pro RMini R SKU için EvetAzure Stack Edge Mini R

Bu makalede, Azure Stack Edge Pro cihazınızla dağıtım için ioT Edge modülü oluşturma adımları gösterilmektedir. Azure Stack Edge Pro, verileri işlemenize ve ağ üzerinden Azure'a göndermenize olanak tanıyan bir depolama çözümüdür.

Verileri Azure'a taşınırken dönüştürmek için Azure Stack Edge Pro'nuzla Azure IoT Edge modüllerini kullanabilirsiniz. Bu makalede kullanılan modül, Azure Stack Edge Pro cihazınızdaki bir yerel paylaşımdan bulut paylaşımına dosya kopyalama mantığını uygular.

Bu makalede şunları öğreneceksiniz:

  • Modüllerinizi depolamak ve yönetmek için bir kapsayıcı kayıt defteri oluşturun (Docker görüntüleri).
  • Azure Stack Edge Pro cihazınızda dağıtmak için bir IoT Edge modülü oluşturun.

IoT Edge modülü hakkında

Azure Stack Edge Pro cihazınız IoT Edge modüllerini dağıtabilir ve çalıştırabilir. Edge modülleri temelde bir cihazdan ileti alma, iletiyi dönüştürme veya IoT Hub'a ileti gönderme gibi belirli bir görevi gerçekleştiren Docker kapsayıcılarıdır. Bu makalede, dosyaları yerel bir paylaşımdan Azure Stack Edge Pro cihazınızdaki bir bulut paylaşımına kopyalayan bir modül oluşturacaksınız.

  1. Dosyalar Azure Stack Edge Pro cihazınızdaki yerel paylaşıma yazılır.
  2. Dosya olay oluşturucu, yerel paylaşıma yazılan her dosya için bir dosya olayı oluşturur. Dosya olayları, bir dosya değiştirildiğinde de oluşturulur. Ardından dosya olayları IoT Edge Hub'ına (IoT Edge çalışma zamanında) gönderilir.
  3. IoT Edge özel modülü, dosya için göreli bir yol da içeren bir dosya olay nesnesi oluşturmak için dosya olayını işler. Modül, göreli dosya yolunu kullanarak mutlak bir yol oluşturur ve dosyayı yerel paylaşımdan bulut paylaşımına kopyalar. Modül daha sonra dosyayı yerel paylaşımdan siler.

Azure IoT Edge modülü Azure Stack Edge Pro'da nasıl çalışır?

Dosya bulut paylaşımına eklendikten sonra otomatik olarak Azure Depolama hesabınıza yüklenir.

Önkoşullar

Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:

Kapsayıcı kayıt defteri oluşturma

Azure kapsayıcı kayıt defteri, Azure’da özel Docker kapsayıcısı görüntülerinizi depolayıp yönetebileceğiniz özel bir Docker kayıt defteridir. Bulutta kullanılabilen iki popüler Docker kayıt defteri hizmeti Azure Container Registry ve Docker Hub'dır. Bu makalede Container Registry kullanılır.

  1. Bir tarayıcıdan Azure portalına giriş yapın.

  2. Kaynak > Kapsayıcıları > Kapsayıcı Kayıt Defteri oluştur'u seçin. Oluştur’a tıklayın.

  3. Sağlamak:

    1. Azure'da 5 ile 50 arası alfasayısal karakter içeren benzersiz bir Kayıt Defteri adı .

    2. Abonelik seçin.

    3. Yeni oluşturun veya var olan bir Kaynak grubunu seçin.

    4. Bir Konum seçin. Bu konumun Azure Stack Edge kaynağıyla ilişkili konumla aynı olmasını öneririz.

    5. Yönetici kullanıcı ayarını Etkinleştir'e getirin.

    6. SKU'yu Temel olarak ayarlayın.

      Kapsayıcı kayıt defteri oluşturma

  4. Oluştur'u belirleyin.

  5. Kapsayıcı kayıt defteriniz oluşturulduktan sonra, bu kayıt defterine gidin ve Erişim anahtarları'nı seçin.

    Erişim anahtarlarını alma

  6. Oturum açma sunucusu, Kullanıcı adı ve Parola değerlerini kopyalayın. Bu değerleri daha sonra Docker görüntüsünü kayıt defterinizde yayımlamak ve kayıt defteri kimlik bilgilerini Azure IoT Edge çalışma zamanına eklemek için kullanırsınız.

IoT Edge modülü projesi oluşturma

Aşağıdaki adımlar .NET Core 2.1 SDK'sını temel alan bir IoT Edge modülü projesi oluşturur. Projede Visual Studio Code ve Azure IoT Edge uzantısı kullanılır.

Yeni çözüm oluşturma

Kendi yazacağınız kodla özelleştirebileceğiniz bir C# çözüm şablonu oluşturun.

  1. Visual Studio Code'da Komut Paletini Görüntüle'yi > seçerek VS Code komut paletini açın.

  2. Komut paletinde Azure: Sign in komutunu girip çalıştırdıktan sonra yönergeleri izleyerek Azure hesabınızda oturum açın. Oturumu önceden açtıysanız bu adımı atlayabilirsiniz.

  3. Komut paletinde Azure IoT Edge: New IoT Edge solution komutunu girin ve çalıştırın. Komut paletinde çözümünüzü oluşturmak için aşağıdaki bilgileri girin:

    1. Çözümü oluşturmak istediğiniz klasörü seçin.

    2. Çözümünüz için bir ad girin veya varsayılan EdgeSolution adını kabul edin.

      Yeni çözüm oluşturma 1

    3. Modül şablonu olarak C# Module girişini seçin.

    4. Varsayılan modül adını atamak istediğiniz adla değiştirin; bu örnekte FileCopyModule adıdır.

      Yeni çözüm oluşturma 2

    5. Önceki bölümde oluşturduğunuz kapsayıcı kayıt defterini ilk modülünüz için görüntü deposu olarak belirtin. localhost:5000 yerine kopyaladığınız oturum açma sunucusu değerini yazın.

      Son dize gibi <Login server name>/<Module name>görünür. Bu örnekte dize şöyledir: mycontreg2.azurecr.io/filecopymodule.

      Yeni çözüm oluşturma 3

  4. Dosya > Klasör Aç'a gidin.

    Yeni çözüm oluşturma 4

  5. Daha önce oluşturduğunuz EdgeSolution klasörüne göz atın ve üzerine gelin. VS Code penceresi, IoT Edge çözüm çalışma alanınızı beş üst düzey bileşeniyle yükler. Bu makalede klasörü, .gitignore dosyasını, .env dosyasını ve deployment.template.json** düzenlemezsiniz.vscode.

    Değiştirdiğiniz tek bileşen modules klasörüdür. Bu klasörde modülünüzün C# kodu ve modülünüzü kapsayıcı görüntüsü olarak derlemek için Docker dosyaları bulunur.

    Yeni çözüm oluşturma 5

Modülü özel kodla güncelleştirme

  1. VS Code gezgininde FileCopyModule > Program.cs modüllerini > açın.

  2. FileCopyModule ad alanının en üstüne, daha sonra kullanılan türler için aşağıdaki using deyimlerini ekleyin. Microsoft.Azure.Devices.Client.Transport.Mqtt , IoT Edge Hub'a ileti göndermek için kullanılan bir protokoldür.

    namespace FileCopyModule
    {
        using Microsoft.Azure.Devices.Client.Transport.Mqtt;
        using Newtonsoft.Json;
    
  3. InputFolderPath ve OutputFolderPath değişkenini Program sınıfına ekleyin.

    class Program
        {
            static int counter;
            private const string InputFolderPath = "/home/input";
            private const string OutputFolderPath = "/home/output";
    
  4. Önceki adımdan hemen sonra, ileti gövdesini tanımlamak için FileEvent sınıfını ekleyin.

    /// <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. Init yöntemindeki kod, bir ModuleClient nesnesi oluşturur ve yapılandırır. Bu nesne, modülün ileti göndermek ve almak için MQTT protokolünü kullanarak yerel Azure IoT Edge çalışma zamanına bağlanmasını sağlar. Init yönteminde kullanılan bağlantı dizesi, modüle IoT Edge çalışma zamanı tarafından sağlanır. Kod, bir IoT Edge hub'ından input1 uç noktası aracılığıyla ileti almak için bir FileCopy geri çağırması kaydeder. Init yöntemini aşağıdaki kodla değiştirin.

    /// <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. PipeMessage yönteminin kodunu kaldırın ve yerine FileCopy kodunu ekleyin.

        /// <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. Bu dosyayı kaydedin.

  8. Bu proje için var olan bir kod örneğini de indirebilirsiniz. Daha sonra kaydettiğiniz dosyayı bu örnekteki program.cs dosyasına göre doğrulayabilirsiniz.

IoT Edge çözümünüzü derleyin

Önceki bölümde bir IoT Edge çözümü oluşturdunuz ve dosyaları yerel paylaşımdan bulut paylaşımına kopyalamak için FileCopyModule dosyasına kod eklediniz. Şimdi çözümü kapsayıcı görüntüsü olarak derlemeniz ve kapsayıcı kayıt defterine göndermeniz gerekiyor.

  1. VSCode'da Yeni Terminal'e > giderek yeni bir Visual Studio Code tümleşik terminali açın.

  2. Tümleşik terminale aşağıdaki komutu girerek Docker'da oturum açın.

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

    Kapsayıcı kayıt defterinizden kopyaladığınız oturum açma sunucusunu ve kullanıcı adını kullanın.

    IoT Edge çözümü oluşturma ve gönderme

  3. Parola istendiğinde, parolayı girin. Azure portalındaki kapsayıcı kayıt defterinizdeki Erişim Anahtarları'ndan oturum açma sunucusu, kullanıcı adı ve parola değerlerini de alabilirsiniz.

  4. Kimlik bilgileri sağlandıktan sonra modül görüntünüzü Azure kapsayıcı kayıt defterinize gönderebilirsiniz. VS Code Gezgini'nde module.json dosyasına sağ tıklayın ve IoT Edge çözümü oluştur ve gönder'i seçin.

    IoT Edge çözümünü derleme ve gönderme 2

    Visual Studio Code'a çözümünüzü derlemesini söyleyince tümleşik terminalde iki komut çalıştırır: docker build ve docker push. Bu iki komut kodunuzu derler, CSharpModule.dll ile kapsayıcı oluşturur ve ardından kodu, çözümü başlatırken belirttiğiniz kapsayıcı kayıt defterine gönderir.

    Modül platformunu seçmeniz istenir. Linux'a karşılık gelen amd64'i seçin.

    Platform seçin

    Önemli

    Yalnızca Linux modülleri desteklenir.

    Yoksayabileceğiniz aşağıdaki uyarıyı görebilirsiniz:

    Program.cs(77,44): uyarı CS1998: Bu zaman uyumsuz yöntemde 'await' işleçleri yok ve zaman uyumlu olarak çalıştırılır. Engelleyici olmayan API çağrılarını beklemek için 'await' işlecini veya arka plan iş parçacığında CPU'ya bağlı iş yapmak için 'await Task.Run(...)' kullanmayı göz önünde bulundurun.

  5. VS Code tümleşik terminalinde etiketle tam kapsayıcı görüntü adresini görebilirsiniz. Görüntü adresi, module.json dosyasındaki biçimindeki <repository>:<version>-<platform>bilgilerden oluşturulur. Bu makale için gibi mycontreg2.azurecr.io/filecopymodule:0.0.1-amd64görünmelidir.

Sonraki adımlar

Bu modülü Azure Stack Edge Pro'da dağıtmak ve çalıştırmak için Modül ekleme sayfasındaki adımlara bakın.