Anteckning
Å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.
En enhetsmodell definierar:
- Telemetri som en enhet skickar till en tjänst.
- Egenskaper som en enhet synkroniserar med en tjänst.
- Kommandon som tjänsten anropar en enhet med.
Tips/Råd
Azure IoT Central är en tjänst som följer Plug and Play-konventionerna. I IoT Central ingår enhetsmodellen i en enhetsmall. IoT Central stöder för närvarande DTDL v2 med ett IoT Central-tillägg. Ett IoT Central-program förväntar sig att ta emot UTF-8-kodade JSON-data.
Den här artikeln beskriver JSON-nyttolaster som enheter skickar och tar emot för telemetri, egenskaper och kommandon som definierats i en DTDL-enhetsmodell.
Artikeln beskriver inte alla möjliga typer av telemetri, egenskap och kommandonyttolast, men exemplen illustrerar nyckeltyper.
Varje exempel visar ett kodfragment från enhetsmodellen som definierar typen och JSON-exempelnyttolaster för att illustrera hur enheten ska interagera med en Plug and Play-medveten tjänst, till exempel IoT Central.
I JSON-exempelfragmenten i den här artikeln används DTDL (Digital Twin Definition Language) v2. Det finns också vissa DTDL-tillägg som IoT Central använder.
Exempel på enhetskod som visar några av dessa nyttolaster som används finns i följande självstudie: Skapa och ansluta ett klientprogram till ditt Azure IoT Central-program.
Visa rådata
Om du använder IoT Central kan du visa rådata som en enhet skickar till ett program. Den här vyn är användbar för felsökning av problem med nyttolasten som skickas från en enhet. Så här visar du rådata som en enhet skickar:
Gå till enheten från sidan Enheter .
Välj fliken Rådata :
I den här vyn kan du välja vilka kolumner som ska visas och ange ett tidsintervall som ska visas. Kolumnen Odefinierade data visar data från enheten som inte matchar några egenskaps- eller telemetridefinitioner i enhetsmallen.
Mer felsökningstips finns i Felsöka varför data från dina enheter inte visas i Azure IoT Central.
Telemetri
Mer information om namngivningsregler för DTDL-telemetri finns i DTDL-telemetri>. Du kan inte starta ett telemetrinamn med _ tecknet .
Skapa inte telemetrityper med följande namn. IoT Central använder dessa reserverade namn internt. Om du försöker använda dessa namn ignorerar IoT Central dina data:
EventEnqueuedUtcTimeEventProcessedUtcTimePartitionIdEventHubUser$metadata$version
Telemetri i komponenter
Om telemetrin definieras i en komponent lägger du till en anpassad meddelandeegenskap med $.sub namnet på komponenten enligt definitionen i enhetsmodellen.
Viktigt!
Om du vill visa telemetri från komponenter som finns i IoT Edge-moduler korrekt använder du IoT Edge version 1.2.4 eller senare. Om du använder en tidigare version visas telemetri från dina komponenter i IoT Edge-moduler som _unmodeleddata.
Telemetri i ärvda gränssnitt
Om telemetrin definieras i ett ärvt gränssnitt skickar enheten telemetrin som om den definieras i rotgränssnittet. Med följande enhetsmodell:
[
{
"@id": "dtmi:contoso:device;1",
"@type": "Interface",
"contents": [
{
"@type": [
"Property",
"Cloud",
"StringValue"
],
"displayName": {
"en": "Device Name"
},
"name": "DeviceName",
"schema": "string"
}
],
"displayName": {
"en": "Contoso Device"
},
"extends": [
"dtmi:contoso:sensor;1"
],
"@context": [
"dtmi:iotcentral:context;2",
"dtmi:dtdl:context;2"
]
},
{
"@context": [
"dtmi:iotcentral:context;2",
"dtmi:dtdl:context;2"
],
"@id": "dtmi:contoso:sensor;1",
"@type": [
"Interface",
"NamedInterface"
],
"contents": [
{
"@type": [
"Telemetry",
"NumberValue"
],
"displayName": {
"en": "Meter Voltage"
},
"name": "MeterVoltage",
"schema": "double"
}
],
"displayName": {
"en": "Contoso Sensor"
},
"name": "ContosoSensor"
}
]
Följande nyttolast används när enheten skickar telemetri för mätarspänning. Enheten innehåller inte gränssnittsnamnet i nyttolasten:
{
"MeterVoltage": 5.07
}
Primitiva typer
Det här avsnittet visar exempel på primitiva telemetrityper som en enhet kan strömma.
Följande kodfragment från en enhetsmodell visar definitionen av en boolean telemetrityp:
{
"@type": "Telemetry",
"displayName": {
"en": "BooleanTelemetry"
},
"name": "BooleanTelemetry",
"schema": "boolean"
}
En enhetsklient bör skicka telemetrin som JSON som ser ut som i följande exempel:
{ "BooleanTelemetry": true }
Följande kodfragment från en enhetsmodell visar definitionen av en string telemetrityp:
{
"@type": "Telemetry",
"displayName": {
"en": "StringTelemetry"
},
"name": "StringTelemetry",
"schema": "string"
}
En enhetsklient bör skicka telemetrin som JSON som ser ut som i följande exempel:
{ "StringTelemetry": "A string value - could be a URL" }
Följande kodfragment från en enhetsmodell visar definitionen av en integer telemetrityp:
{
"@type": "Telemetry",
"displayName": {
"en": "IntegerTelemetry"
},
"name": "IntegerTelemetry",
"schema": "integer"
}
En enhetsklient bör skicka telemetrin som JSON som ser ut som i följande exempel:
{ "IntegerTelemetry": 23 }
Följande kodfragment från en enhetsmodell visar definitionen av en double telemetrityp:
{
"@type": "Telemetry",
"displayName": {
"en": "DoubleTelemetry"
},
"name": "DoubleTelemetry",
"schema": "double"
}
En enhetsklient bör skicka telemetrin som JSON som ser ut som i följande exempel:
{ "DoubleTelemetry": 56.78 }
Följande kodfragment från en enhetsmodell visar definitionen av en dateTime telemetrityp:
{
"@type": "Telemetry",
"displayName": {
"en": "DateTimeTelemetry"
},
"name": "DateTimeTelemetry",
"schema": "dateTime"
}
En enhetsklient ska skicka telemetrin som JSON som ser ut som i följande exempel – DateTime typer måste vara i ISO 8061-format:
{ "DateTimeTelemetry": "2020-08-30T19:16:13.853Z" }
Följande kodfragment från en enhetsmodell visar definitionen av en duration telemetrityp:
{
"@type": "Telemetry",
"displayName": {
"en": "DurationTelemetry"
},
"name": "DurationTelemetry",
"schema": "duration"
}
En enhetsklient ska skicka telemetrin som JSON som ser ut som i följande exempel – varaktigheterna måste vara i ISO 8601-format:
{ "DurationTelemetry": "PT10H24M6.169083011336625S" }
Komplexa typer
Det här avsnittet visar exempel på komplexa telemetrityper som en enhet kan strömma.
Följande kodfragment från en enhetsmodell visar definitionen av en Enum telemetrityp:
{
"@type": "Telemetry",
"displayName": {
"en": "EnumTelemetry"
},
"name": "EnumTelemetry",
"schema": {
"@type": "Enum",
"displayName": {
"en": "Enum"
},
"valueSchema": "integer",
"enumValues": [
{
"displayName": {
"en": "Item1"
},
"enumValue": 0,
"name": "Item1"
},
{
"displayName": {
"en": "Item2"
},
"enumValue": 1,
"name": "Item2"
},
{
"displayName": {
"en": "Item3"
},
"enumValue": 2,
"name": "Item3"
}
]
}
}
En enhetsklient bör skicka telemetrin som JSON som ser ut som i följande exempel. Möjliga värden är 0, 1och 2 som visas i IoT Central som Item1, Item2och Item3:
{ "EnumTelemetry": 1 }
Följande kodfragment från en enhetsmodell visar definitionen av en Object telemetrityp. Det här objektet har tre fält med typerna dateTime, integeroch Enum:
{
"@type": "Telemetry",
"displayName": {
"en": "ObjectTelemetry"
},
"name": "ObjectTelemetry",
"schema": {
"@type": "Object",
"displayName": {
"en": "Object"
},
"fields": [
{
"displayName": {
"en": "Property1"
},
"name": "Property1",
"schema": "dateTime"
},
{
"displayName": {
"en": "Property2"
},
"name": "Property2",
"schema": "integer"
},
{
"displayName": {
"en": "Property3"
},
"name": "Property3",
"schema": {
"@type": "Enum",
"displayName": {
"en": "Enum"
},
"valueSchema": "integer",
"enumValues": [
{
"displayName": {
"en": "Item1"
},
"enumValue": 0,
"name": "Item1"
},
{
"displayName": {
"en": "Item2"
},
"enumValue": 1,
"name": "Item2"
},
{
"displayName": {
"en": "Item3"
},
"enumValue": 2,
"name": "Item3"
}
]
}
}
]
}
}
En enhetsklient bör skicka telemetrin som JSON som ser ut som i följande exempel.
DateTime typer måste vara ISO 8061-kompatibla. Möjliga värden för Property3 är 0, 1och som visas i IoT Central som Item1, Item2och Item3:
{
"ObjectTelemetry": {
"Property1": "2020-09-09T03:36:46.195Z",
"Property2": 37,
"Property3": 2
}
}
Följande kodfragment från en enhetsmodell visar definitionen av en vector telemetrityp:
{
"@type": "Telemetry",
"displayName": {
"en": "VectorTelemetry"
},
"name": "VectorTelemetry",
"schema": "vector"
}
En enhetsklient bör skicka telemetrin som JSON som ser ut som i följande exempel:
{
"VectorTelemetry": {
"x": 74.72395045538597,
"y": 74.72395045538597,
"z": 74.72395045538597
}
}
Följande kodfragment från en enhetsmodell visar definitionen av en geopoint telemetrityp:
{
"@type": "Telemetry",
"displayName": {
"en": "GeopointTelemetry"
},
"name": "GeopointTelemetry",
"schema": "geopoint"
}
Anmärkning
Schematypen geopoint är en del av IoT Central-tillägget till DTDL. IoT Central stöder för närvarande geopoint-schematypen och platssemantisk typ för bakåtkompatibilitet.
En enhetsklient bör skicka telemetrin som JSON som ser ut som i följande exempel. IoT Central visar värdet som en pin-kod på en karta:
{
"GeopointTelemetry": {
"lat": 47.64263,
"lon": -122.13035,
"alt": 0
}
}
Händelse- och tillståndstyper
Det här avsnittet visar exempel på telemetrihändelser och tillstånd som en enhet skickar till ett IoT Central-program.
Anmärkning
Schematyperna händelse och tillstånd ingår i IoT Central-tillägget till DTDL.
Följande kodfragment från en enhetsmodell visar definitionen av en integer händelsetyp:
{
"@type": [
"Telemetry",
"Event"
],
"displayName": {
"en": "IntegerEvent"
},
"name": "IntegerEvent",
"schema": "integer"
}
En enhetsklient ska skicka händelsedata som JSON som ser ut som följande exempel:
{ "IntegerEvent": 74 }
Följande kodfragment från en enhetsmodell visar definitionen av en integer tillståndstyp:
{
"@type": [
"Telemetry",
"State"
],
"displayName": {
"en": "IntegerState"
},
"name": "IntegerState",
"schema": {
"@type": "Enum",
"valueSchema": "integer",
"enumValues": [
{
"displayName": {
"en": "Level1"
},
"enumValue": 1,
"name": "Level1"
},
{
"displayName": {
"en": "Level2"
},
"enumValue": 2,
"name": "Level2"
},
{
"displayName": {
"en": "Level3"
},
"enumValue": 3,
"name": "Level3"
}
]
}
}
En enhetsklient ska skicka tillståndet som JSON som ser ut som i följande exempel. Möjliga heltalstillståndsvärden är 1, 2eller 3:
{ "IntegerState": 2 }
Egenskaper
Mer information om namngivningsregler för DTDL-egenskaper finns i DTDL-egenskapen>. Du kan inte starta ett egenskapsnamn med hjälp av _ tecknet.
Egenskaper i komponenter
Om egenskapen definieras i en komponent omsluter du egenskapen i komponentnamnet. I följande exempel anges maxTempSinceLastReboot i komponenten thermostat2 . Markören __t anger att det här avsnittet definierar en komponent:
{
"thermostat2" : {
"__t" : "c",
"maxTempSinceLastReboot" : 38.7
}
}
Primitiva typer
Det här avsnittet visar exempel på primitiva egenskapstyper som en enhet skickar till en tjänst.
Följande kodfragment från en enhetsmodell visar definitionen av en boolean egenskapstyp:
{
"@type": "Property",
"displayName": {
"en": "BooleanProperty"
},
"name": "BooleanProperty",
"schema": "boolean",
"writable": false
}
En enhetsklient bör skicka en JSON-nyttolast som ser ut som följande exempel som en rapporterad egenskap i enhetstvillingen:
{ "BooleanProperty": false }
Följande kodfragment från en enhetsmodell visar definitionen av en long egenskapstyp:
{
"@type": "Property",
"displayName": {
"en": "LongProperty"
},
"name": "LongProperty",
"schema": "long",
"writable": false
}
En enhetsklient bör skicka en JSON-nyttolast som ser ut som följande exempel som en rapporterad egenskap i enhetstvillingen:
{ "LongProperty": 439 }
Följande kodfragment från en enhetsmodell visar definitionen av en date egenskapstyp:
{
"@type": "Property",
"displayName": {
"en": "DateProperty"
},
"name": "DateProperty",
"schema": "date",
"writable": false
}
En enhetsklient bör skicka en JSON-nyttolast som liknar följande exempel och rapportera det som en egenskap i enhetens tvilling.
Date typer måste vara ISO 8061-kompatibla:
{ "DateProperty": "2020-05-17" }
Följande kodfragment från en enhetsmodell visar definitionen av en duration egenskapstyp:
{
"@type": "Property",
"displayName": {
"en": "DurationProperty"
},
"name": "DurationProperty",
"schema": "duration",
"writable": false
}
En enhetsklient ska skicka en JSON-nyttolast som ser ut som följande exempel som en rapporterad egenskap i enhetstvillingen – varaktigheten måste vara ISO 8601 varaktighetskompatibel.
{ "DurationProperty": "PT10H24M6.169083011336625S" }
Följande kodfragment från en enhetsmodell visar definitionen av en float egenskapstyp:
{
"@type": "Property",
"displayName": {
"en": "FloatProperty"
},
"name": "FloatProperty",
"schema": "float",
"writable": false
}
En enhetsklient bör skicka en JSON-nyttolast som ser ut som följande exempel som en rapporterad egenskap i enhetstvillingen:
{ "FloatProperty": 1.9 }
Följande kodfragment från en enhetsmodell visar definitionen av en string egenskapstyp:
{
"@type": "Property",
"displayName": {
"en": "StringProperty"
},
"name": "StringProperty",
"schema": "string",
"writable": false
}
En enhetsklient bör skicka en JSON-nyttolast som ser ut som följande exempel som en rapporterad egenskap i enhetstvillingen:
{ "StringProperty": "A string value - could be a URL" }
Komplexa typer
Det här avsnittet visar exempel på komplexa egenskapstyper som en enhet skickar till en tjänst.
Följande kodfragment från en enhetsmodell visar definitionen av en Enum egenskapstyp:
{
"@type": "Property",
"displayName": {
"en": "EnumProperty"
},
"name": "EnumProperty",
"writable": false,
"schema": {
"@type": "Enum",
"displayName": {
"en": "Enum"
},
"valueSchema": "integer",
"enumValues": [
{
"displayName": {
"en": "Item1"
},
"enumValue": 0,
"name": "Item1"
},
{
"displayName": {
"en": "Item2"
},
"enumValue": 1,
"name": "Item2"
},
{
"displayName": {
"en": "Item3"
},
"enumValue": 2,
"name": "Item3"
}
]
}
}
En enhetsklient bör skicka en JSON-nyttolast som ser ut som följande exempel som en rapporterad egenskap i enhetstvillingen. Möjliga värden är 0, 1och som visas i IoT Central som Item1, Item2och Item3:
{ "EnumProperty": 1 }
Följande kodfragment från en enhetsmodell visar definitionen av en Object egenskapstyp. Det här objektet har två fält med typer string och integer:
{
"@type": "Property",
"displayName": {
"en": "ObjectProperty"
},
"name": "ObjectProperty",
"writable": false,
"schema": {
"@type": "Object",
"displayName": {
"en": "Object"
},
"fields": [
{
"displayName": {
"en": "Field1"
},
"name": "Field1",
"schema": "integer"
},
{
"displayName": {
"en": "Field2"
},
"name": "Field2",
"schema": "string"
}
]
}
}
En enhetsklient bör skicka en JSON-nyttolast som ser ut som följande exempel som en rapporterad egenskap i enhetstvillingen:
{
"ObjectProperty": {
"Field1": 37,
"Field2": "A string value"
}
}
Följande kodfragment från en enhetsmodell visar definitionen av en vector egenskapstyp:
{
"@type": "Property",
"displayName": {
"en": "VectorProperty"
},
"name": "VectorProperty",
"schema": "vector",
"writable": false
}
En enhetsklient bör skicka en JSON-nyttolast som ser ut som följande exempel som en rapporterad egenskap i enhetstvillingen:
{
"VectorProperty": {
"x": 74.72395045538597,
"y": 74.72395045538597,
"z": 74.72395045538597
}
}
Följande kodfragment från en enhetsmodell visar definitionen av en geopoint egenskapstyp:
{
"@type": "Property",
"displayName": {
"en": "GeopointProperty"
},
"name": "GeopointProperty",
"schema": "geopoint",
"writable": false
}
Anmärkning
Schematypen geopoint är en del av IoT Central-tillägget till DTDL. IoT Central stöder för närvarande geopoint-schematypen och platssemantisk typ för bakåtkompatibilitet.
En enhetsklient bör skicka en JSON-nyttolast som ser ut som följande exempel som en rapporterad egenskap i enhetstvillingen:
{
"GeopointProperty": {
"lat": 47.64263,
"lon": -122.13035,
"alt": 0
}
}
Skrivbara egenskapstyper
Det här avsnittet visar exempel på skrivbara egenskapstyper som en enhet tar emot från en tjänst.
Om den skrivbara egenskapen definieras i en komponent innehåller det önskade egenskapsmeddelandet komponentnamnet. I följande exempel visas meddelandet som begär att enheten ska uppdatera targetTemperature i komponenten thermostat2 . Markören __t anger att det här avsnittet definierar en komponent:
{
"thermostat2": {
"targetTemperature": {
"value": 57
},
"__t": "c"
},
"$version": 3
}
Enheten eller modulen bör bekräfta att den tog emot egenskapen genom att skicka en rapporterad egenskap. Den rapporterade egenskapen bör innehålla:
-
value– det faktiska värdet för egenskapen (vanligtvis det mottagna värdet, men enheten kan välja att rapportera ett annat värde). -
ac– en bekräftelsekod som använder en HTTP-statuskod. -
av– en bekräftelseversion som refererar till den$versionönskade egenskapen. Du hittar det här värdet i den önskade egenskapens JSON-payload. -
ad– en valfri bekräftelsebeskrivning.
Mer information om dessa fält finns i IoT Plug and Play-konventioner > Bekräftelsesvar
Följande kodfragment från en enhetsmodell visar definitionen av en skrivbar string egenskapstyp:
{
"@type": "Property",
"displayName": {
"en": "StringPropertyWritable"
},
"name": "StringPropertyWritable",
"writable": true,
"schema": "string"
}
Enheten tar emot följande nyttolast från tjänsten:
{
"StringPropertyWritable": "A string from IoT Central", "$version": 7
}
Enheten bör skicka följande JSON-nyttolast till tjänsten när den har bearbetat uppdateringen. Det här meddelandet innehåller versionsnumret för den ursprungliga uppdateringen som togs emot från tjänsten.
Tips/Råd
Om tjänsten är IoT Central markerar den egenskapen som synkroniserad i användargränssnittet när den tar emot det här meddelandet:
{
"StringPropertyWritable": {
"value": "A string from IoT Central",
"ac": 200,
"ad": "completed",
"av": 7
}
}
Följande kodfragment från en enhetsmodell visar definitionen av en skrivbar Enum egenskapstyp:
{
"@type": "Property",
"displayName": {
"en": "EnumPropertyWritable"
},
"name": "EnumPropertyWritable",
"writable": true,
"schema": {
"@type": "Enum",
"displayName": {
"en": "Enum"
},
"valueSchema": "integer",
"enumValues": [
{
"displayName": {
"en": "Item1"
},
"enumValue": 0,
"name": "Item1"
},
{
"displayName": {
"en": "Item2"
},
"enumValue": 1,
"name": "Item2"
},
{
"displayName": {
"en": "Item3"
},
"enumValue": 2,
"name": "Item3"
}
]
}
}
Enheten tar emot följande nyttolast från tjänsten:
{
"EnumPropertyWritable": 1 , "$version": 10
}
Enheten bör skicka följande JSON-nyttolast till tjänsten när den har bearbetat uppdateringen. Det här meddelandet innehåller versionsnumret för den ursprungliga uppdateringen som togs emot från tjänsten.
Tips/Råd
Om tjänsten är IoT Central markerar den egenskapen som synkroniserad i användargränssnittet när den tar emot det här meddelandet:
{
"EnumPropertyWritable": {
"value": 1,
"ac": 200,
"ad": "completed",
"av": 10
}
}
Kommandon
Mer information om namngivningsregler för DTDL-kommandon finns i DTDL-kommandot>. Du kan inte starta ett kommandonamn med hjälp av _ tecknet.
Om kommandot definieras i en komponent innehåller namnet på kommandot som enheten tar emot komponentnamnet. Om kommandot till exempel anropas getMaxMinReport och komponenten heter thermostat2tar enheten emot en begäran om att köra ett kommando med namnet thermostat2*getMaxMinReport.
Följande kodfragment från en enhetsmodell visar definitionen av ett kommando som inte har några parametrar och som inte förväntar sig att enheten ska returnera något:
{
"@type": "Command",
"displayName": {
"en": "CommandBasic"
},
"name": "CommandBasic"
}
Enheten får en tom nyttolast i begäran och bör returnera en tom nyttolast i svaret med en 200 HTTP-svarskod för att indikera att den lyckades.
Följande kodfragment från en enhetsmodell visar definitionen av ett kommando som har en heltalsparameter och som förväntar sig att enheten returnerar ett heltalsvärde:
{
"@type": "Command",
"request": {
"@type": "CommandPayload",
"displayName": {
"en": "RequestParam"
},
"name": "RequestParam",
"schema": "integer"
},
"response": {
"@type": "CommandPayload",
"displayName": {
"en": "ResponseParam"
},
"name": "ResponseParam",
"schema": "integer"
},
"displayName": {
"en": "CommandSimple"
},
"name": "CommandSimple"
}
Enheten tar emot ett heltalsvärde som nyttolast i förfrågan. Enheten ska returnera ett heltalsvärde som svarsnyttolast med en 200 HTTP-svarskod för att indikera framgång.
Följande kodfragment från en enhetsmodell visar definitionen av ett kommando som har en objektparameter och som förväntar sig att enheten returnerar ett objekt. I det här exemplet har båda objekten heltals- och strängfält:
{
"@type": "Command",
"request": {
"@type": "CommandPayload",
"displayName": {
"en": "RequestParam"
},
"name": "RequestParam",
"schema": {
"@type": "Object",
"displayName": {
"en": "Object"
},
"fields": [
{
"displayName": {
"en": "Field1"
},
"name": "Field1",
"schema": "integer"
},
{
"displayName": {
"en": "Field2"
},
"name": "Field2",
"schema": "string"
}
]
}
},
"response": {
"@type": "CommandPayload",
"displayName": {
"en": "ResponseParam"
},
"name": "ResponseParam",
"schema": {
"@type": "Object",
"displayName": {
"en": "Object"
},
"fields": [
{
"displayName": {
"en": "Field1"
},
"name": "Field1",
"schema": "integer"
},
{
"displayName": {
"en": "Field2"
},
"name": "Field2",
"schema": "string"
}
]
}
},
"displayName": {
"en": "CommandComplex"
},
"name": "CommandComplex"
}
Följande utdrag visar ett exempel på begärans nyttolast som skickas till enheten:
{ "Field1": 56, "Field2": "A string value" }
Följande kodfragment visar ett exempel på svarsnyttolast som skickas från enheten. Använd en 200 HTTP-svarskod för att indikera att det lyckades:
{ "Field1": 87, "Field2": "Another string value" }
Tips/Råd
IoT Central har egna konventioner för att implementera långvariga kommandon och offlinekommandon.
Nästa steg
Nu när du har lärt dig om enhetsnyttolaster är ett förslag till nästa steg att läsa Enhetsutvecklarguiden.