Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den anpassade databearbetningsfunktionen WebAssembly (WASM) i Azure IoT Operations möjliggör databearbetning i realtid i ditt Azure IoT Operations kluster. Genom att distribuera anpassade WASM-moduler kan du definiera och köra datatransformeringar som en del av dataflödesdiagrammet, HTTP/REST-anslutningsappen eller MQTT-anslutningsappen.
I den här artikeln beskrivs hur du använder tillägget Azure IoT Operations Data Flow VS Code, dataflow-dev CLI eller standardverktyg som är installerade i din miljö för att utveckla och testa WASM-modulerna lokalt innan du distribuerar dem till ditt Azure IoT Operations kluster. Du får lära dig att:
- Kör ett grafprogram lokalt genom att köra en fördefinierad graf med exempeldata för att förstå det grundläggande arbetsflödet.
- Skapa anpassade WASM-moduler genom att skapa nya operatorer i Python och Rust med kart- och filterfunktioner.
Använd VS Code-tillägget för en inre utvecklingsloop när du aktivt skapar operatorer och grafer, till exempel: skriva kod, skapa, granska fel, felsöka, göra ändringar, uppdatera diagrammet och publicera.
dataflow-dev Använd CLI för CI/CD-fokuserade diagramkvalitetsarbetsflöden, till exempel: skapa befintlig kod, köra grafen, testa utdata mot kända bra resultat och övervaka kvalitet över tid.
Använd standardverktyg som är installerade i din miljö för scenarier där du vill ha mer kontroll över bygg- och testprocessen, eller när du behöver integrera med andra utvecklingsverktyg och arbetsflöden.
Den här artikeln beskriver hur du skapar och testar dina WASM-moduler lokalt. Om du vill använda dem i Azure IoT Operations dataflöden och anslutningsappar måste du distribuera dem till ditt Azure IoT Operations kluster och referera till dem i grafen eller anslutningskonfigurationen:
- Konfigurera WASM-grafdefinitioner (WebAssembly) för dataflödesdiagram och anslutningar
- Distribuera WebAssembly-moduler (WASM) och diagramdefinitioner
Mer avancerade scenarier finns i Skapa tillståndskänsliga WASM-grafer med tillståndsarkivet, Använda schemaregister med WASM-moduler, Felsöka WASM-moduler och Testa WASM-moduler.
Tillägget och CLI-verktyget stöds på följande plattformar:
- Linux
- Windows-undersystem för Linux (WSL)
- Windows (se till att använda ett Windows-gränssnitt som PowerShell eller kommandotolken när du kör tilläggskommandona på Windows)
Mer information om diagram och WASM i Azure IoT Operations finns i:
- Använda ett dataflödesdiagram med WebAssembly-moduler
- Transformera inkommande data med WebAssembly-moduler
Förutsättningar
Utvecklingsmiljö:
- Visual Studio Code
- (Valfritt) RedHat YAML-tillägg för VS Code
- Azure IoT Operations Data Flow-tillägget för VS Code.
- CodeLLDB-tillägget för VS Code för att aktivera felsökning av WASM-moduler
- Docker
Docker-avbildningar:
docker pull mcr.microsoft.com/azureiotoperations/processor-app:1.1.5
docker tag mcr.microsoft.com/azureiotoperations/processor-app:1.1.5 host-app
docker pull mcr.microsoft.com/azureiotoperations/devx-runtime:0.1.8
docker tag mcr.microsoft.com/azureiotoperations/devx-runtime:0.1.8 devx
docker pull mcr.microsoft.com/azureiotoperations/statestore-cli:0.0.2
docker tag mcr.microsoft.com/azureiotoperations/statestore-cli:0.0.2 statestore-cli
docker pull eclipse-mosquitto
Köra ett grafprogram lokalt
I det här exemplet används en exempelarbetsyta som innehåller alla nödvändiga resurser för att skapa och köra ett grafprogram lokalt med hjälp av VS Code-tillägget.
Öppna exempelarbetsytan i VS Code
Klona lagringsplatsen Explore IoT Operations om du inte redan har gjort det.
Öppna mappen samples/wasm i Visual Studio Code genom att välja File > Öppna mapp och navigera till mappen samples/wasm.
Skapa operatorerna
Tryck på Ctrl+Shift+P för att öppna kommandopaletten och sök efter Azure IoT Operations: Skapa alla operatorer. Välj version som byggläge.
Det här kommandot skapar alla operatorer på arbetsytan och skapar .wasm filer i operators mappen. Du använder .wasm filerna för att köra grafprogrammet lokalt.
Köra grafprogrammet lokalt
Starta den lokala körningsmiljön genom att trycka på Ctrl+Shift+P för att öppna kommandopaletten och söka efter Azure IoT Operations: Starta utvecklingsmiljön. Välj släpp som körningsläge.
När den lokala körningsmiljön körs trycker du på Ctrl+Shift+P för att öppna kommandopaletten och söka efter Azure IoT Operations: Kör Application Graph. Välj släpp som körningsläge. Det här kommandot kör grafprogrammet lokalt med hjälp av den lokala körningsmiljön med graph.dataflow.yaml filen på arbetsytan.
Den läser också från hostapp.env.list för att ange miljövariabeln TK_CONFIGURATION_PARAMETERS för konfigurationsparametrar för dataflödesoperatorer.
När du uppmanas att ange indata väljer du data-and-images mappen på arbetsytan. Den här mappen innehåller indatafilerna för grafprogrammet, inklusive temperatur- och luftfuktighetsdata och några bilder för modulen ögonblicksbild.
Vänta tills du ser ett VS Code-meddelande om att loggarna är klara: Log files for the run can be found at ...\wasm\data-and-images\output\logs.
Utdata finns i output mappen under data-and-images mappen . Du kan öppna output mappen på arbetsytan för att se utdatafilerna. Filen .txt med datum och tid för filnamn innehåller bearbetade data och ser ut som i följande exempel:
{"tst":"2025-09-19T04:19:13.530381+0000","topic":"sensors","qos":0,"retain":0,"payloadlen":312,"properties":{"payload-format-indicator":1,"message-expiry-interval":10,"correlation-data":"...","user-properties":{"__ts":"001758255553528:00000:...","__protVer":"1.0","__srcId":"mqtt-source"},"content-type":"application/json"},"payload":{"temperature":[{"count":2,"max":653.888888888889,"min":204.44444444444449,"average":429.16666666666669,"last":204.44444444444449,"unit":"C","overtemp":true}],"humidity":[{"count":3,"max":85,"min":45,"average":69.666666666666671,"last":79}],"object":[{"result":"notebook, notebook computer; sliding door"}]}}
Utdata visar att grafprogrammet bearbetade indata och genererade utdata. Utdata innehåller temperatur- och luftfuktighetsdata och de objekt som identifieras i bilderna.
Skapa en ny graf med anpassade WASM-moduler
Det här scenariot visar hur du skapar ett nytt grafprogram med anpassade WASM-moduler. Grafprogrammet består av två operatorer: en map operator som konverterar temperaturvärden från Fahrenheit till Celsius och en filter operator som filtrerar bort meddelanden med temperaturvärden över 500°C.
Använd för närvarande inte bindestreck (-) eller understreck (_) i operatornamn. VS Code-tillägget tillämpar det här kravet, men om du skapar eller byter namn på moduler manuellt orsakar det problem. Använd enkla alfanumeriska namn för moduler som filter, map, stateenricheller schemafilter.
I stället för att använda en befintlig exempelarbetsyta skapar du en ny arbetsyta från grunden. Med den här processen kan du lära dig hur du skapar ett nytt grafprogram och programmerar operatorerna i Python och Rust.
Skapa ett nytt diagramprogramprojekt i Python
Tryck på Ctrl+Shift+P för att öppna kommandopaletten för VS Code och sök efter Azure IoT Operations: Skapa program:
- För mappen väljer du en mapp där du vill skapa projektet. Du kan skapa en ny mapp för det här projektet.
- Ange
my-graphsom namn. - Välj Python som språk.
- Välj Mappa som typ.
- Ange
mapsom namn.
Nu har du en ny VS Code-arbetsyta med den grundläggande projektstrukturen och startfilerna. Startfilerna graph.dataflow.yaml innehåller filen och källkoden för kartoperatorns mall.
Viktigt!
Om du vill använda en Python modul i en distribuerad Azure IoT Operations-instans måste du distribuera instansen med koordinatorminnesprofilen inställd på Medium eller High. Om du ställer in minnesprofilen på Low eller Tiny kan instansen inte hämta modulen Python.
Lägg till Python kod för kartoperatormodulen
operators/map/map.py Öppna filen och ersätt innehållet med följande kod för att konvertera ett inkommande temperaturvärde från Fahrenheit till Celsius:
import json
from map_impl import exports
from map_impl import imports
from map_impl.imports import types
class Map(exports.Map):
def init(self, configuration) -> bool:
imports.logger.log(imports.logger.Level.INFO, "module4/map", "Init invoked")
return True
def process(self, message: types.DataModel) -> types.DataModel:
# TODO: implement custom logic for map operator
imports.logger.log(imports.logger.Level.INFO, "module4/map", "processing from python")
# Ensure the input is of the expected type
if not isinstance(message, types.DataModel_Message):
raise ValueError("Unexpected input type: Expected DataModel_Message")
# Extract and decode the payload
payload_variant = message.value.payload
if isinstance(payload_variant, types.BufferOrBytes_Buffer):
# It's a Buffer handle - read from host
imports.logger.log(imports.logger.Level.INFO, "module4/map", "Reading payload from Buffer")
payload = payload_variant.value.read()
elif isinstance(payload_variant, types.BufferOrBytes_Bytes):
# It's already bytes
imports.logger.log(imports.logger.Level.INFO, "module4/map", "Reading payload from Bytes")
payload = payload_variant.value
else:
raise ValueError("Unexpected payload type")
decoded = payload.decode("utf-8")
# Parse the JSON data
json_data = json.loads(decoded)
# Check and update the temperature value
if "temperature" in json_data and "value" in json_data["temperature"]:
temp_f = json_data["temperature"]["value"]
if isinstance(temp_f, int):
# Convert Fahrenheit to Celsius
temp_c = round((temp_f - 32) * 5.0 / 9.0)
# Update the JSON data
json_data["temperature"]["value"] = temp_c
json_data["temperature"]["unit"] = "C"
# Serialize the updated JSON back to bytes
updated_payload = json.dumps(json_data).encode("utf-8")
# Update the message payload
message.value.payload = types.BufferOrBytes_Bytes(value=updated_payload)
return message
Kontrollera att Docker körs. Tryck sedan på Ctrl+Shift+P för att öppna kommandopaletten och söka efter Azure IoT Operations: Skapa alla operatorer. Skapa en release-modul.
Byggprocessen placerar map.wasm filen för operatorn map i operators/map/bin/release mappen .
Lägg till Rust-kod för filteroperatormodulen
Skapa en ny operator genom att trycka på Ctrl+Shift+P för att öppna kommandopaletten och söka efter Azure IoT Operations: Skapa operator:
- Välj Rust som språk.
- Välj Filtrera som operatortyp.
- Ange
filtersom namn.
operators/filter/src/lib.rs Öppna filen och ersätt innehållet med följande kod för att filtrera bort värden där temperaturen är över 500°C:
mod filter_operator {
use wasm_graph_sdk::macros::filter_operator;
use serde_json::Value;
fn filter_init(_configuration: ModuleConfiguration) -> bool {
// Add code here to process the module init properties and module schemas from the configuration
true
}
#[filter_operator(init = "filter_init")]
fn filter(input: DataModel) -> Result<bool, Error> {
// Extract payload from input to process
let payload = match input {
DataModel::Message(Message {
payload: BufferOrBytes::Buffer(buffer),
..
}) => buffer.read(),
DataModel::Message(Message {
payload: BufferOrBytes::Bytes(bytes),
..
}) => bytes,
_ => return Err(Error { message: "Unexpected input type".to_string() }),
};
// ... perform filtering logic here and return boolean
if let Ok(payload_str) = std::str::from_utf8(&payload) {
if let Ok(json) = serde_json::from_str::<Value>(payload_str) {
if let Some(temp_c) = json["temperature"]["value"].as_i64() {
// Return true if temperature is above 500°C
return Ok(temp_c > 500);
}
}
}
Ok(false)
}
}
operators/filter/Cargo.toml Öppna filen och lägg till följande beroenden:
[dependencies]
# ...
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
Kontrollera att Docker körs. Tryck sedan på Ctrl+Shift+P för att öppna kommandopaletten och söka efter Azure IoT Operations: Skapa alla operatorer. Skapa en release-modul.
Byggprocessen placerar filter.wasm filen för operatorn filter i operators/filter/bin/release mappen .
Köra grafprogrammet lokalt med exempeldata
graph.dataflow.yaml Öppna filen och ersätt innehållet med följande kod:
metadata:
$schema: "https://www.schemastore.org/aio-wasm-graph-config-1.0.0.json"
name: "Temperature Monitoring"
description: "A graph that converts temperature from Fahrenheit to Celsius, if temperature is above 500°C, then sends the processed data to the sink."
version: "1.0.0"
vendor: "Microsoft"
moduleRequirements:
apiVersion: "1.1.0"
runtimeVersion: "1.1.0"
operations:
- operationType: source
name: source
- operationType: map
name: map
module: map
- operationType: filter
name: filter
module: filter
- operationType: sink
name: sink
connections:
- from:
name: source
to:
name: map
- from:
name: map
to:
name: filter
- from:
name: filter
to:
name: sink
Kopiera mappen data som innehåller exempeldata från den klonade exempellagringsplatsen explore-iot-operations\samples\wasm\data till den aktuella arbetsytan. Mappen data innehåller tre JSON-filer med exempeldata för indatatemperatur.
Om du tidigare stoppade den lokala körningsmiljön trycker du på Ctrl+Shift+P för att öppna kommandopaletten och söka efter Azure IoT Operations: Starta utvecklingsmiljön. Välj släpp som körningsläge.
Tryck på Ctrl+Shift+P för att öppna kommandopaletten och sök efter Azure IoT Operations: Kör Application Graph:
- Välj
graph.dataflow.yamlgraffilen. - Välj släpp som körningsläge.
- Välj mappen som
datadu kopierade till arbetsytan.
DevX-containern startas för att köra diagrammet. Det bearbetade resultatet sparas i data/output mappen. Textfilen i output mappen innehåller bearbetade data med temperaturen konverterad till Celsius och filtrerad baserat på tröskelvärdet.
Information om hur du distribuerar dina anpassade WASM-moduler och diagram till din Azure IoT Operations-instans finns i Distribuera WASM-moduler och dataflödesdiagram.
När du har skapat dina WASM-moduler och ditt grafprogram har konfigurerats kan du distribuera dem till ditt Azure IoT Operations kluster och referera till dem i grafen eller anslutningskonfigurationen:
- Konfigurera WASM-grafdefinitioner (WebAssembly) för dataflödesdiagram och anslutningar
- Distribuera WebAssembly-moduler (WASM) och diagramdefinitioner
Felsökning
Build-fel
| Error | Orsak | Reparera |
|---|---|---|
error[E0463]: can't find crate for std |
WASM-mål saknas | Kör rustup target add wasm32-wasip2 |
error: no matching package found för wasm_graph_sdk |
Lastregister saknas | Lägg till blocket [registries] på det .cargo/config.toml sätt som visas i Kör ett grafprogram lokalt |
componentize-py kan inte hitta WIT-filer |
Felaktig sökväg för schema | Använd -d flaggan med den fullständiga sökvägen till schemakatalogen. Alla .wit filer måste finnas eftersom de refererar till varandra. |
componentize-py versionskonflikt |
Bindningar som genereras med en annan version | Ta bort den genererade bindningskatalogen och återskapa med samma componentize-py version |
wasm-tools komponentkontrollen misslyckas |
Fel målgrupp eller komponentadapter saknas | Kontrollera att du använder wasm32-wasip2 (inte wasm32-wasi eller wasm32-unknown-unknown) |
Körningsfel
| Symptom | Orsak | Reparera |
|---|---|---|
| Operatorn kraschar med WASM-bakåtriktad spårning | Saknade eller ogiltiga konfigurationsparametrar | Lägg till defensiv parsning i init med standardvärden. Se Modulkonfigurationsparametrar. |
init returnerar false, dataflödet startar inte |
Konfigurationsverifieringen misslyckades | Kontrollera om det finns felmeddelanden i dataflödesloggarna. Kontrollera att moduleConfigurations namnen matchar din kod. |
| Modulen läses in men ger inga utdata |
process returnerar fel eller filtrerar bort allt |
Lägg till loggning i process för att spåra dataflödet. |
Unexpected input type |
Modulen mottog fel data-model variant |
Lägg till en typkontroll i början av process och hantera oväntade varianter. |
| Modulen fungerar ensam men kraschar i komplex graf | Konfiguration saknas när den återanvänds mellan noder | Varje nod i grafen behöver en egen moduleConfigurations inmatning. |
Vanliga problem
- Glömmer
--artifact-typeORAS-push. Utan den visar användargränssnittet för driftsupplevelsen inte modulen korrekt. - Matchningsfel
nameimoduleConfigurations. Namnet måste vara<module>/<operator>(till exempelmodule-temperature/filter), som matchar grafdefinitionensoperationsavsnitt. - Använda
wasm32-wasii stället förwasm32-wasip2. Azure IoT Operations kräver WASI Preview 2-målet. - Python: arbeta utanför lagringsplatsen för exempel utan att kopiera schemakatalogen. Alla
.witfiler måste finnas samtidigt eftersom de refererar till varandra.
Kända problemområden
Booleska värden i YAML: Booleska värden måste anges som strängar för att undvika valideringsfel. Använd till exempel
"True"och"False"i stället förtrueochfalse.Exempelfel vid användning av ociterade booleska värden:
* spec.connections[2].from.arm: Invalid value: "boolean": spec.connections[2].from.arm in body must be of type string: "boolean" * spec.connections[2].from.arm: Unsupported value: false: supported values: "False", "True"Python modulkrav: Om du vill använda Python-moduler måste Azure IoT Operations distribueras med MQTT-broker konfigurerad för att använda Medium eller High minnesprofil. Python moduler kan inte hämtas när minnesprofilen är inställd på Low eller Tiny.
Tidsinställning för moduldistribution: Det kan ta lite tid att hämta och tillämpa WASM-moduler, vanligtvis ungefär en minut, beroende på nätverksförhållanden och modulstorlek.
Information om build-fel: När ett bygge misslyckas kanske felmeddelandet i popup-meddelandet inte innehåller tillräckligt med information. Kontrollera terminalutdata för mer specifik felinformation.
Windows kompatibilitet: Första gången du kör ett diagramprogram på Windows kan det uppstå ett felmeddelande om att kommandot misslyckades med slutkod 1. Om det här felet inträffar försöker du utföra åtgärden igen och det bör fungera korrekt.
Värdappens stabilitet: Den lokala körningsmiljön kan ibland sluta fungera och kräva omstart för att återställa.
Remote felsökningsbegränsningar: För närvarande kan du inte fjärrfelsöka WASM-moduler som körs i Azure Linux 3.0 på grund av inkompatibla LLDB-versioner.
Återställningsprocedurer
Återställning av VS Code-tillägget: Om VS Code-tillägget fungerar oväntat kan du prova att avinstallera och installera om det och sedan starta om VS Code.
Relaterat innehåll
- Skapa tillståndsberoende WASM-grafer med tillståndslagret
- Använda schemaregister med WASM-moduler
- Felsöka WASM-moduler
- Testa WASM-moduler
- Förstå WASM-moduler (WebAssembly) och diagramdefinitioner för dataflödesdiagram
- Konfigurera grafdefinitioner
- Distribuera grafdefinitioner
- ONNX-slutsatsdragning i WASM-moduler
- Använda WASM i dataflödesdiagram