Registrace komponent ve službě Device Update
Tento článek ukazuje ukázkovou implementaci enumerátoru komponenty služby Device Update pro IoT Hub. Na tento příklad můžete odkazovat a implementovat vlastní výčet komponent pro vaše zařízení IoT. Komponenta je identita pod úrovní zařízení, která má vztah složení s hostitelským zařízením.
Tento článek ukazuje výčet komponent pomocí virtuálního zařízení IoT s názvem Virtuální vakuum Contoso. Enumerátory komponent se používají k implementaci funkce aktualizace proxy serveru.
Aktualizace proxy serveru umožňuje aktualizovat více komponent na stejném zařízení IoT nebo několika senzorech připojených k zařízení IoT s jedním nasazením přes vzduch. Aktualizace proxy serveru podporuje pořadí instalace pro aktualizace součástí. Podporuje také vícekrokové aktualizace s před instalací, instalací a možnostmi po instalaci.
Případy použití, kdy se používají aktualizace proxy serveru, patří:
- Cílení na konkrétní aktualizační soubory na oddíly v zařízení
- Cílení konkrétních aktualizačních souborů na aplikace nebo komponenty v zařízení
- Cílení konkrétních aktualizačních souborů na senzory připojené k zařízením IoT přes síťový protokol (například SBĚRNICE USB nebo CAN).
Další informace naleznete v tématu Aktualizace proxy serveru a aktualizace více komponent.
Agent Aktualizace zařízení běží na hostitelském zařízení. Může každou aktualizaci odeslat konkrétní komponentě nebo skupině komponent stejné hardwarové třídy (to znamená, že vyžaduje stejnou aktualizaci softwaru nebo firmwaru).
Co je výčet komponent?
Enumerátor součástí je rozšíření pro agenta Device Update, který poskytuje informace o každé komponentě, kterou potřebujete pro bezdrátovou aktualizaci prostřednictvím připojení Azure IoT Hub hostitelského zařízení.
Agent Device Update je nezávislý na zařízení a komponentách. Agent sám o komponentách (nebo připojených) hostitelském zařízení v době aktualizace nezná nic.
Aby bylo možné povolit aktualizace proxy serveru, musí tvůrci zařízení identifikovat všechny komponenty v zařízení, které je možné aktualizovat, a přiřadit každému komponentě jedinečný název. Název skupiny lze také přiřadit komponentám stejné třídy hardwaru, aby stejnou aktualizaci bylo možné nainstalovat na všechny komponenty ve stejné skupině. Obslužná rutina obsahu aktualizace pak může nainstalovat a použít aktualizaci na správné součásti.
Tady jsou povinnosti každé části toku aktualizace proxy serveru:
Tvůrce zařízení
Navrhujte a sestavte zařízení.
Integrujte agenta Device Update a jeho závislosti.
Implementujte rozšíření enumerátoru pro konkrétní zařízení a zaregistrujte se v agentu Device Update.
Enumerátor komponenty používá informace z inventáře součástí nebo konfiguračního souboru k rozšíření dat statických komponent (vyžaduje se aktualizace zařízení) dynamickými daty (například verze firmwaru, stav připojení a identita hardwaru).
Vytvořte aktualizaci proxy serveru, která obsahuje jednu nebo více podřízených aktualizací, které cílí na jednu nebo více komponent v zařízení (nebo k němu připojené).
Odešlete aktualizaci operátoru řešení.
Operátor řešení
Naimportujte aktualizaci a manifest do služby Device Update.
Nasaďte aktualizaci do skupiny zařízení.
Agent aktualizace zařízení
Získejte informace o aktualizaci ze služby IoT Hub prostřednictvím dvojčete zařízení nebo dvojčete modulu.
Vyvolá obslužnou rutinu kroků pro zpracování aktualizace proxy serveru určené pro jednu nebo více komponent v zařízení.
Příklad v tomto článku obsahuje dvě aktualizace:
host-fw-1.1
amotors-fw-1.1
. Pro každou podřízenou aktualizaci vyvolá obslužná rutina nadřazených kroků obslužnou rutinu podřízených kroků k vytvoření výčtu všech komponent, které odpovídajíCompatibilities
vlastnostem zadaným v souboru manifestu podřízené aktualizace. Dále obslužná rutina stáhne, nainstaluje a použije podřízenou aktualizaci na všechny cílové komponenty.Pokud chcete získat odpovídající komponenty, podřízená aktualizace volá
SelectComponents
rozhraní API poskytované enumerátorem komponenty. Pokud neexistují žádné odpovídající komponenty, podřízená aktualizace se přeskočí.Shromážděte všechny výsledky aktualizací z nadřazených a podřízených aktualizací a nahlašte tyto výsledky do IoT Hubu.
Obslužná rutina podřízených kroků
- Iterujte seznamem instancí komponent, které jsou kompatibilní s podřízeným obsahem aktualizace. Další informace naleznete v tématu Kroky obslužné rutiny.
V produkčním prostředí můžou tvůrci zařízení používat existující obslužné rutiny nebo implementovat vlastní obslužnou rutinu, která vyvolá jakýkoli instalační program potřebný k aktualizaci přes vzduch. Další informace naleznete v tématu Implementace vlastní aktualizační obslužné rutiny obsahu.
Virtuální vakuové komponenty
V tomto článku používáme virtuální zařízení IoT k předvedení klíčových konceptů a funkcí. Virtuální vakuové zařízení Contoso se skládá z pěti logických komponent:
- Firmware hostitele
- Hostitelský spouštěcí systém souborů
- Systém hostitelských kořenových souborů
- Tři motory (levé kolo, pravé kolo a vakuum)
- Dvě kamery (přední a zadní)
Následující adresářová struktura simuluje komponenty:
/usr/local/contoso-devices/vacuum-1/hostfw
/usr/local/contoso-devices/vacuum-1/bootfs
/usr/local/contoso-devices/vacuum-1/rootfs
/usr/local/contoso-devices/vacuum-1/motors/0 /* left motor */
/usr/local/contoso-devices/vacuum-1/motors/1 /* right motor */
/usr/local/contoso-devices/vacuum-1/motors/2 /* vacuum motor */
/usr/local/contoso-devices/vacuum-1/cameras/0 /* front camera */
/usr/local/contoso-devices/vacuum-1/cameras/1 /* rear camera */
Adresář každé komponenty obsahuje soubor JSON, který ukládá číslo napodobené verze softwaru každé komponenty. Ukázkové soubory JSON jsou firmware.json a diskimage.json.
V této ukázce budeme kvůli aktualizaci firmwaru komponent kopírovat firmware.json nebo diskimage.json (aktualizovat datovou část) do adresáře cílových komponent.
Tady je příklad souboru firmware.json :
{
"version": "0.5",
"description": "This component is generated for testing purposes."
}
Poznámka:
Společnost Contoso Virtual Vacuum obsahuje verze softwaru nebo firmwaru pro účely předvedení aktualizace proxy serveru. Neposkytuje žádné další funkce.
Implementace enumerátoru komponent (jazyk C)
Požadavky
Implementujte všechna rozhraní API deklarovaná v component_enumerator_extension.hpp:
Function | Argumenty | Návraty |
---|---|---|
char* GetAllComponents() |
Nic | Řetězec JSON, který obsahuje pole všech ComponentInfo hodnot. Další informace najdete v tématu Příklad návratových hodnot. |
char* SelectComponents(char* selector) |
Řetězec JSON, který obsahuje jeden nebo více párů názvů a hodnot používaných pro výběr cílových komponent aktualizace | Řetězec JSON, který obsahuje pole ComponentInfo hodnot. Další informace najdete v tématu Příklad návratových hodnot. |
void FreeComponentsDataString(char* string) |
Ukazatel na vyrovnávací paměť řetězce vrácenou dříve funkcemi GetAllComponents SelectComponents |
Nic |
ComponentInfo
Řetězec ComponentInfo
JSON musí obsahovat následující vlastnosti:
Name | Typ | Description |
---|---|---|
id |
string | Jedinečná identita komponenty (obor zařízení). Mezi příklady patří sériové číslo hardwaru, ID oddílu disku a jedinečná cesta k souboru komponenty. |
name |
string | Logický název komponenty. Tato vlastnost je název, který tvůrce zařízení přiřadí komponentě, která je k dispozici v každém zařízení stejné device třídy.Například každé zařízení Contoso Virtual Vacuum obsahuje motor, který řídí levé kolo. Společnost Contoso přiřadil levý motor jako běžný (logický) název tohoto motoru, který umožňuje snadno odkazovat na tuto komponentu místo ID hardwaru, což může být globálně jedinečné. |
group |
string | Skupina, do které tato komponenta patří. Například všechny motory můžou patřit do skupiny motorů . |
manufacturer |
string | Pro fyzickou hardwarovou komponentu je tato vlastnost výrobcem nebo názvem dodavatele. Pro logickou komponentu, například diskový oddíl nebo adresář, může být definovaná hodnota libovolného tvůrce zařízení. |
model |
string | Pro fyzickou hardwarovou komponentu je tato vlastnost název modelu. Pro logickou komponentu, například diskový oddíl nebo adresář, může být tato vlastnost definovaná hodnotou libovolného tvůrce zařízení. |
properties |
objekt | Objekt JSON, který obsahuje volitelné vlastnosti specifické pro zařízení. |
Tady je příklad ComponentInfo
kódu založeného na komponentách virtuálního vakua Contoso:
{
"id": "contoso-motor-serial-00000",
"name": "left-motor",
"group": "motors",
"manufacturer": "contoso",
"model": "virtual-motor",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/motors\/0",
"firmwareDataFile": "firmware.json",
"status": "connected",
"version" : "motor-fw-1.0"
}
}
Příklad návratových hodnot
Následuje dokument JSON vrácený z GetAllComponents
funkce. Je založená na ukázkové implementaci enumerátoru komponenty Contoso Virtual Vacuum.
{
"components": [
{
"id": "hostfw",
"name": "hostfw",
"group": "firmware",
"manufacturer": "contoso",
"model": "virtual-firmware",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/hostfw",
"firmwareDataFile": "firmware.json",
"status": "ok",
"version" : "host-fw-1.0"
}
},
{
"id": "bootfs",
"name": "bootfs",
"group": "boot-image",
"manufacturer": "contoso",
"model": "virtual-disk",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/bootfs",
"firmwareDataFile": "diskimage.json",
"status": "ok",
"version" : "boot-fs-1.0"
}
},
{
"id": "rootfs",
"name": "rootfs",
"group": "os-image",
"manufacturer": "contoso",
"model": "virtual-os",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/rootfs",
"firmwareDataFile": "diskimage.json",
"status": "ok",
"version" : "root-fs-1.0"
}
},
{
"id": "contoso-motor-serial-00000",
"name": "left-motor",
"group": "motors",
"manufacturer": "contoso",
"model": "virtual-motor",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/motors\/0",
"firmwareDataFile": "firmware.json",
"status": "ok",
"version" : "motor-fw-1.0"
}
},
{
"id": "contoso-motor-serial-00001",
"name": "right-motor",
"group": "motors",
"manufacturer": "contoso",
"model": "virtual-motor",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/motors\/1",
"firmwareDataFile": "firmware.json",
"status": "ok",
"version" : "motor-fw-1.0"
}
},
{
"id": "contoso-motor-serial-00002",
"name": "vacuum-motor",
"group": "motors",
"manufacturer": "contoso",
"model": "virtual-motor",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/motors\/2",
"firmwareDataFile": "firmware.json",
"status": "ok",
"version" : "motor-fw-1.0"
}
},
{
"id": "contoso-camera-serial-00000",
"name": "front-camera",
"group": "cameras",
"manufacturer": "contoso",
"model": "virtual-camera",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/camera\/0",
"firmwareDataFile": "firmware.json",
"status": "ok",
"version" : "camera-fw-1.0"
}
},
{
"id": "contoso-camera-serial-00001",
"name": "rear-camera",
"group": "cameras",
"manufacturer": "contoso",
"model": "virtual-camera",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/camera\/1",
"firmwareDataFile": "firmware.json",
"status": "ok",
"version" : "camera-fw-1.0"
}
}
]
}
Následující dokument JSON se vrátí z SelectComponents
funkce. Je založená na ukázkové implementaci enumerátoru komponenty Contoso.
Tady je vstupní parametr pro výběr skupiny komponent motorů :
{
"group" : "motors"
}
Tady je výstup parametru. Všechny komponenty patří do skupiny motorů .
{
"components": [
{
"id": "contoso-motor-serial-00000",
"name": "left-motor",
"group": "motors",
"manufacturer": "contoso",
"model": "virtual-motor",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/motors\/0",
"firmwareDataFile": "firmware.json",
"status": "ok",
"version" : "motor-fw-1.0"
}
},
{
"id": "contoso-motor-serial-00001",
"name": "right-motor",
"group": "motors",
"manufacturer": "contoso",
"model": "virtual-motor",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/motors\/1",
"firmwareDataFile": "firmware.json",
"status": "ok",
"version" : "motor-fw-1.0"
}
},
{
"id": "contoso-motor-serial-00002",
"name": "vacuum-motor",
"group": "motors",
"manufacturer": "contoso",
"model": "virtual-motor",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/motors\/2",
"firmwareDataFile": "firmware.json",
"status": "ok",
"version" : "motor-fw-1.0"
}
}
]
}
Tady je vstupní parametr pro výběr jedné komponenty s názvem hostfw:
{
"name" : "hostfw"
}
Tady je výstup parametru pro komponentu hostfw :
{
"components": [
{
"id": "hostfw",
"name": "hostfw",
"group": "firmware",
"manufacturer": "contoso",
"model": "virtual-firmware",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/hostfw",
"firmwareDataFile": "firmware.json",
"status": "ok",
"version" : "host-fw-1.0"
}
}
]
}
Poznámka:
Předchozí příklad ukázal, že v případě potřeby je možné odeslat novější aktualizaci na libovolnou instanci komponenty, která je vybrána vlastností name
. Například nasaďte motor-fw-2.0
aktualizaci na vakuový motor a pokračujte v používání motor-fw-1.0
na levém a pravém motoru.
Inventarizační soubor
Ukázková implementace uvedená dříve pro enumerátor virtuálních součástí Contoso virtual Vacuum načte informace o komponentách specifických pro zařízení ze souboru component-inventory.json . Tato ukázková implementace je určena pouze pro demonstrační účely.
V produkčním scénáři by se některé vlastnosti měly načíst přímo ze skutečných součástí. Mezi tyto vlastnosti patří id
, manufacturer
a model
.
Tvůrce zařízení definuje name
vlastnosti a group
vlastnosti. Tyto hodnoty by se neměly po definování měnit. Vlastnost name
musí být v rámci zařízení jedinečná.
Příklad souboru component-inventory.json
Poznámka:
Obsah v tomto souboru vypadá téměř stejně jako vrácená hodnota funkce GetAllComponents
. ComponentInfo
V tomto souboru ale neobsahuje version
a status
vlastnosti. Enumerátor komponenty naplní tyto vlastnosti za běhu.
Například pro hostfw se hodnota vlastnosti properties.version
naplní ze zadané hodnoty (napodobení) firmwareDataFile
(/usr/local/contoso-devices/vacuum-1/hostfw/firmware.json).
{
"components": [
{
"id": "hostfw",
"name": "hostfw",
"group": "firmware",
"manufacturer": "contoso",
"model": "virtual-firmware",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/hostfw",
"firmwareDataFile": "firmware.json",
}
},
{
"id": "bootfs",
"name": "bootfs",
"group": "boot-image",
"manufacturer": "contoso",
"model": "virtual-disk",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/bootfs",
"firmwareDataFile": "diskimage.json",
}
},
{
"id": "rootfs",
"name": "rootfs",
"group": "os-image",
"manufacturer": "contoso",
"model": "virtual-os",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/rootfs",
"firmwareDataFile": "diskimage.json",
}
},
{
"id": "contoso-motor-serial-00000",
"name": "left-motor",
"group": "motors",
"manufacturer": "contoso",
"model": "virtual-motor",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/motors\/0",
"firmwareDataFile": "firmware.json",
}
},
{
"id": "contoso-motor-serial-00001",
"name": "right-motor",
"group": "motors",
"manufacturer": "contoso",
"model": "virtual-motor",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/motors\/1",
"firmwareDataFile": "firmware.json",
}
},
{
"id": "contoso-motor-serial-00002",
"name": "vacuum-motor",
"group": "motors",
"manufacturer": "contoso",
"model": "virtual-motor",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/motors\/2",
"firmwareDataFile": "firmware.json",
}
},
{
"id": "contoso-camera-serial-00000",
"name": "front-camera",
"group": "cameras",
"manufacturer": "contoso",
"model": "virtual-camera",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/camera\/0",
"firmwareDataFile": "firmware.json",
}
},
{
"id": "contoso-camera-serial-00001",
"name": "rear-camera",
"group": "cameras",
"manufacturer": "contoso",
"model": "virtual-camera",
"properties": {
"path": "\/usr\/local\/contoso-devices\/vacuum-1\/camera\/1",
"firmwareDataFile": "firmware.json",
}
}
]
}
Další kroky
Příklad v tomto článku byl použit jazyk C. Pokud chcete prozkoumat ukázkové zdrojové kódy C++, přečtěte si:
Různé ukázkové aktualizace komponent připojených k zařízení Contoso Virtual Vacuum najdete v ukázce aktualizace proxy serveru.