Kurz: Vývoj modulu Java IoT Edge pomocí kontejnerů Linuxu

Platí pro:IoT Edge 1.4 zaškrtnutí IoT Edge 1.4

Moduly Azure IoT Edge můžete použít k nasazení kódu, který implementuje obchodní logiku přímo do zařízení IoT Edge. Tento kurz vás povede při vytvoření a nasazení modulu IoT Edge, který filtruje data ze senzoru. Použijete simulované IoT Edge zařízení, které jste vytvořili v článku Nasazení azure IoT Edge na simulované zařízení v článcích rychlý start. V tomto kurzu se naučíte:

  • Použít Visual Studio Code k vytvoření modulu IoT Edge Java na základě balíčku šablon Azure IoT Edge maven a sady SDK pro zařízení Azure IoT Java
  • Používat Visual Studio Code a Docker k vytvoření image Dockeru a jejímu publikování v registru.
  • Nasadit modul do zařízení IoT Edge.
  • Zobrazit vygenerovaná data.

Modul IoT Edge, který v tomto kurzu vytvoříte, filtruje teplotní údaje generované zařízením. Zprávy posílá dále, jen když teplota překročí zadanou prahovou hodnotu. Tento typ analýzy v zařízení Edge je užitečný kvůli zmenšení objemu dat přenášených a ukládaných do cloudu.

Pokud nemáte předplatné Azure, vytvořte si bezplatný účet Azure , než začnete.

Požadavky

Tento kurz ukazuje, jak vyvíjet modul v Javě pomocí editoru Visual Studio Code a jak ho nasadit do IoT Edge zařízení. IoT Edge nepodporuje moduly Java vytvořené jako kontejnery Windows.

V následující tabulce se seznamte s možnostmi vývoje a nasazování modulů Java:

Java Visual Studio Code Visual Studio 2017/2019
Linux AMD64 Použití VS Code pro moduly Java v Linuxu AMD64
Linux ARM32 Použití VS Code pro moduly Java v Linuxu ARM32
Linux ARM64 Použití VS Code pro moduly Java v Linuxu ARM64

Před zahájením tohoto kurzu jste si měli projít předchozí kurz nastavení vývojového prostředí pro vývoj linuxových kontejnerů: Vývoj modulů IoT Edge pro zařízení s Linuxem. Po dokončení některého z těchto kurzů byste měli mít splněné následující požadavky:

Pokud chcete v Javě vyvíjet modul IoT Edge, nainstalujte na vývojový počítač následující další požadavky:

Vytvoření projektu modulu

Následující postup vytvoří projekt modulu IoT Edge, který je založený na balíčku šablony Azure IoT Edge maven a sadě Azure IoT Java SDK pro zařízení. Projekt vytvoříte pomocí editoru Visual Studio Code a rozšíření Azure IoT Edge.

Vytvoření nového projektu

Vytvořte šablonu řešení v jazyce Java, kterou můžete přizpůsobit pomocí vlastního kódu.

  1. V editoru Visual Studio Code vyberte Zobrazit>paletu příkazů a otevřete paletu příkazů VS Code.

  2. Na paletě příkazů zadejte a spusťte příkaz Azure IoT Edge: New IoT Edge solution (Azure IoT Edge: Nové řešení IoT Edge). Vytvořte řešení podle výzev, které se zobrazí na paletě příkazů.

    Pole Hodnota
    Vybrat složku Zvolte umístění na vývojovém počítači, ve kterém VS Code vytvoří soubory řešení.
    Zadejte název řešení Zadejte popisný název vašeho řešení nebo přijměte výchozí EdgeSolution.
    Vyberte šablonu modulu Zvolte Modul Java.
    Zadejte název modulu Pojmenujte modul JavaModule.
    Zadejte pro modul úložiště imagí Dockeru Úložiště imagí zahrnuje název registru kontejneru a název image kontejneru. Image kontejneru je předem vyplněná z názvu, který jste zadali v posledním kroku. Nahraďte localhost:5000 hodnotou Přihlašovací server z registru kontejneru Azure. Přihlašovací server můžete načíst ze stránky Přehled registru kontejneru v Azure Portal.

    Konečné úložiště imagí vypadá jako <název> registru.azurecr.io/javamodule.
    Zadejte hodnotu pro groupId. Zadejte hodnotu ID skupiny nebo přijměte výchozí modul com.edge.

    Zadání úložiště imagí Dockeru

