Jak vzdáleně restartovat zařízení Azure Sphere pomocí přímé metody Azure IoT Hubu

Dokončeno

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.

The illustration shows a device twin configuration pattern.

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í.

  1. V Azure IoT Exploreru můžete vyvolat příkaz přímé metody IoT Hubu Restart Device (Restartovat zařízení).
  2. Azure IoT Hub potom pošle zařízení zprávu příkazu přímé metody.
  3. Ve službě Azure Sphere se zavolá funkce RestartDeviceHandler.
  4. 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í.
  5. Přímá metoda reaguje pomocí stavového kódu HTTP a zprávy s odpovědí.
  6. Pak proběhne restartování Azure Sphere.
  7. 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();