Sviluppare moduli di IoT Edge personalizzati
Si applica a: IoT Edge 1.5 IoT Edge 1.4
Importante
IoT Edge 1.5 LTS e IoT Edge 1.4 LTS sono versioni supportate. IoT Edge 1.4 LTS è di fine vita il 12 novembre 2024. Se si usa una versione precedente, vedere Aggiornare IoT Edge.
I moduli di IoT Edge di Azure possono connettersi con altri servizi di Azure e contribuire alla pipeline di dati cloud più estesa. Questo articolo descrive come sviluppare i moduli per comunicare con il runtime di IoT Edge e l'hub IoT e di conseguenza il resto del cloud di Azure.
Ambiente di runtime di IoT Edge
Il runtime di IoT Edge offre l'infrastruttura per integrare le funzionalità di più moduli di IoT Edge e distribuirle nei dispositivi IoT Edge. Qualsiasi programma può essere inserito in un pacchetto come modulo IoT Edge. Per sfruttare appieno le funzionalità di comunicazione e gestione di IoT Edge, un programma in esecuzione in un modulo può usare Azure IoT Device SDK per connettersi all'hub IoT Edge locale.
Creazione del pacchetto del programma come modulo IoT Edge
Per distribuire il programma in un dispositivo IoT Edge, è necessario prima di tutto essere in contenitori ed eseguirlo con un motore compatibile con Docker. IoT Edge usa Moby, il progetto open source dietro Docker, come motore compatibile con Docker. Gli stessi parametri usati con Docker possono essere passati ai moduli IoT Edge. Per altre informazioni, vedere Come configurare le opzioni di creazione di contenitori per i moduli IoT Edge.
Tramite l'hub di IoT Edge
L'hub IoT Edge offre due funzionalità principali: un proxy per hub IoT e comunicazioni locali.
Connessione all'hub di IoT Edge da un modulo
La connessione all'hub IoT Edge locale da un modulo prevede gli stessi passaggi di connessione per tutti i client. Per altre informazioni, vedere Connessione all'hub IoT Edge.
Per usare il routing di IoT Edge su AMQP, è possibile usare ModuleClient da Azure IoT SDK. Creare un'istanza di ModuleClient per connettere il modulo all'hub IoT Edge in esecuzione nel dispositivo, nello stesso modo in cui le istanze di DeviceClient connettono i dispositivi IoT all'hub IoT. Per altre informazioni sulla classe ModuleClient e sui relativi metodi di comunicazione, vedere le informazioni di riferimento sulle API per il linguaggio SDK preferito: C#, C, Python, Java o Node.js.
Primitive di hub IoT
hub IoT vede un'istanza del modulo come simile a un dispositivo. Un'istanza del modulo può:
- Inviare messaggi da dispositivo a cloud
- Ricevere metodi diretti destinati specificamente alla propria identità
- Disporre di un modulo gemello distinto e isolato dal dispositivo gemello e dagli altri moduli gemelli del dispositivo
Attualmente, i moduli non possono ricevere messaggi da cloud a dispositivo o usare la funzionalità di caricamento file.
Quando si scrive un modulo, è possibile connettersi all'hub di IoT Edge e usare le primitive dell'hub IoT come si farebbe quando si usa l'hub IoT con un'applicazione del dispositivo. L'unica differenza tra i moduli IoT Edge e le applicazioni per dispositivi IoT è che con i moduli è necessario fare riferimento all'identità del modulo anziché all'identità del dispositivo.
Messaggi da dispositivo a cloud
Un modulo IoT Edge può inviare messaggi al cloud tramite l'hub di IoT Edge che funge da broker locale e propaga i messaggi al cloud. Per abilitare l'elaborazione complessa dei messaggi da dispositivo a cloud, un modulo IoT Edge può intercettare ed elaborare i messaggi inviati da altri moduli o dispositivi all'hub IoT Edge locale. Il modulo IoT Edge invierà quindi nuovi messaggi con dati elaborati. È quindi possibile creare catene di moduli IoT Edge per creare pipeline di elaborazione locali.
Per inviare messaggi di telemetria da dispositivo a cloud tramite route:
- Usare la classe Module Client di Azure IoT SDK. Ogni modulo ha endpoint di input e output .
- Usare un metodo send message dalla classe Module Client per inviare messaggi nell'endpoint di output del modulo.
- Configurare una route nel modulo edgeHub del dispositivo per inviare questo endpoint di output a hub IoT.
Per elaborare i messaggi usando route:
- Configurare una route per inviare messaggi provenienti da un altro endpoint (modulo o dispositivo) all'endpoint di input del modulo.
- Ascoltare i messaggi nell'endpoint di input del modulo. Ogni volta che viene restituito un nuovo messaggio, viene attivata una funzione di callback da Azure IoT SDK.
- Elaborare il messaggio con questa funzione di callback e(facoltativamente) inviare nuovi messaggi nella coda dell'endpoint del modulo.
Nota
Per altre informazioni sulla dichiarazione di una route, vedere Informazioni su come distribuire i moduli e stabilire route in IoT Edge
Elementi gemelli
I gemelli sono una delle primitive fornite dall'hub IoT. Sono disponibili documenti JSON che archiviano informazioni sullo stato, tra cui metadati, configurazioni e condizioni. Ogni modulo o dispositivo ha il proprio gemello.
Per ottenere un modulo gemello con Azure IoT SDK, chiamare il
ModuleClient.getTwin
metodo .Per ricevere una patch del modulo gemello con Azure IoT SDK, implementare una funzione di callback e registrarla con il
ModuleClient.moduleTwinCallback
metodo da Azure IoT SDK in modo che la funzione di callback venga attivata ogni volta che viene fornita una patch gemella.
Ricevere metodi diretti
Per ricevere un metodo diretto con Azure IoT SDK, implementare una funzione di callback e registrarla con il ModuleClient.methodCallback
metodo da Azure IoT SDK in modo che la funzione di callback venga attivata ogni volta che viene fornito un metodo diretto.
Supporto del linguaggio e dell'architettura
IoT Edge supporta più sistemi operativi, architetture di dispositivi e linguaggi di sviluppo, in modo da poter creare lo scenario che soddisfa le proprie esigenze. Usare questa sezione per comprendere le opzioni per lo sviluppo di moduli IoT Edge personalizzati. Per altre informazioni sul supporto e sui requisiti degli strumenti per ogni linguaggio, vedere Preparare l'ambiente di sviluppo e test per IoT Edge.
Linux
Per tutti i linguaggi nella tabella seguente, IoT Edge supporta lo sviluppo per i contenitori AMD64 e LA maggior parte dei contenitori LINUX ARM64. È disponibile anche il supporto per i contenitori DEBIAN 11 ARM32.
Linguaggio di sviluppo | Strumenti di sviluppo |
---|---|
A | Visual Studio Code Visual Studio 2019/2022 |
C# | Visual Studio Code Visual Studio 2019/2022 |
Java | Visual Studio Code |
Node.JS | Visual Studio Code |
Python | Visual Studio Code |
Nota
Per la compilazione multipiattaforma, ad esempio la compilazione di un modulo ARM32 IoT Edge in un computer di sviluppo AMD64, è necessario configurare il computer di sviluppo per compilare il codice nell'architettura del dispositivo di destinazione corrispondente al modulo IoT Edge. Per altre informazioni sulle architetture dei dispositivi di destinazione, vedere Sviluppare moduli di Azure IoT Edge con Visual Studio Code.
Windows
I contenitori di Windows non sono più supportati. IoT Edge per Linux in Windows è il modo consigliato per eseguire IoT Edge nei dispositivi Windows.
Sicurezza dei moduli
È consigliabile sviluppare i moduli tenendo presente la sicurezza. Per altre informazioni sulla protezione dei moduli, vedere Sicurezza di Docker.
Per migliorare la sicurezza dei moduli, IoT Edge disabilita alcune funzionalità del contenitore per impostazione predefinita. È possibile eseguire l'override delle impostazioni predefinite per fornire funzionalità con privilegi ai moduli, se necessario.
Consenti autorizzazioni Docker elevate
Nel file di configurazione in un dispositivo IoT Edge è presente un parametro denominato allow_elevated_docker_permissions
. Se impostato su true, questo flag consente il --privileged
flag e le eventuali funzionalità aggiuntive definite nel CapAdd
campo di Docker HostConfig nel contenitore di opzioni di creazione.
Nota
Attualmente, questo flag è true per impostazione predefinita, che consente alle distribuzioni di concedere autorizzazioni con privilegi ai moduli. È consigliabile impostare questo flag su false per migliorare la sicurezza dei dispositivi.
Abilitare CAP_CHOWN e CAP_SETUID
Le funzionalità di Docker CAP_CHOWN e CAP_SETUID sono disabilitate per impostazione predefinita. Queste funzionalità possono essere usate per scrivere per proteggere i file nel dispositivo host e potenzialmente ottenere l'accesso radice.
Se sono necessarie queste funzionalità, è possibile riabilitarle manualmente usando CapADD nelle opzioni di creazione del contenitore.
Passaggi successivi
Preparare l'ambiente di sviluppo e test per IoT Edge
Sviluppare moduli di Azure IoT Edge con Visual Studio Code
Eseguire il debug dei moduli di Azure IoT Edge con Visual Studio Code