Pokud modul Java vytváříte poprvé, může stažení balíčků mavenu trvat několik minut. Jakmile je řešení připravené, okno VS Code načte váš pracovní prostor řešení IoT Edge. Pracovní prostor řešení obsahuje pět komponent nejvyšší úrovně:

  • Složka modules obsahuje kód Java pro váš modul a soubory Dockeru pro sestavení modulu jako image kontejneru.
  • Soubor .env ukládá přihlašovací údaje registru kontejneru.
  • Soubor deployment.template.json obsahuje informace, které modul runtime IoT Edge používá k nasazení modulů do zařízení.
  • Soubor deployment.debug.template.json obsahuje kontejnery s ladicí verzí modulů.
  • V tomto kurzu nebudete upravovat složku .vscode ani soubor .gitignore .

Pokud jste při vytváření řešení nezadali registr kontejneru, ale přijali jste výchozí hodnotu localhost:5000, nebudete mít soubor .env.

Přidání přihlašovacích údajů registru

V souboru prostředí jsou uložené přihlašovací údaje pro registr kontejneru, které soubor sdílí s modulem runtime IoT Edge. Modul runtime tyto přihlašovací údaje potřebuje k přetažení vašich privátních imagí do zařízení IoT Edge.

Rozšíření IoT Edge se pokusí vyžádat přihlašovací údaje registru kontejneru z Azure a naplnit je v souboru prostředí. Zkontrolujte, jestli už vaše přihlašovací údaje nejsou zahrnuté. Pokud ne, přidejte je teď:

  1. V průzkumníku VS Code otevřete soubor .env.
  2. Aktualizujte pole hodnotami uživatelské jméno a heslo, které jste zkopírovali z registru kontejneru Azure.
  3. Soubor uložte.

Poznámka

Tento kurz používá přihlašovací údaje správce pro Azure Container Registry, které jsou vhodné pro scénáře vývoje a testování. Až budete připraveni na produkční scénáře, doporučujeme použít možnost ověřování s nejnižšími oprávněními, jako jsou instanční objekty. Další informace najdete v tématu Správa přístupu k registru kontejneru.

Vyberte cílovou architekturu.

Visual Studio Code v současné době může vyvíjet moduly Java pro zařízení s Linuxem AMD64 a LinuxEM ARM32v7. Musíte vybrat architekturu, na kterou cílíte u jednotlivých řešení, protože kontejner je sestavený a spuštěný odlišně pro každý typ architektury. Výchozí hodnota je Linux AMD64.

  1. Otevřete paletu příkazů a vyhledejte Azure IoT Edge: Nastavit výchozí cílovou platformu pro řešení Edge nebo vyberte ikonu zástupce na bočním panelu v dolní části okna.

  2. Na paletě příkazů vyberte cílovou architekturu ze seznamu možností. Pro účely tohoto kurzu jako IoT Edge zařízení používáme virtuální počítač s Ubuntu, takže si ponecháme výchozí amd64.

