Aracılığıyla paylaş


Öğretici: Özel IoT Edge modülleri oluşturma ve dağıtma

Şunlar için geçerlidir: evet simgesi IoT Edge 1.1

Önemli

IoT Edge 1.1 destek sonu tarihi 13 Aralık 2022'ydi. Bu ürünün, hizmetin, teknolojinin veya API’nin nasıl desteklendiği hakkında bilgi edinmek için Microsoft Ürün Yaşam Döngüsü’ne göz atın. IoT Edge'in en son sürümüne güncelleştirme hakkında daha fazla bilgi için bkz . IoT Edge'i güncelleştirme.

Bu makalede aşağı akış IoT cihazlarından ileti alan, verileri makine öğrenmesi modeliniz üzerinden çalıştıran ve ardından içgörüleri IoT Hub'a ileten üç IoT Edge modülü oluşturacağız.

IoT Edge hub'ı modülden modüle iletişimi kolaylaştırır. IoT Edge hub'ını ileti aracısı olarak kullanmak modülleri birbirinden bağımsız tutar. Modüllerin yalnızca iletileri kabul ettikleri girişleri ve iletileri yazdıkları çıkışları belirtmesi gerekir.

IoT Edge cihazının bizim için dört şey gerçekleştirmesini istiyoruz:

  • Aşağı akış cihazlarından veri alma.
  • Verileri gönderen cihaz için kalan yararlı ömrü (RUL) tahmin edin.
  • IoT Hub'a cihaz için RUL ile bir ileti gönderin. Bu işlev yalnızca RUL belirtilen düzeyin altına düştüğünde veri gönderecek şekilde değiştirilebilir.
  • Aşağı akış cihaz verilerini IoT Edge cihazındaki yerel bir dosyaya kaydedin. Bu veri dosyası, makine öğrenmesi modelinin eğitimini iyileştirmek için düzenli aralıklarla IoT Hub'a yüklenir. Sabit ileti akışı yerine dosya yükleme kullanmak daha uygun maliyetlidir.

Bu görevleri gerçekleştirmek için üç özel modül kullanırız:

  • RUL Sınıflandırıcı: Azure Machine Learning modelini eğitme ve dağıtma bölümünde oluşturduğumuz turboFanRulClassifier modülü, "amlInput" adlı girişi ve "amlOutput" adlı bir çıkışı kullanıma sunan standart bir makine öğrenmesi modülüdür. "amlInput", girişinin ACI tabanlı web hizmetine gönderdiğimiz girişe tam olarak benzemesini bekler. Benzer şekilde, "amlOutput" da web hizmetiyle aynı verileri döndürür.

  • Avro yazıcısı: Bu modül"avroModuleInput" girişinde iletiler alır ve iletiyi Daha sonra IoT Hub'a yüklemek üzere Avro biçiminde diske kalıcı hale gelir.

  • Yönlendirici Modülü: Yönlendirici modülü, aşağı akış cihazlarından iletileri alır, ardından iletileri biçimlendirip sınıflandırıcıya gönderir. Modül daha sonra sınıflandırıcıdan iletileri alır ve iletiyi Avro yazıcı modülüne iletir. Son olarak modül, IoT Hub'a yalnızca RUL tahminini gönderir.

    • Giriş:

      • deviceInput: Aşağı akış cihazlarından ileti alır
      • rulInput: "amlOutput" öğesinden iletiler alır
    • Çıkış:

      • classify: "amlInput"a ileti gönderir
      • writeAvro: "avroModuleInput" iletisi gönderir
      • toIotHub: $upstream iletileri gönderir ve bu da iletileri bağlı IoT Hub'a geçirir

Aşağıdaki diyagramda tam çözüm için modüller, girişler, çıkışlar ve IoT Edge Hub yolları gösterilmektedir:

IoT Edge üç modül mimarisi diyagramı

Bu makaledeki adımlar genellikle bir bulut geliştiricisi tarafından gerçekleştirilir.

Öğreticinin bu bölümünde şunların nasıl yapılacağını öğreneceksiniz:

  • Özel koddan bir IoT Edge modülü oluşturun.
  • Özel modülünüzden bir Docker görüntüsü oluşturun.
  • IoT Hub yönlendirmesini özel modüllerinizi destekleyecek şekilde yeniden yapılandırın.
  • Özel modüllerinizi oluşturun, yayımlayın ve dağıtın.

Önkoşullar

Bu makale, IoT Edge'de Azure Machine Learning'i kullanma hakkında bir öğretici serisinin bir parçasıdır. Serideki her makale, önceki makaledeki çalışmaya göre derlemektedir. Bu makaleye doğrudan ulaştıysanız, serideki ilk makaleyi ziyaret edin.

Yeni bir IoT Edge çözümü oluşturma

İki Azure Notebooks'umuzun ikincisinin yürütülmesi sırasında RUL modelimizi içeren bir kapsayıcı görüntüsü oluşturup yayımladık. Azure Machine Learning, görüntü oluşturma işleminin bir parçası olarak, görüntünün azure IoT Edge modülü olarak dağıtılabilir olması için bu modeli paketledi.

