Mengembangkan modul C# IoT Edge untuk memindahkan file dengan Azure Stack Edge Pro

BERLAKU UNTUK:Ya untuk Pro GPU SKUAzure Stack Edge Pro - GPUYa untuk Pro 2 SKUAzure Stack Edge Pro 2Ya untuk Pro R SKUAzure Stack Edge Pro RYa untuk Mini R SKUAzure Stack Edge Mini R

Artikel ini memandu Anda membuat modul IoT Edge untuk penyebaran dengan perangkat Azure Stack Edge Pro Anda. Azure Stack Edge Pro adalah solusi penyimpanan yang memungkinkan Anda memproses data dan mengirimkannya melalui jaringan ke Azure.

Anda dapat menggunakan modul Azure IoT Edge dengan Azure Stack Edge Pro Anda untuk mengubah data saat dipindahkan ke Azure. Modul yang digunakan dalam artikel ini mengimplementasikan logika untuk menyalin file dari berbagi lokal ke berbagi cloud di perangkat Azure Stack Edge Pro Anda.

Dalam artikel ini, Anda akan mempelajari cara:

  • Membuat registri kontainer untuk menyimpan dan mengelola modul Anda (Gambar Docker).
  • Membuat modul IoT Edge untuk disebarkan di perangkat Azure Stack Edge Pro Anda.

Tentang modul IoT Edge

Perangkat Azure Stack Edge Pro Anda dapat menyebarkan dan menjalankan modul IoT Edge. Modul Azure Stack Edge pada dasarnya adalah kontainer Docker yang melakukan tugas tertentu, seperti menyerap pesan dari perangkat, mengubah pesan, atau mengirim pesan ke IoT Hub. Dalam artikel ini, Anda akan membuat modul yang menyalin file dari berbagi lokal ke berbagi cloud di perangkat Azure Stack Edge Pro Anda.

  1. File ditulis ke berbagi lokal di perangkat Azure Stack Edge Pro Anda.
  2. Generator kejadian file membuat kejadian file untuk setiap file yang ditulis ke berbagi lokal. Kejadian file juga dihasilkan ketika file dimodifikasi. Kejadian file kemudian dikirim ke IoT Edge Hub (dalam runtime IoT Edge).
  3. Modul kustom IoT Edge memproses kejadian file untuk membuat objek kejadian file yang juga berisi jalur relatif untuk file. Modul menghasilkan jalur absolut menggunakan jalur file relatif dan menyalin file dari berbagi lokal ke berbagi cloud. Modul kemudian menghapus file dari berbagi lokal.

Cara kerja modul Azure IoT Edge pada Azure Stack Edge Pro

Setelah file berada di berbagi cloud, file secara otomatis diunggah ke akun Azure Storage Anda.

Prasyarat

Sebelum mulai, pastikan bahwa Anda memiliki:

Membuat registri kontainer

Registri kontainer Azure adalah registri Docker privat di Azure di mana Anda dapat menyimpan dan mengelola gambar kontainer Docker privat. Dua layanan registri Docker populer yang tersedia di cloud adalah Azure Container Registry dan Docker Hub. Artikel ini menggunakan Container Registry.

  1. Dari browser, masukkan ke portal Azure.

  2. Pilih Buat Sumber Daya > Container > Container Registry. Klik Buat.

  3. Berikan:

    1. Nama Registri unik dalam Azure yang berisi 5 hingga 50 karakter alfanumerik.

    2. Pilih langganan .

    3. Buat baru atau pilih Grup sumber daya yang sudah ada.

    4. Pilih Lokasi. Kami menyarankan agar lokasi ini sama dengan yang terkait dengan sumber daya Azure Stack Edge.

    5. Hidupkan/matikan Pengguna admin untuk Aktifkan.

    6. Atur SKU ke Dasar.

      Buat registri kontainer

  4. Pilih Buat.

  5. Setelah registri kontainer Anda dibuat, telusuri, dan pilih Kunci akses.

    Mendapatkan Kunci akses

  6. Salin nilai untuk Server masuk, Nama pengguna, dan Kata sandi. Anda menggunakan nilai ini nanti untuk menerbitkan gambar Docker ke registri Anda dan untuk menambahkan informasi masuk registri ke runtime Azure IoT Edge.

Membuat proyek modul IoT Edge

Langkah-langkah berikut membuat proyek modul IoT Edge berdasarkan .NET Core 2.1 SDK. Proyek ini menggunakan Visual Studio Code dan ekstensi Azure IoT Edge.

Membuat solusi baru

Membuat templat solusi C# yang dapat Anda kustomisasi dengan kode Anda sendiri.

  1. Di Visual Studio Code, pilih Tampilkan > Palet Perintah untuk membuka palet perintah Visual Studio Code.

  2. Di palet perintah, masukkan dan jalankan perintah Azure: Masuk dan ikuti instruksi untuk masuk ke akun Azure Anda. Jika sudah masuk, Anda dapat melewati langkah ini.

  3. Di palet perintah, masukkan dan jalankan perintah Azure IoT Edge: Solusi Azure IoT Edge baru. Di palet perintah, berikan informasi berikut untuk membuat solusi Anda:

    1. Pilih folder tempat Anda ingin membuat solusi.

    2. Berikan nama untuk solusi Anda atau terima EdgeSolution default.

      Membuat solusi baru 1

    3. Pilih Modul C# sebagai templat modul.

    4. Ganti nama modul default dengan nama yang ingin Anda tetapkan, dalam kasus ini, itu adalah FileCopyModule.

      Membuat solusi baru 2

    5. Tentukan registri kontainer yang Anda buat di bagian sebelumnya sebagai repositori gambar untuk modul pertama Anda. Ganti localhost:5000 dengan nilai server masuk yang Anda salin.

      String akhir terlihat seperti <Login server name>/<Module name>. Dalam contoh ini, string adalah: mycontreg2.azurecr.io/filecopymodule.

      Membuat solusi baru 3

  4. Buka File > Buka Folder.

    Membuat solusi baru 4

  5. Telusuri dan arahkan ke folder EdgeSolution yang Anda buat sebelumnya. Jendela VS Code memuat ruang kerja solusi Azure IoT Edge Anda dengan lima komponen tingkat atasnya. Anda tidak akan mengedit folder .vscode, file .gitignore, file .env, dan deployment.template.json** di artikel ini.

    Satu-satunya komponen yang Anda ubah adalah folder modul. Folder ini memiliki kode C# untuk modul Anda dan file Docker untuk membangun modul Anda sebagai gambar kontainer.

    Membuat solusi baru 5

