Jak vzdáleně restartovat zařízení Azure Sphere pomocí přímé metody Azure IoT Hubu
V této lekci se dozvíte, jak provést vzdálené restartování Azure Sphere z Azure IoT Exploreru.
Porozumění příkazům přímé metody IoT Hubu
Azure IoT Hub používá k vyvolání akce na zařízení příkazy přímé metody. Příkazy se často používají k interaktivnímu ovládání zařízení, jako je zapnutí ventilátoru, světla nebo k restartování Azure Sphere, což si ukážeme v této lekci.
Přímé metody IoT Hubu představují interakci typu požadavek-odpověď se zařízením, která je podobná volání HTTP v tom, že je ihned (po uplynutí časového limitu zadaného uživatelem) úspěšná nebo neúspěšná. Tento přístup je užitečný v případě scénářů, kdy se průběh okamžité akce liší podle toho, jestli zařízení bylo schopné reagovat.
Poznámka:
Existuje několik důvodů, proč je někdy potřeba vzdáleně restartovat Azure Sphere. Certifikáty zařízení, aktualizace operačního systému a aktualizace aplikací se provádějí po dobu 24 hodin nebo po restartování zařízení. Může existovat provozní důvod, proč je nutné restartovat zařízení, aby se vynutila aktualizace.
Vzdálené restartování Azure Sphere
V IoT Exploreru můžete vyvolat příkaz přímé metody, kterým restartujete zařízení. Musíte nastavit dobu v sekundách, po kterou bude zařízení čekat, než se restartuje. Azure IoT Hub pošle do zařízení zprávu přímé metody s volitelnou datovou částí. Zařízení odpoví stavovým kódem a případně se zobrazí zpráva s oznámením o úspěšném nebo neúspěšném provedení příkazu.
Postup restartování Azure Sphere v IoT Exploreru
Následující postup popisuje, jak se používají přímé metody Azure IoT Exploreru a Azure IoT Hubu k řízení typu cloud-zařízení.
- V Azure IoT Exploreru můžete vyvolat příkaz přímé metody IoT Hubu Restart Device (Restartovat zařízení).
- Azure IoT Hub potom pošle zařízení zprávu příkazu přímé metody.
- Ve službě Azure Sphere se zavolá funkce RestartDeviceHandler.
- Dále zařízení pošle dvojčeti zařízení zprávu ReportedRestartUTC do služby Azure IoT, aby se zaznamenal čas restartování zařízení.
- Přímá metoda reaguje pomocí stavového kódu HTTP a zprávy s odpovědí.
- Pak proběhne restartování Azure Sphere.
- Azure IoT Explorer zadá dotaz a zobrazí vlastnost ReportedRestartUTC daného zařízení.
Začínáme s vazbami přímých metod
Vazba přímé metody namapuje název příkazu přímé metody IoT Hubu pomocí funkce obslužné rutiny, která se zavolá k implementaci akce.
V následujícím příkladu se deklaruje vazba přímé metody za účelem restartování služby Azure Sphere. Tato deklarace namapuje příkaz RestartDevice
přímé metody Azure IoT Hubu na funkci obslužné rutiny s názvem RestartDeviceHandler
.
static LP_DIRECT_METHOD_BINDING dm_restartDevice = {
.methodName = "RestartDevice",
.handler = RestartDeviceHandler };
Vzdálené restartování Azure Sphere
Následuje implementace funkce obslužné rutiny RestartDeviceHandler
. Funkce obslužné rutiny se volá, když zařízení z Azure IoT Hubu dostane zprávu s názvem RestartDevice
.
/// <summary>
/// Start Device Power Restart Direct Method 'ResetMethod' integer seconds eg 5
/// </summary>
static LP_DIRECT_METHOD_RESPONSE_CODE RestartDeviceHandler(JSON_Value* json, LP_DIRECT_METHOD_BINDING* directMethodBinding, char** responseMsg)
{
const size_t responseLen = 60; // Allocate and initialize a response message buffer. The calling function is responsible for the freeing memory
static struct timespec period;
*responseMsg = (char*)malloc(responseLen);
memset(*responseMsg, 0, responseLen);
if (json_value_get_type(json) != JSONNumber) { return LP_METHOD_FAILED; }
int seconds = (int)json_value_get_number(json);
// leave enough time for the device twin dt_reportedRestartUtc to update before restarting the device
if (seconds > 2 && seconds < 10)
{
// Report Device Restart UTC
lp_deviceTwinReportState(&dt_reportedRestartUtc, lp_getCurrentUtc(msgBuffer, sizeof(msgBuffer))); // LP_TYPE_STRING
// Create Direct Method Response
snprintf(*responseMsg, responseLen, "%s called. Restart in %d seconds", directMethodBinding->methodName, seconds);
// Set One Shot LP_TIMER
period = (struct timespec){ .tv_sec = seconds, .tv_nsec = 0 };
lp_timerOneShotSet(&restartDeviceOneShotTimer, &period);
return LP_METHOD_SUCCEEDED;
}
else
{
snprintf(*responseMsg, responseLen, "%s called. Restart Failed. Seconds out of range: %d", directMethodBinding->methodName, seconds);
return LP_METHOD_FAILED;
}
}
Funkce PowerControls služby Azure Sphere
Funkce RestartDeviceHandler nastaví jednorázový časovač pro spuštění, který vyvolá funkci DelayRestartDeviceTimerHandler po zadané době restartování měřené v sekundách. Ve funkci DelayRestartDeviceTimerHandler je provedeno volání rozhraní API PowerManagement_ForceSystemReboot. Rozhraní API PowerManagement_ForceSystemReboot vyžaduje deklaraci funkce PowerControls v souboru app_manifest.json.
"PowerControls": [
"ForceReboot"
]
Postup mapování přímých metod na obslužné rutiny
Všechny deklarované vazby přímých metod musí být přidány s odkazem na pole directMethodBindingSet. Když zařízení přijme zprávu přímé metody z Azure IoT Hubu, hledá se v poli directMethodBindingSet odpovídající název methodName. Když je nalezena shoda, je volána odpovídající funkce obslužné rutiny.
LP_DIRECT_METHOD_BINDING* directMethodBindingSet[] = { &dm_restartDevice };
Otevření sady vazeb přímé metody
Sada vazeb přímé metody se inicializuje ve funkci InitPeripheralsAndHandlers v souboru main.c.
lp_directMethodSetOpen(directMethodBindingSet, NELEMS(directMethodBindingSet));
Zavření sady vazeb přímé metody
Sada vazeb přímé metody se zavírá ve funkci ClosePeripheralsAndHandlers v souboru main.c.
lp_directMethodSetClose();