Bu adımda, "Azure Machine Learning" modülünü kullanarak bir Azure IoT Edge çözümü oluşturacak ve modülü Azure Notebooks kullanarak yayımladığımız görüntüye işaret edeceğiz.

  1. Geliştirme VM'nizde bir uzak masaüstü oturumu açın.

  2. Visual Studio Code'da C:\source\IoTEdgeAndMlSample klasörünü açın.

  3. Gezgin panele (boş alanda) sağ tıklayın ve Yeni IoT Edge Çözümü'ne tıklayın.

    Yeni IoT Edge çözümü oluşturma

  4. EdgeSolution varsayılan çözüm adını kabul edin.

  5. Modül şablonu olarak Azure Machine Learning'i seçin.

  6. Modülü turbofanRulClassifier olarak adlandırın.

  7. Makine öğrenmesi çalışma alanınızı seçin. Bu çalışma alanı, Öğretici: Azure Machine Learning modelini eğitme ve dağıtma bölümünde oluşturduğunuz turboFanDemo çalışma alanıdır

  8. Azure Not Defteri'ni çalıştırırken oluşturduğunuz görüntüyü seçin.

  9. Çözüme bakın ve oluşturulan dosyalara dikkat edin:

    • deployment.template.json: Bu dosya, çözümdeki modüllerin her birinin tanımını içerir. Bu dosyada dikkate alınacak üç bölüm vardır:

      • Kayıt defteri kimlik bilgileri: Çözümünüzde kullandığınız özel kapsayıcı kayıt defterleri kümesini tanımlar. Şu anda, Azure Machine Learning görüntünüzün depolandığı makine öğrenmesi çalışma alanınızdaki kayıt defterini içermelidir. İstediğiniz sayıda kapsayıcı kayıt defterine sahip olabilirsiniz, ancak kolaylık olması için bu kayıt defterini tüm modüller için kullanacağız.

        "registryCredentials": {
          "<your registry>": {
            "username": "$CONTAINER_REGISTRY_USERNAME_<your registry>",
            "password": "$CONTAINER_REGISTRY_PASSWORD_<your registry>",
            "address": "<your registry>.azurecr.io"
          }
        }
        
      • Modüller: Bu bölüm, bu çözümle birlikte gelen kullanıcı tanımlı modül kümesini içerir. TurbofanRulClassifier modül tanımı kapsayıcı kayıt defterinizdeki görüntüyü gösterir. Çözüme daha fazla modül eklediğimizde, bunlar bu bölümde gösterilir.

        "modules": {
           "turbofanRulClassifier": {
             "version": "1.0",
             "type": "docker",
             "status": "running",
             "restartPolicy": "always",
             "settings": {
               "image": "turbofandemo2cd74296.azurecr.io/edgemlsample:1",
               "createOptions": {}
             }
           }
        }
        
      • Yollar: Bu öğreticide rotalarla oldukça fazla çalışacağız. Yollar, modüllerin birbirleriyle nasıl iletişim kurılacağını tanımlar. Şablon tarafından tanımlanan mevcut yol, ihtiyacımız olan yönlendirmeyle eşleşmiyor. turbofanRulClassifierToIoTHub Yolu silin.

        "$edgeHub": {
           "properties.desired": {
             "schemaVersion": "1.0",
             "routes": {
               "turbofanRulClassifierToIoTHub": "FROM /messages/modules/turbofanRulClassifier/outputs/* INTO $upstream"
             },
             "storeAndForwardConfiguration": {
               "timeToLiveSecs": 7200
             }
           }
        }
        
    • deployment.debug.template.json: Bu dosya, deployment.template.json hata ayıklama sürümüdür. Genellikle, bu dosyayı deployment.template.json dosyasının içeriğiyle eşitlenmiş olarak tutmalıyız, ancak bu öğretici için bunu yapmak gerekli değildir.

    • .env: Bu dosya, kayıt defterinize erişmek için kullanıcı adını ve parolayı sağlamanız gereken yerdir.

      CONTAINER_REGISTRY_USERNAME_<your registry name>=<ACR username>
      CONTAINER_REGISTRY_PASSWORD_<your registry name>=<ACR password>
      

      Not

      Bu öğreticide, geliştirme ve test senaryoları için uygun olan Azure Container Registry için yönetici oturum açma kimlik bilgileri kullanılır. Üretim senaryolarına hazır olduğunuzda, hizmet sorumluları gibi en az ayrıcalıklı bir kimlik doğrulama seçeneği öneririz. Daha fazla bilgi için bkz . Kapsayıcı kayıt defterinize erişimi yönetme.

  10. Visual Studio Code gezgininde deployment.template.json dosyasına sağ tıklayın ve IoT Edge Çözümü Derle'yi seçin.

  11. Bu komutun deployment.amd64.json dosyasıyla bir yapılandırma klasörü oluşturduğuna dikkat edin. Bu dosya, çözümün somut dağıtım şablonudur.

Yönlendirici modülü ekleme

Ardından Çözümümüze Yönlendirici modülünü ekleyeceğiz. Yönlendirici modülü, çözümümüz için çeşitli sorumlulukları işler:

  • Aşağı akış cihazlarından ileti alma: Aşağı akış cihazlarından IoT Edge cihazına iletiler geldikçe Yönlendirici modülü iletiyi alır ve iletinin yönlendirmesini düzenlemeye başlar.
  • RUL Sınıflandırıcı modülüne ileti gönderme: Aşağı akış cihazından yeni bir ileti alındığında, Yönlendirici modülü iletiyi RUL Sınıflandırıcısının beklediği biçime dönüştürür. Yönlendirici, RUL tahmini için iletiyi RUL Sınıflandırıcısına gönderir. Sınıflandırıcı bir tahminde bulunduktan sonra iletiyi Yönlendirici modülüne geri gönderir.
  • IoT Hub'a RUL iletileri gönderme: Yönlendirici sınıflandırıcıdan ileti aldığında, iletiyi yalnızca temel bilgileri, cihaz kimliğini ve RUL'yi içerecek şekilde dönüştürür ve kısaltılmış iletiyi IoT hub'ına gönderir. Burada yapmadığımız bir iyileştirme, ioT Hub'a yalnızca RUL tahmini eşiğin altına düştüğünde (örneğin, RUL 100 döngüden az olduğunda) ileti gönderir. Bu şekilde filtreleme, ileti hacmini azaltır ve IoT hub'ının maliyetini azaltır.
  • Avro Yazıcı modülüne ileti gönderme: Aşağı akış cihazı tarafından gönderilen tüm verileri korumak için Yönlendirici modülü sınıflandırıcıdan alınan iletinin tamamını Avro Yazıcı modülüne gönderir. Bu modül, IoT Hub dosya yüklemesini kullanarak verileri kalıcı hale getirmek ve karşıya yüklemek için kullanılır.