Memperbarui modul dengan kode kustom

  1. Di penjelajah Visual Studio Code, buka modul > FileCopyModule Program.cs.>

  2. Di bagian atas namespace FileCopyModule, tambahkan pernyataan penggunaan berikut ini untuk jenis yang digunakan nanti. Microsoft.Azure.Devices.Client.Transport.Mqtt adalah protokol untuk mengirim pesan ke IoT Edge Hub.

    namespace FileCopyModule
    {
        using Microsoft.Azure.Devices.Client.Transport.Mqtt;
        using Newtonsoft.Json;
    
  3. Tambahkan variabel InputFolderPath dan OutputFolderPath ke kelas Program.

    class Program
        {
            static int counter;
            private const string InputFolderPath = "/home/input";
            private const string OutputFolderPath = "/home/output";
    
  4. Segera setelah langkah sebelumnya, tambahkan kelas FileEvent untuk menentukan isi pesan.

    /// <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. Dalam metode Init, kode membuat dan mengonfigurasi objek ModuleClient. Objek ini memungkinkan modul untuk tersambung ke runtime Azure IoT Edge lokal menggunakan protokol MQTT untuk mengirim dan menerima pesan. String koneksi yang digunakan dalam metode Init diberikan ke modul oleh runtime IoT Edge. Kode mendaftarkan panggilan balik FileCopy untuk menerima pesan dari hub IoT Edge melalui titik akhir input1. Ganti metode Init dengan kode berikut.

    /// <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. Hapus kode untuk metode PipeMessage dan di tempatnya, masukkan kode untuk 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. Simpan file ini.

  8. Anda juga dapat mengunduh sampel kode yang ada untuk proyek ini. Anda kemudian dapat memvalidasi file yang Anda simpan terhadap file program.cs dalam sampel ini.

Membangun solusi IoT Edge Anda

Di bagian sebelumnya, Anda membuat solusi IoT Edge dan menambahkan kode ke FileCopyModule untuk menyalin file dari berbagi lokal ke berbagi cloud. Sekarang Anda perlu membangun solusi sebagai gambar kontainer dan mendorongnya ke registri kontainer Anda.

  1. Di VSCode, buka Terminal Baru Terminal > untuk membuka terminal terintegrasi Visual Studio Code baru.

  2. Masuk ke Docker dengan memasukkan perintah berikut di terminal terintegrasi.

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

    Gunakan server masuk dan nama pengguna yang Anda salin dari registri kontainer Anda.

    Membangun dan mendorong solusi Azure IoT Edge

  3. Ketika dimintai kata sandi, berikan kata sandi. Anda juga dapat mengambil nilai untuk server masuk, nama pengguna, dan kata sandi dari Kunci Akses di registri kontainer Anda di portal Microsoft Azure.

  4. Setelah informasi masuk diberikan, Anda dapat mendorong gambar modul ke registri kontainer Azure Anda. Di Visual Studio Code Explorer, klik kanan file module.json dan pilih Membangun dan Mendorong solusi IoT Edge.

    Membangun dan mendorong solusi IoT Edge 2

    Saat Anda memberi tahu Visual Studio Code untuk membangun solusi Anda, ia menjalankan dua perintah di terminal terintegrasi: docker build dan docker push. Kedua perintah ini membangun kode Anda, memasukkan CSharpModule.dll ke kontainer, dan kemudian mendorong kode ke registri kontainer yang Anda tentukan ketika Anda menginisialisasi solusi.

    Anda akan diminta untuk memilih platform modul. Pilih amd64 yang sesuai dengan Linux.

    Memilih platform

    Penting

    Hanya modul Linux yang didukung.

    Anda mungkin melihat peringatan berikut yang dapat Anda abaikan:

    Program.cs(77.44): peringatan CS1998: Metode asinkron ini tidak memiliki operator 'menunggu' dan akan berjalan secara sinkron. Pertimbangkan untuk menggunakan operator 'tunggu' untuk menunggu panggilan API non-pemblokiran, atau 'tunggu Task.Run(...)' untuk melakukan pekerjaan terikat CPU pada utas latar belakang.

  5. Anda dapat melihat alamat gambar kontainer lengkap dengan tag di terminal terintegrasi Visual Studio Code. Alamat gambar dibangun dari informasi yang ada di file module.json dengan format <repository>:<version>-<platform>. Untuk artikel ini, seharusnya terlihat seperti mycontreg2.azurecr.io/filecopymodule:0.0.1-amd64.

Langkah berikutnya

Untuk menyebarkan dan menjalankan modul ini di Azure Stack Edge Pro, lihat langkah-langkah dalam Menambahkan modul.