Remoteneustart Ihres Azure Sphere-Geräts mit einer direkten Methode von Azure IoT Hub

Abgeschlossen

In dieser Lerneinheit erfahren Sie, wie Sie ein Azure Sphere-Gerät im Azure IoT-Explorer remote neu starten.

Grundlegendes zu Befehlen der direkten Methode von IoT Hub

Azure IoT Hub verwendet Befehle der direkten Methode zum Aufrufen einer Aktion auf einem Gerät. Befehle werden häufig für die interaktive Steuerung von Geräten verwendet. Beispiele hierfür sind das Einschalten eines Lüfters oder eines Lichts bzw. wie in dieser Lerneinheit das Neustarten eines Azure Sphere-Geräts.

Direkte IoT Hub-Methoden stellen eine Anforderung-Antwort-Interaktion mit einem Gerät dar, was einem HTTP-Aufruf insofern ähnelt, dass sie sofort erfolgreich sind oder ein Fehler auftritt (nach einem vom Benutzer angegebenen Timeout). Dieser Ansatz eignet sich für Szenarien, in denen die Vorgehensweise bei sofortigen Aktionen unterschiedlich ist, je nachdem, ob das Gerät reagieren konnte oder nicht.

Hinweis

Es gibt zahlreiche Gründe, warum Sie ein Azure Sphere-Gerät remote neu starten müssen. Gerätezertifikate, Betriebssystemupdates und Anwendungsupdates werden in einem 24-Stunden-Zyklus oder nach Neustart des Geräts ausgeführt. Möglicherweise gibt es einen betrieblichen Grund, weshalb Sie das Gerät neu starten müssen, um ein Update zu erzwingen.

Remoteneustart eines Azure Sphere-Geräts

Im IoT-Explorer können Sie einen Befehl einer direkten Methode zum Neustarten des Geräts aufrufen. Sie müssen die Anzahl der Sekunden festlegen, die das Gerät vor dem Neustart warten soll. Azure IoT Hub sendet eine Nachricht der direkten Methode mit optionalen Nutzdaten an das Gerät. Das Gerät antwortet mit einem Statuscode und optional mit einer Meldung, die angibt, ob der Befehl erfolgreich war oder ein Fehler aufgetreten ist.

The illustration shows a device twin configuration pattern.

Schritte zum Neustarten eines Azure Sphere-IoT Explorer-Geräts

In den folgenden Schritten wird erläutert, wie Azure IoT-Explorer und direkte Methoden von Azure IoT Hub für die Cloud-zu-Gerät-Steuerung eingesetzt werden.

  1. Im Azure IoT-Explorer können Sie den Befehl Restart Device (Gerät neu starten) der direkten Methode von IoT Hub aufrufen.
  2. Azure IoT Hub sendet anschließend die Nachricht des Befehls der direkten Methode an das Gerät.
  3. Auf dem Azure Sphere-Gerät wird die Funktion RestartDeviceHandler aufgerufen.
  4. Danach sendet das Gerät die Gerätezwillingsnachricht ReportedRestartUTC an Azure IoT, um den Zeitpunkt zu protokollieren, zu dem das Gerät neu gestartet wurde.
  5. Die direkte Methode antwortet mit einem HTTP-Statuscode und einer Meldung.
  6. Das Azure Sphere-Gerät wird dann neu gestartet.
  7. Azure IoT-Explorer fragt die Geräteeigenschaft ReportedRestartUTC ab und zeigt diese an.

Erste Schritte mit direkten Methodenbindungen

Eine direkte Methodenbindung ordnet den Namen des direkten Methodenbefehls von IoT Hub einer Handlerfunktion zu, die zum Implementieren der Aktion aufgerufen wird.

Im folgenden Beispiel wird eine direkte Methodenbindung deklariert, um das Azure Sphere-Gerät neu zu starten. Diese Deklaration ordnet den Befehl RestartDevice der direkten Methode von Azure IoT Hub einer Handlerfunktion namens RestartDeviceHandler zu.

static LP_DIRECT_METHOD_BINDING dm_restartDevice = {
    .methodName = "RestartDevice",
    .handler = RestartDeviceHandler };

Remoteneustart des Azure Sphere-Geräts

Im Folgenden sehen Sie die Implementierung der Handlerfunktion RestartDeviceHandler. Die Handlerfunktion wird aufgerufen, wenn das Gerät eine direkte Methodennachricht namens RestartDevice von Azure IoT Hub empfängt.

/// <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;
    }
}

Azure Sphere-Funktion PowerControls

Die RestartDeviceHandler-Funktion richtet einen einmaligen Timer ein, der die DelayRestartDeviceTimerHandler-Funktion nach dem in Sekunden angegebenen Neustartzeitraum aufruft. In der DelayRestartDeviceTimerHandler-Funktion wird die PowerManagement_ForceSystemReboot-API aufgerufen. Die PowerManagement_ForceSystemReboot-API erfordert, dass die PowerControls-Funktion in der app_manifest.json-Datei deklariert wird.

"PowerControls": [
    "ForceReboot"
]

Zuordnen von direkten Methoden zu Handlern

Alle deklarierten direkten Methodenbindungen müssen dem directMethodBindingSet-Array durch Verweise hinzugefügt werden. Wenn das Gerät eine direkte Methodennachricht von Azure IoT Hub empfängt, wird es auf einen übereinstimmenden Namen für methodName im directMethodBindingSet-Array geprüft. Wenn eine Übereinstimmung gefunden wird, wird die entsprechende Handlerfunktion aufgerufen.

LP_DIRECT_METHOD_BINDING* directMethodBindingSet[] = { &dm_restartDevice };

Öffnen des Bindungssatzes der direkten Methode

Der Bindungssatz der direkten Methode wird in der Funktion InitPeripheralsAndHandlers in main.c initialisiert.

lp_directMethodSetOpen(directMethodBindingSet, NELEMS(directMethodBindingSet));

Ändern des Bindungssatzes der direkten Methode

Der Bindungssatz der direkten Methode wird in der Funktion ClosePeripheralsAndHandlers in main.c geschlossen.

lp_directMethodSetClose();