Aktualizace modulu pomocí vlastního kódu

  1. V průzkumníku VS Code otevřete moduly>JavaModule>src>main>java>com>edgemodule>App.java.

  2. Na začátek souboru přidejte následující kód k importování nových odkazovaných tříd.

    import java.io.StringReader;
    import java.util.concurrent.atomic.AtomicLong;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.json.Json;
    import javax.json.JsonObject;
    import javax.json.JsonReader;
    
    import com.microsoft.azure.sdk.iot.device.DeviceTwin.Pair;
    import com.microsoft.azure.sdk.iot.device.DeviceTwin.Property;
    import com.microsoft.azure.sdk.iot.device.DeviceTwin.TwinPropertyCallBack;
    
  3. Přidejte následující definici do třídy App. Tato proměnná nastaví prahovou hodnotu teploty. Naměřená teplota stroje nebude hlášena do IoT Hub, dokud nepřesáhne tuto hodnotu.

    private static final String TEMP_THRESHOLD = "TemperatureThreshold";
    private static AtomicLong tempThreshold = new AtomicLong(25);
    
  4. Nahraďte metodu spuštění MessageCallbackMqtt následujícím kódem. Tato metoda se volá pokaždé, když modul dostane zprávu MQTT z IoT Edge Hubu. Odfiltruje zprávy, které hlásí nižší teploty, než je prahová hodnota nastavená ve dvojčeti modulu.

    protected static class MessageCallbackMqtt implements MessageCallback {
        private int counter = 0;
        @Override
        public IotHubMessageResult execute(Message msg, Object context) {
            this.counter += 1;
    
            String msgString = new String(msg.getBytes(), Message.DEFAULT_IOTHUB_MESSAGE_CHARSET);
            System.out.println(
                   String.format("Received message %d: %s",
                            this.counter, msgString));
            if (context instanceof ModuleClient) {
                try (JsonReader jsonReader = Json.createReader(new StringReader(msgString))) {
                    final JsonObject msgObject = jsonReader.readObject();
                    double temperature = msgObject.getJsonObject("machine").getJsonNumber("temperature").doubleValue();
                    long threshold = App.tempThreshold.get();
                    if (temperature >= threshold) {
                        ModuleClient client = (ModuleClient) context;
                        System.out.println(
                            String.format("Temperature above threshold %d. Sending message: %s",
                            threshold, msgString));
                        client.sendEventAsync(msg, eventCallback, msg, App.OUTPUT_NAME);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return IotHubMessageResult.COMPLETE;
        }
    }
    
  5. Přidejte následující dvě statické vnitřní třídy do třídy App. Tyto třídy aktualizují proměnnou tempThreshold, když se změní požadovaná vlastnost dvojčete modulu. Všechny moduly mají vlastní dvojče, abyste mohli kód, který je spuštěný v modulu, konfigurovat přímo z cloudu.

    protected static class DeviceTwinStatusCallBack implements IotHubEventCallback {
        @Override
        public void execute(IotHubStatusCode status, Object context) {
            System.out.println("IoT Hub responded to device twin operation with status " + status.name());
        }
    }
    
    protected static class OnProperty implements TwinPropertyCallBack {
        @Override
        public void TwinPropertyCallBack(Property property, Object context) {
            if (!property.getIsReported()) {
                if (property.getKey().equals(App.TEMP_THRESHOLD)) {
                    try {
                        long threshold = Math.round((double) property.getValue());
                        App.tempThreshold.set(threshold);
                    } catch (Exception e) {
                        System.out.println("Faile to set TemperatureThread with exception");
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
  6. Přidejte následující řádky do metody main za client.open() k odběru aktualizací dvojčete modulu.

    client.startTwin(new DeviceTwinStatusCallBack(), null, new OnProperty(), null);
    Map<Property, Pair<TwinPropertyCallBack, Object>> onDesiredPropertyChange = new HashMap<Property, Pair<TwinPropertyCallBack, Object>>() {
        {
            put(new Property(App.TEMP_THRESHOLD, null), new Pair<TwinPropertyCallBack, Object>(new OnProperty(), null));
        }
    };
    client.subscribeToTwinDesiredProperties(onDesiredPropertyChange);
    client.getTwin();
    
  7. Uložte soubor App.java.

  8. V průzkumníku VS Code otevřete soubor deployment.template.json v pracovním prostoru řešení IoT Edge.

  9. Přidejte do manifestu nasazení dvojče modulu JavaModule. Vložte následující obsah JSON do dolní části oddílu moduleContent za dvojče modulu $edgeHub:

      "JavaModule": {
          "properties.desired":{
              "TemperatureThreshold":25
          }
      }
    

    Přidání dvojčete modulu do šablony nasazení

  10. Uložte soubor deployment.template.json.

Sestavení a nasdílení změn modulu

V předchozí části jste vytvořili řešení IoT Edge a do modulu JavaModule jste přidali kód pro filtrování zpráv, ve kterých je hlášená teplota počítače nižší než přijatelný limit. Teď sestavte řešení jako image kontejneru a nasdílejte ho do registru kontejneru.

  1. Otevřete integrovaný terminál VS Code tak, že vyberete Zobrazit>terminál.

  2. Přihlaste se k Dockeru zadáním následujícího příkazu v terminálu. Přihlaste se pomocí uživatelského jména, hesla a přihlašovacího serveru z registru kontejneru Azure. Tyto hodnoty můžete načíst z části Přístupové klíče registru v Azure Portal.

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

    Může se zobrazit upozornění zabezpečení, které doporučí použití nástroje --password-stdin. I když se tento osvědčený postup doporučuje pro produkční scénáře, je mimo rozsah tohoto kurzu. Další informace najdete v referenčních informacích k přihlášení k Dockeru .

  3. V průzkumníku VS Code klikněte pravým tlačítkem na soubor deployment.template.json a vyberte Sestavit a odeslat IoT Edge Řešení.

    Příkaz sestavení a nabízení spustí tři operace. Nejprve v řešení vytvoří novou složku s názvem config , která obsahuje manifest úplného nasazení, který je sestavený z informací v šabloně nasazení a dalších souborech řešení. Za druhé se spustí docker build sestavení image kontejneru na základě příslušného souboru dockerfile pro vaši cílovou architekturu. Potom se spustí docker push a odešle úložiště imagí do registru kontejneru.

    Tento proces může na začátku trvat několik minut, ale při příštím spuštění příkazů je rychlejší.

Nasazení modulů do zařízení

Pomocí průzkumníka editoru Visual Studio Code a rozšíření Azure IoT Edge nasaďte projekt modulu do IoT Edge zařízení. Pro váš scénář už máte připravený manifest nasazení – soubor deployment.amd64.json ve složce config. Teď stačí jen vybrat zařízení, na které se nasazení provede.

Ujistěte se, že je vaše IoT Edge zařízení v provozu.

  1. V průzkumníku editoru Visual Studio Code v části Azure IoT Hub rozbalte položku Zařízení a zobrazí se seznam zařízení IoT.

  2. Klikněte pravým tlačítkem na název vašeho zařízení IoT Edge a pak vyberte Create Deployment for Single Device (Vytvořit nasazení pro jedno zařízení).

  3. Ve složce config vyberte soubor deployment.amd64.json a pak klikněte na Vybrat manifest nasazení Edge. Nepoužívejte soubor deployment.template.json.

  4. V části zařízení rozbalte moduly a zobrazte seznam nasazených a spuštěných modulů. Klikněte na tlačítko pro obnovení. Měli byste vidět spuštěný nový modul JavaModule společně s modulem SimulatedTemperatureSensor a $edgeAgent a $edgeHub.

    Spuštění modulů může trvat několik minut. Modul runtime IoT Edge musí obdržet svůj nový manifest nasazení, stáhnout image modulu z modulu runtime kontejneru a pak spustit každý nový modul.

Zobrazení vygenerovaných dat

Po použití manifestu nasazení pro zařízení IoT Edge začne modul runtime IoT Edge na zařízení shromažďovat informace o novém nasazení a jednat podle nich. Všechny moduly spuštěné na zařízení, které nejsou zahrnuté do manifestu nasazení, se zastaví. Všechny moduly, které na zařízení chybí, se spustí.

  1. V průzkumníku editoru Visual Studio Code klikněte pravým tlačítkem na název IoT Edge zařízení a vyberte Spustit monitorování integrovaného koncového bodu události.

  2. Zobrazte si zprávy přicházející do IoT Hub. Doručení zpráv může chvíli trvat. IoT Edge zařízení musí přijmout nové nasazení a spustit všechny moduly. Změny, které jsme udělali v kódu JavaModule, pak před odesláním zpráv počkají, dokud teplota počítače nedosáhne 25 stupňů. Přidá také typ zprávy Alert do všech zpráv, které dosáhnou této prahové hodnoty teploty.

Úprava dvojčete modulu

Použili jsme dvojče modulu JavaModule v manifestu nasazení k nastavení prahové hodnoty teploty na 25 stupňů. Pomocí dvojčete modulu můžete změnit funkce, aniž byste museli aktualizovat kód modulu.

  1. V editoru Visual Studio Code rozbalte podrobnosti v IoT Edge zařízení a zobrazte spuštěné moduly.

  2. Klikněte pravým tlačítkem na JavaModule a vyberte Upravit dvojče modulu.

  3. V požadovaných vlastnostech vyhledejte TemperatureThreshold . Změňte jeho hodnotu na novou teplotu o 5 až 10 stupňů vyšší, než je poslední hlášená teplota.

  4. Uložte soubor dvojčete modulu.

  5. Klikněte pravým tlačítkem na libovolné místo v podokně úprav dvojčete modulu a vyberte Aktualizovat dvojče modulu.

  6. Monitorujte příchozí zprávy zařízení-cloud. Zprávy by se měly zastavit, dokud nebude dosaženo nové prahové hodnoty teploty.

Vyčištění prostředků

Pokud máte v plánu pokračovat k dalšímu doporučenému článku, můžete si vytvořené prostředky a konfigurace uschovat a znovu je použít. Také můžete dál používat stejné zařízení IoT Edge jako testovací zařízení.

Jinak můžete místní konfigurace a prostředky Azure vytvořené v tomto článku odstranit, abyste se vyhnuli poplatkům.

Odstranění prostředků Azure

Odstranění prostředků Azure a skupin prostředků je nevratná akce. Ujistěte se, že nechtěně neodstraníte nesprávnou skupinu prostředků nebo prostředky. Pokud jste centrum IoT vytvořili uvnitř existující skupiny prostředků, která obsahuje prostředky, které chcete zachovat, odstraňte pouze samotný prostředek služby IoT Hub, nikoli skupinu prostředků.

Odstranění prostředků:

  1. Přihlaste se k portálu Azure Portal a potom vyberte Skupiny prostředků.

  2. Vyberte název skupiny prostředků, která obsahuje vaše testovací prostředky služby IoT Edge.

  3. Projděte si seznam prostředků obsažených ve vaší skupině prostředků. Pokud chcete odstranit všechny prostředky, můžete vybrat možnost Odstranit skupinu prostředků. Pokud chcete odstranit pouze některé prostředky, můžete na ně kliknout a odstranit je jednotlivě.

Další kroky

V tomto kurzu jste vytvořili modul IoT Edge, který filtruje nezpracovaná data vygenerovaná IoT Edge zařízením.

Pokračujte k dalším kurzům, ve které se dozvíte, jak azure IoT Edge pomáhá nasadit cloudové služby Azure ke zpracování a analýze dat na hraničních zařízeních.