Postup vzdáleného restartování Azure Sphere pomocí přímých metod Azure IoT

Dokončeno

V této lekci se dozvíte, jak provést vzdálené restartování Azure Sphere z Azure IoT Central.

Vysvětlení příkazů IoT Central

Azure IoT Central používá k vyvolání akce na zařízení příkazy. 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.

Řešení IoT Central je postavené na službě Azure IoT Hub a odesílá příkazy do zařízení pomocí přímých metod IoT Hubu. 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

Na kartě příkazů pro zařízení IoT Central můžete vyvolat příkaz k restartování zařízení. Musíte nastavit dobu v sekundách, po kterou bude zařízení čekat, než se restartuje. Azure IoT Central vyžaduje, aby služba Azure IoT Hub poslala 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. IoT Central může zobrazit historii příkazů, které byly vyvolány v Azure Sphere.

The illustration shows a device twin configuration pattern.

Postup restartování Azure Sphere v IoT Central

Následující postup popisuje, jak příkazy Azure IoT Central používají přímé metody Azure IoT Hubu Direct pro řízení typu cloud-zařízení.

  1. Na kartě příkazů pro zařízení Azure IoT Central vyvolejte příkaz Restartovat zařízení. IoT Central pak požádá IoT Hub o odeslání zprávy přímé metody do zařízení.
  2. Ve službě Azure Sphere se zavolá funkce RestartDeviceHandler.
  3. 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í.
  4. Přímá metoda reaguje pomocí stavového kódu HTTP a zprávy s odpovědí.
  5. Pak proběhne restartování Azure Sphere.
  6. Azure IoT Central zadá dotaz a zobrazí vlastnost ReportedRestartUTC daného zařízení.

Začínáme s vazbami přímých metod

Vzpomeňte si, že příkazy Azure IoT Central se implementují pomocí přímých metod služby Azure IoT Hub. Vazba přímé metody namapuje název přímé metody 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 Azure IoT Central RestartDevice 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();

Příkazy Azure IoT Central

Příkazy IoT Central se definují v rozhraní šablon zařízení. V tomto příkladu je typ schématu příkazu RestartDeviceInteger. Datová část přímé metody je typ integer, který definuje počet sekund do restartování zařízení. Název příkazu se musí shodovat s deklarací vazby přímé metody RestartDevice v Azure Sphere.

The illustration shows a device template interface.