Yönlendirici modülü, iletilerin doğru sırada işlenmesini sağlayan çözümün önemli bir parçasıdır.

Modülü oluşturma ve dosyaları kopyalama

  1. Visual Studio Code'da modules klasörüne sağ tıklayın ve IoT Edge Modülü Ekle'yi seçin.

  2. Modül şablonu için C# modülünü seçin.

  3. Modülü turbofanRouter olarak adlandırın.

  4. Docker Görüntü Deponuz istendiğinde makine öğrenmesi çalışma alanından kayıt defterini kullanın (kayıt defterini deployment.template.json dosyanızın registryCredentials düğümünde bulabilirsiniz). Bu değer, registry.azurecr.io/turbofanrouter gibi <kayıt defterinin> tam adresidir.

    Not

    Bu makalede, Azure Machine Learning çalışma alanı tarafından oluşturulan Azure Container Registry'yi kullanacağız. Bu sadece kolaylık sağlamak için. Yeni bir kapsayıcı kayıt defteri oluşturup modüllerimizi orada yayımlayabilirdik.

  5. Komut istemi kabuğu kullanarak Terminal'de, örnek modüldeki dosyaları çözüme kopyalayın.

    copy c:\source\IoTEdgeAndMlSample\EdgeModules\modules\turbofanRouter\*.cs c:\source\IoTEdgeAndMlSample\EdgeSolution\modules\turbofanRouter\
    
  6. program.cs dosyasının üzerine yazma istemini kabul edin.

Yönlendirici modülü oluşturma

  1. Visual Studio Code'da Terminal>Varsayılan Derleme Görevini Yapılandır'ı seçin.

  2. Şablondan tasks.json dosyası oluştur'u seçin.

  3. .NET Core'ı seçin.

  4. tasks.json içeriğini aşağıdaki kodla değiştirin.

    {
      "version": "2.0.0",
      "tasks": [
        {
          "label": "build",
          "command": "dotnet",
          "type": "shell",
          "group": {
            "kind": "build",
            "isDefault": true
          },
          "args": [
            "build",
            "${workspaceFolder}/modules/turbofanRouter"
          ],
          "presentation": {
            "reveal": "always"
          },
          "problemMatcher": "$msCompile"
        }
      ]
    }
    
  5. tasks.json kaydedin ve kapatın.

  6. Derlemeyi ile veya Terminal>Çalıştırma Derleme Görevi ile Ctrl + Shift + B çalıştırın.

Modül yollarını ayarlama

Yukarıda belirtildiği gibi IoT Edge çalışma zamanı, gevşek bir şekilde bağlanmış modüller arasındaki iletişimi yönetmek için deployment.template.json dosyasında yapılandırılmış yolları kullanır. Bu bölümde, turbofanRouter modülü için yolların nasıl ayarlanacağına ilişkin ayrıntılı bilgi edineceğiz. Önce giriş yollarını ele alacağız ve ardından çıkışlara geçeceğiz.

Girişler

  1. Program.cs Init() yönteminde modül için iki geri çağırma kaydederiz:

    await ioTHubModuleClient.SetInputMessageHandlerAsync(EndpointNames.FromLeafDevice, LeafDeviceInputMessageHandler, ioTHubModuleClient);
    await ioTHubModuleClient.SetInputMessageHandlerAsync(EndpointNames.FromClassifier, ClassifierCallbackMessageHandler, ioTHubModuleClient);
    
  2. İlk geri arama, deviceInput havuzuna gönderilen iletileri dinler. Yukarıdaki diyagramda, herhangi bir aşağı akış cihazından gelen iletileri bu girişe yönlendirmek istediğimizi görüyoruz. deployment.template.json dosyasında, uç hub'ına IoT Edge modülü tarafından gönderilmeyen IoT Edge cihazı tarafından alınan iletileri turbofanRouter modülündeki "deviceInput" adlı girişe yönlendirmesini söyleyen bir yol ekleyin:

    "leafMessagesToRouter": "FROM /messages/* WHERE NOT IS_DEFINED($connectionModuleId) INTO BrokeredEndpoint(\"/modules/turbofanRouter/inputs/deviceInput\")"
    
  3. Ardından rulClassifier modülündeki iletiler için turbofanRouter modülüne bir yol ekleyin:

    "classifierToRouter": "FROM /messages/modules/turbofanRulClassifier/outputs/amloutput INTO BrokeredEndpoint(\"/modules/turbofanRouter/inputs/rulInput\")"
    

Çıkışlar

Yönlendirici modülünden çıkışları işlemek için $edgeHub yol parametresine dört ek yol ekleyin.

  1. Program.cs, yolu kullanarak RUL sınıflandırıcısına ileti göndermek için modül istemcisini kullanan SendMessageToClassifier() yöntemini tanımlar:

    "routerToClassifier": "FROM /messages/modules/turbofanRouter/outputs/classOutput INTO BrokeredEndpoint(\"/modules/turbofanRulClassifier/inputs/amlInput\")"
    
  2. SendRulMessageToIotHub() modül istemcisini kullanarak cihazın yalnızca RUL verilerini ioT Hub'a şu yolla gönderir:

    "routerToIoTHub": "FROM /messages/modules/turboFanRouter/outputs/hubOutput INTO $upstream"
    
  3. SendMessageToAvroWriter(), iletiyi avroFileWriter modülüne eklenen RUL verileriyle göndermek için modül istemcisini kullanır.

    "routerToAvro": "FROM /messages/modules/turbofanRouter/outputs/avroOutput INTO BrokeredEndpoint(\"/modules/avroFileWriter/inputs/avroModuleInput\")"
    
  4. HandleBadMessage(), ioT Hub'a daha sonra yönlendirilebilecekleri yukarı akışta başarısız iletiler gönderir.

    "deadLetter": "FROM /messages/modules/turboFanRouter/outputs/deadMessages INTO $upstream"
    

