Удаленный перезапуск устройства Azure Sphere с помощью прямого метода Центра Интернета вещей Azure

Завершено

В этом уроке показано, как удаленно перезапускать Azure Sphere из Обозревателя Интернета вещей Azure.

Основные сведения о командах прямого метода Центра Интернета вещей

Для вызова действия на устройстве Центр Интернета вещей Azure использует команды прямого метода. Команды часто используются для интерактивного управления устройствами, например для включения вентилятора, освещения или, как в этом уроке, для перезагрузки Azure Sphere.

Прямые методы Центра Интернета вещей представляют собой взаимодействие с устройством в виде "запрос-ответ", аналогично вызовам протокола HTTP, когда успешность или неуспешность выполнения запроса становится известно сразу же (после истечения заданного пользователем времени ожидания). Этот подход полезен для сценариев, в которых предпринимаемые немедленно действия различаются в зависимости от того, удалось ли устройству ответить.

Примечание.

Перезагрузка Azure Sphere может потребоваться по целому ряду причин. Сертификаты устройства, обновления ОС и обновления приложений выполняются с 24-часовым интервалом или после перезагрузки устройства. Возможно, у вас есть текущая необходимость в перезагрузке устройства, чтобы принудительно выполнить обновление.

Удаленная перезагрузка Azure Sphere

В Обозревателе Интернета вещей можно вызвать команду прямого метода, чтобы перезапустить устройство. Необходимо задать время ожидания устройства перед перезагрузкой в секундах. Центр Интернета вещей Azure отправляет на устройство сообщение прямого метода с использованием дополнительных полезных данных. Устройство отправляет в ответ код состояния и при необходимости сообщение о том, выполнена ли команда успешно.

The illustration shows a device twin configuration pattern.

Этапы перезапуска Обозревателя Интернета вещей Azure Sphere

Ниже показано, как прямые методы Обозревателя Интернета вещей Azure и Центра Интернета вещей Azure используются для управления отправкой данных из облака на устройство.

  1. В Обозревателе Интернета вещей Azure вы можете вызвать команду прямого метода Центра Интернета вещей для перезапуска устройства.
  2. Затем Центр Интернета вещей Azure отправляет на устройство сообщение команды прямого метода.
  3. В Azure Sphere вызывается функция RestartDeviceHandler.
  4. После этого устройство отправляет в Azure IoT сообщение двойника устройства ReportedRestartUTC, чтобы зафиксировать время перезапуска устройства.
  5. Прямой метод отвечает, возвращая код состояния HTTP и ответное сообщение.
  6. Затем выполняется перезагрузка Azure Sphere.
  7. Обозреватель Интернета вещей Azure запрашивает значение свойства ReportedRestartUTC устройства и отображает его.

Начало работы с привязками прямых методов

Привязки прямых методов сопоставляют имя команды прямого метода Центра Интернета вещей с функцией-обработчиком, которая будет вызываться для реализации действия.

В следующем примере объявляется привязка прямого метода для перезапуска Azure Sphere. Это объявление сопоставляет команду прямого метода RestartDevice центра Интернета вещей Azure с функцией обработчика RestartDeviceHandler.

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

Удаленная перезагрузка Azure Sphere

Ниже приведена реализация функции обработчика RestartDeviceHandler. Функция обработчика вызывается, когда устройство получает сообщение прямого метода с именем RestartDevice из Центра Интернета вещей Azure.

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

Возможность PowerControls в Azure Sphere

Функция RestartDeviceHandler устанавливает разовый таймер, который вызывает функцию DelayRestartDeviceTimerHandler после заданного периода перезапуска, измеряемого в секундах. В функции DelayRestartDeviceTimerHandler выполняется вызов API PowerManagement_ForceSystemReboot. Для API PowerManagement_ForceSystemReboot требуется объявление возможности PowerControls в файле app_manifest.json.

"PowerControls": [
    "ForceReboot"
]

Сопоставление прямых методов с обработчиками

Все объявленные привязки прямых методов должны быть добавлены путем ссылки на массив directMethodBindingSet. При получении устройством сообщения прямого метода из Центра Интернета вещей Azure выполняется проверка на соответствие имени methodName в массиве directMethodBindingSet. Когда соответствие обнаруживается, вызывается нужная функция-обработчик.

LP_DIRECT_METHOD_BINDING* directMethodBindingSet[] = { &dm_restartDevice };

Открытие набора привязок прямого метода

Набор привязок прямого метода инициализируется в функции InitPeripheralsAndHandlers в файле main.c.

lp_directMethodSetOpen(directMethodBindingSet, NELEMS(directMethodBindingSet));

Закрытие набора привязок прямого метода

Набор привязок прямого метода закрывается в функции ClosePeripheralsAndHandlers в файле main.c.

lp_directMethodSetClose();