Tüm yollar birlikte alındığında "$edgeHub" düğümünüzün aşağıdaki JSON gibi görünmesi gerekir:

"$edgeHub": {
  "properties.desired": {
    "schemaVersion": "1.0",
    "routes": {
      "leafMessagesToRouter": "FROM /messages/* WHERE NOT IS_DEFINED($connectionModuleId) INTO BrokeredEndpoint(\"/modules/turbofanRouter/inputs/deviceInput\")",
      "classifierToRouter": "FROM /messages/modules/turbofanRulClassifier/outputs/amlOutput INTO BrokeredEndpoint(\"/modules/turbofanRouter/inputs/rulInput\")",
      "routerToClassifier": "FROM /messages/modules/turbofanRouter/outputs/classOutput INTO BrokeredEndpoint(\"/modules/turbofanRulClassifier/inputs/amlInput\")",
      "routerToIoTHub": "FROM /messages/modules/turboFanRouter/outputs/hubOutput INTO $upstream",
      "routerToAvro": "FROM /messages/modules/turbofanRouter/outputs/avroOutput INTO BrokeredEndpoint(\"/modules/avroFileWriter/inputs/avroModuleInput\")",
      "deadLetter": "FROM /messages/modules/turboFanRouter/outputs/deadMessages INTO $upstream"
    },
    "storeAndForwardConfiguration": {
      "timeToLiveSecs": 7200
    }
  }
}

Not

TurbofanRouter modülünü eklemek aşağıdaki ek yolu oluşturdu: turbofanRouterToIoTHub": "FROM /messages/modules/turbofanRouter/outputs/* INTO $upstream. Yalnızca deployment.template.json dosyanızda yukarıda listelenen yolları bırakarak bu yolu kaldırın.

Avro Yazıcı modülü ekleme

Avro Yazıcı modülünün çözümümüzde iletileri depolamak ve dosyaları karşıya yüklemek için iki sorumluluğu vardır.

  • İletileri depolama: Avro Yazıcı modülü bir ileti aldığında, iletiyi Avro biçiminde yerel dosya sistemine yazar. Bir dizini (bu örnekte /data/avrofiles) modülün kapsayıcısında bir yola bağlayan bağlama bağlaması kullanırız. Bu bağlama, modülün yerel bir yola (/avrofiles) yazmasına ve bu dosyalara doğrudan IoT Edge cihazından erişilebilir olmasını sağlar.

  • Dosyaları karşıya yükleme: Avro Yazıcı modülü, azure depolama hesabına dosya yüklemek için Azure IoT Hub dosya yükleme özelliğini kullanır. Bir dosya başarıyla karşıya yüklendikten sonra modül dosyayı diskten siler

Modül oluşturma ve dosyaları kopyalama

  1. Visual Studio Code'da Komut Paleti Görüntüle'yi>seçin ve ardından Python: Yorumlayıcı'yı arayın ve seçin.

  2. Yüklü Python sürüm 3.7 veya üzerini seçin.

  3. Visual Studio Code'da modules klasörüne sağ tıklayın ve IoT Edge Modülü Ekle'yi seçin.

  4. Python Modülü'nü seçin.

  5. Modülünü avroFileWriterolarak adlandırın.

  6. Docker Görüntü Deponuz istendiğinde, Yönlendirici modülünü eklerken kullandığınız kayıt defterinin aynısını kullanın.

  7. Örnek modüldeki dosyaları çözüme kopyalayın.

    copy C:\source\IoTEdgeAndMlSample\EdgeModules\modules\avroFileWriter\*.py C:\source\IoTEdgeAndMlSample\EdgeSolution\modules\avroFileWriter\
    
  8. main.py üzerine yazmayı kabul edin.

  9. Çözüme filemanager.py ve schema.py eklendiğine ve main.py güncelleştirildiğine dikkat edin.

Not

Bir Python dosyasını açtığınızda pylint yüklemeniz istenebilir. Bu öğreticiyi tamamlamak için linter'i yüklemeniz gerekmez.

Veri dosyaları için bağlama bağlama

Daha önce belirtildiği gibi, yazıcı modülü, cihazın dosya sistemine Avro dosyaları yazmak için bağlama bağlamasının bulunmasına dayanır.

Cihaza dizin ekleme

  1. Azure portalında, çalışmıyorsa IoT Edge cihaz VM'nizi başlatın. SSH kullanarak bağlanın. Bağlantı, Azure portalındaki VM'nin genel bakış sayfasından kopyalayabileceğiniz DNS adını gerektirir.

    ssh -l <user>@<vm name>.<region>.cloudapp.azure.com
    
  2. Oturum açtıktan sonra, kaydedilen aşağı akış cihaz iletilerini tutacak dizini oluşturun.

    sudo mkdir -p /data/avrofiles
    
  3. Dizin izinlerini kapsayıcı tarafından yazılabilir hale getirmek için güncelleştirin.

    sudo chmod ugo+rw /data/avrofiles
    
  4. Dizinin artık kullanıcı, grup ve sahip için yazma (w) iznine sahip olduğunu doğrulayın.

    ls -la /data
    

    Avrofiles için dizin izinleri

Modüle dizin ekleme

Dizini modülün kapsayıcısına eklemek için avroFileWriter modülüyle ilişkili Dockerfile'ları değiştireceğiz. Modülle ilişkilendirilmiş üç Dockerfile vardır: Dockerfile.amd64, Dockerfile.amd64.debug ve Dockerfile.arm32v7. Bir arm32 cihazına hata ayıklamak veya dağıtmak istememiz durumunda bu dosyalar eşitlenmiş olarak tutulmalıdır. Bu makale için yalnızca Dockerfile.amd64'e odaklanın.

  1. Geliştirme VM'nizde C:\source\IoTEdgeAndMlSample\EdgeSolution\modules\avoFileWriter\Dockerfile.amd64 dosyasını açın.

  2. Dosyayı aşağıdaki örneğe benzer şekilde değiştirin:

    FROM ubuntu:xenial
    
    WORKDIR /app
    
    RUN apt-get update && apt-get install -y --no-install-recommends libcurl4-openssl-dev
    python3-pip libboost-python1.58-dev libpython3-dev && rm -rf /var/lib/apt/lists/*
    
    RUN pip3 install --upgrade pip
    COPY requirements.txt ./
    RUN pip install -r requirements.txt
    
    COPY . .
    
    RUN useradd -ms /bin/bash moduleuser
    RUN mkdir /avrofiles && chown moduleuser /avrofiles
    USER moduleuser
    
    CMD [ "python3", "-u", "./main.py" ]
    

    mkdir ve chown komutları Docker derleme işlemine görüntüde /avrofiles adlı bir üst düzey dizin oluşturmasını ve ardından modülün bu dizinin sahibi olmasını sağlamasını ister. Modül kullanıcısı komutuyla useradd görüntüye eklendikten sonra ve bağlam modülkullanıcısına (USER moduleuser) geçmeden önce bu komutların eklenmesi önemlidir.

  3. Gerekirse Dockerfile.amd64.debug ve Dockerfile.arm32v7 için ilgili değişiklikleri yapın.

avroFileWriter'a bağlama yapılandırması ekleme

Bağlamayı oluşturmanın son adımı, deployment.template.json (ve deployment.debug.template.json) dosyalarını bağlama bilgileriyle güncelleştirmektir.

  1. deployment.template.json açın.

  2. Uç cihazdaki yerel dizine /avrofiles kapsayıcı dizinini işaret eden parametreyi ekleyerek Binds avroFileWriter modül tanımını değiştirin. Modül tanımınız şu örnekle eşleşmelidir:

    "avroFileWriter": {
      "version": "1.0",
      "type": "docker",
      "status": "running",
      "restartPolicy": "always",
      "settings": {
        "image": "${MODULES.avroFileWriter}",
        "createOptions": {
          "HostConfig": {
            "Binds": [
              "/data/avrofiles:/avrofiles"
            ]
          }
        }
      }
    }
    

config.yaml'ye erişim için bağlama bağlama

Yazıcı modülü için bir bağlama daha eklemeliyiz. Bu bağlama, modüle IoT Edge cihazındaki /etc/iotedge/config.yaml dosyasından bağlantı dizesi okuma erişimi verir. IoT hub'ına dosya yüklemek için upload_blob_async yöntemini çağırabilmemiz için ioTHubClient oluşturmak için bağlantı dizesi ihtiyacımız var. Bu bağlamayı ekleme adımları, önceki bölümdeki adımlara benzer.

Dizin iznini güncelleştirme

  1. SSH kullanarak IoT Edge cihazınıza bağlanın.

    ssh -l <user>@IoTEdge-<extension>.<region>.cloudapp.azure.com
    
  2. config.yaml dosyasına okuma izni ekleyin.

    sudo chmod +r /etc/iotedge/config.yaml
    
  3. İzinlerin doğru ayarlandığını doğrulayın.

    ls -la /etc/iotedge/
    
  4. config.yaml izinlerinin -r--r--r-- olduğundan emin olun.

Modüle dizin ekleme

  1. Geliştirme makinenizde Dockerfile.amd64 dosyasını açın.

  2. Aşağıdaki gibi görünmesi için dosyaya ek bir ve chown komutları kümesi mkdir ekleyin:

    FROM ubuntu:xenial
    
    WORKDIR /app
    
    RUN apt-get update && apt-get install -y --no-install-recommends libcurl4-openssl-dev
    python3-pip libboost-python1.58-dev libpython3-dev && rm -rf /var/lib/apt/lists/\*
    
    RUN pip3 install --upgrade pip
    COPY requirements.txt ./
    RUN pip install -r requirements.txt
    
    COPY . .
    
    RUN useradd -ms /bin/bash moduleuser
    RUN mkdir /avrofiles && chown moduleuser /avrofiles
    RUN mkdir -p /app/iotconfig && chown moduleuser /app/iotconfig
    
    USER moduleuser
    
    CMD "python3", "-u", "./main.py"]
    
  3. Dockerfile.amd64.debug ve Dockerfile.arm32v7 için ilgili değişiklikleri yapın.

Modül yapılandırmasını güncelleştirme

  1. deployment.template.json dosyasını açın.

  2. Kapsayıcı dizinini (/app/iotconfig) cihazdaki yerel dizine Binds (/etc/iotedge) işaret eden parametreye ikinci bir satır ekleyerek avroFileWriter modül tanımını değiştirin.

    "avroFileWriter": {
      "version": "1.0",
      "type": "docker",
      "status": "running",
      "restartPolicy": "always",
      "settings": {
        "image": "${MODULES.avroFileWriter}",
        "createOptions": {
          "HostConfig": {
            "Binds": [
              "/data/avrofiles:/avrofiles",
              "/etc/iotedge:/app/iotconfig"
            ]
          }
        }
      }
    }
    
  3. deployment.debug.template.json ilgili değişiklikleri yapın.

Bağımlılıkları yükleme

Yazıcı modülü fastavro ve PyYAML olmak üzere iki Python kitaplığına bağımlıdır. Geliştirme makinemize bağımlılıkları yüklemeli ve Docker derleme işlemine bunları modülümüzün görüntüsüne yüklemesini anlatmalıyız.

PyYAML

  1. Geliştirme makinenizde dosyasını açın ve dosyada C:\source\IoTEdgeAndMlSample\EdgeSolution\modules\avoFileWriter\requirements.txt yeni bir satıra "pyyaml" ekleyin.

    azure-iothub-device-client~=1.4.3
    pyyaml
    
  2. Dockerfile.amd64 dosyasını açın ve kurulum araçlarını yükseltmek için bir pip install komut ekleyin.

    FROM ubuntu:xenial
    
    WORKDIR /app
    
    RUN apt-get update && \
        apt-get install -y --no-install-recommends libcurl4-openssl-dev python3-pip libboost-python1.58-dev libpython3-dev && \
        rm -rf /var/lib/apt/lists/\*
    
    RUN pip3 install --upgrade pip
    RUN pip install -U pip setuptools
    COPY requirements.txt ./
    RUN pip install -r requirements.txt
    
    COPY . .
    
    RUN useradd -ms /bin/bash moduleuser
    RUN mkdir /avrofiles && chown moduleuser /avrofiles
    RUN mkdir -p /app/iotconfig && chown moduleuser /app/iotconfig
    USER moduleuser
    
    CMD [ "python3", "-u", "./main.py" ]
    
  3. Komut isteminde geliştirme makinenize pyyaml yükleyin.

    pip install pyyaml
    

Fastavro

  1. requirements.txt,pyyaml'nin arkasına fastavro ekleyin.

    azure-iothub-device-client~=1.4.3
    pyyaml
    fastavro
    
  2. Geliştirme makinenize fastavro yükleyin.

    pip install fastavro
    

IoT Hub'ı yeniden yapılandırma

IoT Edge cihazını ve modülleri sisteme tanıtarak hub'a hangi verilerin hangi amaçla gönderileceğine ilişkin beklentilerimizi değiştirdik. Yeni gerçekliğimizle başa çıkmak için merkezdeki yönlendirmeyi yeniden yapılandırmamız gerekiyor.

Not

Modülleri dağıtmadan önce hub'ı yeniden yapılandırdık çünkü özellikle dosya yükleme gibi bazı hub ayarlarının avroFileWriter modülünün doğru çalışması için doğru şekilde ayarlanması gerekiyor

IoT Hub'da RUL iletileri için yol ayarlama

Yönlendirici ve sınıflandırıcı hazır durumda olduğu için yalnızca cihaz kimliğini ve cihaz için RUL tahminini içeren düzenli iletiler almayı bekliyoruz. RUL verilerini cihazların durumunu izleyebildiğimiz, rapor oluşturabildiğimiz ve gerektiğinde uyarı oluşturabildiğimiz kendi depolama konumuna yönlendirmek istiyoruz. Aynı zamanda, ioT Edge cihazımıza henüz bağlı olmayan bir aşağı akış cihazı tarafından doğrudan gönderilmeye devam eden tüm cihaz verilerinin geçerli depolama konumuna yönlendirilmeye devam etmelerini istiyoruz.

RUL ileti yolu oluşturma

  1. Azure portalında IoT Hub’ınıza gidin.

  2. Sol bölmedeki menüden Hub ayarları'nın altında İleti yönlendirme'yi seçin.

  3. Yollar sekmesinde Ekle'yi seçin.

  4. Rotayı RulMessageRoute olarak adlandırın.

  5. Uç nokta seçicisinin sağındaki Uç nokta ekle'yi ve ardından Depolama'yı seçin.

  6. Depolama uç noktası ekle sayfasında uç noktayı ruldata olarak adlandırın.

  7. Kapsayıcı seçin'i seçin.

  8. Depolama hesapları sayfasında, bu öğretici boyunca kullandığınız ve iotedgeandml<benzersiz soneki> olarak adlandırılan depolama hesabını bulun.

  9. ruldata kapsayıcısını seçin ve Seç'e tıklayın.

  10. Depolama uç noktası ekle sayfasına dönüp Oluştur'u seçerek depolama uç noktasını oluşturun.

  11. Yönlendirme sorgusu için Rota ekle sayfasına dönün ve değerini aşağıdaki sorguyla değiştirintrue:

    IS_DEFINED($body.PredictedRul) AND NOT IS_DEFINED($body.OperationalSetting1)
    
  12. Test bölümünü ve ardından İleti gövdesi bölümünü genişletin. İleti gövdesini beklenen iletilerimizin şu örneğiyle değiştirin:

    {
      "ConnectionDeviceId": "aaLeafDevice_1",
      "CorrelationId": "b27e97bb-06c5-4553-a064-e9ad59c0fdd3",
      "PredictedRul": 132.62721409309165,
      "CycleTime": 64.0
    }
    
  13. Yolu test et'i seçin. Test başarılı olursa "İleti sorguyla eşleşmiş" iletisini görürsünüz.

  14. Kaydet'e tıklayın.

TurbofanDeviceDataToStorage yolunu güncelleştirme

Yeni tahmin verilerini eski depolama konumumuza yönlendirmek istemiyoruz, bu nedenle bunu önlemek için yolu güncelleştirin.

  1. IoT Hub İleti yönlendirme sayfasında Yollar sekmesini seçin.

  2. turbofanDeviceDataToStorage'ı veya ilk cihaz veri rotanıza vermiş olduğunuz adı seçin.

  3. Yönlendirme sorgusunu şu şekilde güncelleştirin:

    IS_DEFINED($body.OperationalSetting1)
    
  4. Test bölümünü ve ardından İleti gövdesi bölümünü genişletin. İletiyi, beklenen iletilerimizin şu örneğiyle değiştirin:

    {
      "Sensor13": 2387.96,
      "OperationalSetting1": -0.0008,
      "Sensor6": 21.61,
      "Sensor11": 47.2,
      "Sensor9": 9061.45,
      "Sensor4": 1397.86,
      "Sensor14": 8140.39,
      "Sensor18": 2388.0,
      "Sensor12": 522.87,
      "Sensor2": 642.42,
      "Sensor17": 391.0,
      "OperationalSetting3": 100.0,
      "Sensor1": 518.67,
      "OperationalSetting2": 0.0002,
      "Sensor20": 39.03,
      "DeviceId": 19.0,
      "Sensor5": 14.62,
      "PredictedRul": 212.00132402791962,
      "Sensor8": 2388.01,
      "Sensor16": 0.03,
      "CycleTime": 42.0,
      "Sensor21": 23.3188,
      "Sensor15": 8.3773,
      "Sensor3": 1580.09,
      "Sensor10": 1.3,
      "Sensor7": 554.57,
      "Sensor19": 100.0
    }
    
  5. Yolu test et'i seçin. Test başarılı olursa "İleti sorguyla eşleşmiş" iletisini görürsünüz.

  6. Kaydet'i seçin.

Karşıya dosya yüklemeyi yapılandırma

Dosya yazıcı modülünün dosyaları depolama alanına yüklemesini sağlamak için IoT Hub dosya yükleme özelliğini yapılandırın.

  1. IoT Hub'ınızın sol bölme menüsünden Hub ayarları'nın altında Dosya yükleme'yi seçin.

  2. Azure Depolama Kapsayıcısı'yı seçin.

  3. Listeden depolama hesabınızı seçin.

  4. Guid eklenmiş azureml-blobstore ile başlayan kapsayıcıyı seçin ve Seç'e tıklayın.

  5. Kaydet'i seçin. Kaydetme tamamlandığında portal size bildirir.

Not

Bu öğretici için karşıya yükleme bildirimini açmıyoruz, ancak dosya yükleme bildiriminin nasıl işleneceğinin ayrıntıları için bkz . Dosya karşıya yükleme bildirimi alma.

Modülleri oluşturma, yayımlama ve dağıtma

Yapılandırma değişikliklerini yaptığımıza göre, görüntüleri oluşturmaya ve Azure kapsayıcı kayıt defterimizde yayımlamaya hazırız. Derleme işlemi, hangi modüllerin oluşturulması gerektiğini belirlemek için deployment.template.json dosyasını kullanır. Sürüm dahil olmak üzere her modülün ayarları modül klasöründeki module.json dosyasında bulunur. Derleme işlemi ilk olarak bir görüntü oluşturmak için module.json dosyasında bulunan geçerli yapılandırmayla eşleşen Dockerfiles üzerinde bir Docker derlemesi çalıştırır. Ardından görüntüyü module.json dosyasındakiyle eşleşen bir sürüm etiketiyle module.json dosyasından kayıt defterinde yayımlar. Son olarak, IoT Edge cihazına dağıtacağımız yapılandırmaya özgü bir dağıtım bildirimi (örneğin, deployment.amd64.json) oluşturur. IoT Edge cihazı dağıtım bildirimindeki bilgileri okur ve yönergelere göre modülleri indirir, yolları yapılandırır ve istenen özellikleri ayarlar. Bu dağıtım yönteminin bilmeniz gereken iki yan etkisi vardır:

  • Dağıtım gecikmesi: IoT Edge çalışma zamanının yeniden yapılandırılmaya başlamadan önce istenen özelliklere yapılan değişikliği tanıması gerektiğinden, modüllerinizi dağıtmanızın ardından çalışma zamanı bunları alıp IoT Edge cihazını güncelleştirmeye başlayana kadar biraz zaman alabilir.

  • Modül sürümleri önemlidir: Bir modülün kapsayıcısının yeni bir sürümünü önceki modülle aynı sürüm etiketlerini kullanarak kapsayıcı kayıt defterinizde yayımlarsanız, çalışma zamanı modülün yeni sürümünü indirmez. Yerel görüntünün sürüm etiketinin ve dağıtım bildiriminden istenen görüntünün karşılaştırmasını yapar. Bu sürümler eşleşirse, çalışma zamanı hiçbir işlem gerçekleştirmez. Bu nedenle, her yeni değişiklik dağıtmak istediğinizde modülünüzün sürümünü artırmanız önemlidir. Değiştirdiğiniz modülün module.json dosyasındaki etiket özelliğinin altındaki version özelliğini değiştirerek sürümü artırın. Ardından modülü derleyin ve yayımlayın.

    {
      "$schema-version": "0.0.1",
      "description": "",
      "image": {
        "repository": "<your registry>.azurecr.io/avrofilewriter",
        "tag": {
          "version": "0.0.1",
          "platforms": {
            "amd64": "./Dockerfile.amd64",
            "amd64.debug": "./Dockerfile.amd64.debug",
            "arm32v7": "./Dockerfile.arm32v7"
          }
        },
        "buildOptions": []
      },
      "language": "python"
    }
    

Derleme ve yayımlama

  1. Geliştirme VM'nizde çalışmıyorsa Docker'ı başlatın.

  2. Visual Studio Code'da komut istemiyle yeni bir terminal başlatın ve Azure kapsayıcı kayıt defterinizde (ACR) oturum açın.

Gerekli kullanıcı adı, parola ve oturum açma sunucusu değerlerini Azure portalında bulabilirsiniz. Kapsayıcı kayıt defteri adı "turbofandemo<unique id>" biçimindedir. Sol bölme menüsündeki Ayarlar'ın altında Erişim tuşları'nı seçerek bunları görüntüleyin.

docker login -u <ACR username> -p <ACR password> <ACR login server>
  1. Visual Studio Code'da deployment.template.json sağ tıklayın ve IoT Edge Çözümü Oluştur ve Gönder'i seçin.

Modülleri kayıt defterinde görüntüleme

Derleme başarıyla tamamlandıktan sonra azure portalını kullanarak yayımlanan modüllerimizi gözden geçirebileceğiz.

  1. Bu öğretici için Azure Container Registry'yi açın. Kapsayıcı kayıt defteri adı "turbofandemo<unique id>" biçimindedir.

  2. Sol bölme menüsündeki Hizmetler'in altında Depolar'ı seçin.

  3. Oluşturduğunuz her iki modülün de ( avrofilewriter ve turbofanrouter) depo olarak göründüğünü unutmayın.

  4. Turbofanrouter'ı seçin ve 0.0.1-amd64 olarak etiketlenmiş bir görüntü yayımladığınıza dikkat edin.

    Turbofanrouter'ın ilk etiketli sürümünü görüntüleme

IoT Edge cihazına modül dağıtma

Çözümümüzdeki modülleri oluşturup yapılandırdık, şimdi modülleri IoT Edge cihazına dağıtacağız.

  1. Visual Studio Code'da, yapılandırma klasöründeki deployment.amd64.json dosyasına sağ tıklayın.

  2. Tek Cihaz için Dağıtım Oluştur'u seçin.

  3. IoT Edge cihazınızı (aaTurboFanEdgeDevice) seçin.

  4. Visual Studio Code gezgininde Azure IoT Hub cihazları panelini yenileyin. Üç yeni modülün dağıtıldığını ancak henüz çalışmadığını görmeniz gerekir.

  5. Birkaç dakika sonra yeniden yenilediğinizde modüllerin çalıştığını göreceksiniz.

    Visual Studio Code'da çalışan modülleri görüntüleme

Not

Modüllerin başlatılması ve kararlı bir çalışma durumuna alınması birkaç dakika sürebilir. Bu süre boyunca, IoT Edge hub modülüyle bağlantı kurmaya çalışan modüllerin başlatıldığını ve durduğunu görebilirsiniz.

Hataları tanılama

Bu bölümde, modül veya modüllerde neyin yanlış gittiğini anlamak için birkaç teknik paylaşacağız. Genellikle bir hata ilk olarak Visual Studio Code'daki durumdan tespit edilebilir.

Başarısız modülleri tanımlama

  • Visual Studio Code: Azure IoT Hub cihazları panele bakın. Modüllerin çoğu çalışır durumdaysa ancak biri durdurulduysa, durdurulan modülü daha fazla araştırmanız gerekir. Tüm modüller uzun süre durdurulmuş durumdaysa, hataya da işaret edebilir.

  • Azure portalı: Portalda IoT hub'ınıza gidip cihaz ayrıntıları sayfasını (IoT Edge'in altında, cihazınızda detaya gidin) bularak bir modülün hata bildirdiğini veya IoT hub'ına hiçbir şey bildirmediğini fark edebilirsiniz.

Cihazdan tanılama

IoT Edge cihazında (bizim örneğimizde Linux VM) oturum açarak modüllerinizin durumu hakkında çok sayıda bilgiye erişebilirsiniz. Kullandığımız ana mekanizma, cihazdaki kapsayıcıları ve görüntüleri incelememize olanak sağlayan Docker komutlarıdır.

  1. IoT Edge cihazınızda oturum açın:

    ssh -l <user>@IoTEdge-<extension>.<region>.cloudapp.azure.com
    
  2. Çalışan tüm kapsayıcıları listeleyin. Her modül için modüle karşılık gelen bir ada sahip bir kapsayıcı görmeyi bekliyoruz. Ayrıca bu komut, beklentinizle eşleşmeniz için sürüm de dahil olmak üzere kapsayıcının tam görüntüsünü listeler. Ayrıca komutta "kapsayıcı" yerine "görüntü" yazarak görüntüleri listeleyebilirsiniz.

    sudo docker container ls
    
  3. Kapsayıcının günlüklerini alın. Bu komut, kapsayıcıdaki StdErr ve StdOut'a yazılanları döndürür. Bu komut, bir nedenle başlatılan ve sonra ölen kapsayıcılar için çalışır. EdgeAgent veya edgeHub kapsayıcılarında neler olduğunu anlamak için de kullanışlıdır.

    sudo docker container logs <container id>
    
  4. Kapsayıcıyı inceleyin. Bu komut, görüntü hakkında bir ton bilgi verir. Aradığınız verilere göre filtrelenebilir. Örneğin, avroFileWriter üzerindeki bağlamaların doğru olup olmadığını görmek istiyorsanız komutunu kullanabilirsiniz:

    sudo docker container inspect -f "{{ json .Mounts }}" avroFileWriter | python -m json.tool
    
  5. Çalışan bir kapsayıcıya bağlanın. Kapsayıcı çalışırken incelemek istiyorsanız bu komut yararlı olabilir:

    sudo docker exec -it avroFileWriter bash
    

Kaynakları temizleme

Bu öğretici, her makalenin öncekilerde yapılan işlere göre derlendiği bir kümenin parçasıdır. Son öğreticiyi tamamlayana kadar lütfen tüm kaynakları temizlemeyi bekleyin.

Sonraki adımlar

Bu makalede Visual Studio Code'da üç modül içeren bir IoT Edge Çözümü oluşturduk: sınıflandırıcı, yönlendirici ve dosya yazıcı/yükleyici. Modüllerin uç cihazda birbirleriyle iletişim kurmasına izin vermek için yolları ayarladık. Uç cihazın yapılandırmasını değiştirdik ve Dockerfiles'ı bağımlılıkları yükleyecek ve modüllerin kapsayıcılarına bağlama bağlamaları ekleyecek şekilde güncelleştirdik.

Ardından IoT Hub'ın yapılandırmasını, iletilerimizi türe göre yönlendirecek ve dosya yüklemelerini işleyecek şekilde güncelleştirdik. Her şey yerindeyken modülleri IoT Edge cihazına dağıttık ve modüllerin doğru çalıştığından emin olduk.

Veri göndermeye başlamak ve çözümünüzü iş başında görmek için sonraki makaleye geçin.