기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
애플리케이션에 OTA 에이전트 통합
무선(OTA) 에이전트는 OTA 업데이트 기능을 제품에 추가하기 위해 작성해야 하는 코드 양을 간소화하기 위해 설계되었습니다. 통합 작업에서는 기본적으로 OTA 에이전트를 초기화하고 OTA 에이전트 이벤트 메시지에 응답하기 위한 사용자 지정 콜백 함수를 생성합니다. OS를 초기화하는 동안 MQTT, HTTP(HTTP가 파일 다운로드에 사용되는 경우) 및 플랫폼별 구현(PAL) 인터페이스가 OTA 에이전트에 전달됩니다. 버퍼를 초기화하여 OTA 에이전트에 전달할 수도 있습니다.
참고
OTA 업데이트 기능을 애플리케이션에 통합하는 작업은 다소 간단하지만, OTA 업데이트 시스템에서 디바이스 코드 통합보다 더 많은 것을 이해해야 합니다. 사물, 자격 증명, 코드 서명 인증서, 프로비저닝 디바이스 및 OTA 업데이트 작업을 사용하여 AWS AWS IoT 계정을 구성하는 방법을 숙지하려면 FreeRTOS 사전 조건을 참조하세요.
연결 관리
OTA 에이전트는 AWS IoT 서비스와 관련된 모든 제어 통신 작업에 MQTT 프로토콜을 사용하지만 MQTT 연결을 관리하지는 않습니다. OTA 에이전트가 애플리케이션의 연결 관리 정책을 간섭하지 않도록 하려면 MQTT 연결(연결 해제 및 다시 연결 기능 포함)을 기본 사용자 애플리케이션에서 처리해야 합니다. 이 파일은 MQTT 또는 HTTP 프로토콜을 통해 다운로드할 수 있습니다. OTA 작업을 생성할 때 프로토콜을 선택할 수 있습니다. MQTT를 선택하면 OTA 에이전트는 제어 작업 및 파일 다운로드에 동일한 연결을 사용합니다.
간단한 OTA 데모
다음은 에이전트가 MQTT 브로커에 연결하고 OTA 에이전트를 초기화하는 방법을 보여주는 간단한 OTA 데모에서 발췌한 내용입니다. 이 예제에서는 기본 OTA 애플리케이션 콜백을 사용하고 일부 통계를 초당 하나씩 반환하도록 데모를 구성합니다. 간결하게 나타내기 위해 이 데모에서는 일부 세부 정보를 생략합니다.
또한 OTA 데모는 연결 해제 콜백을 모니터링하고 연결을 다시 설정하여 MQTT 연결을 관리하는 방법을 보여줍니다. 연결이 끊어지면 데모에서는 먼저 OTA 에이전트 작업을 일시 중단한 다음 MQTT 연결을 다시 설정하려고 시도합니다. MQTT 재연결 시도는 최대 값까지 기하급수적으로 증가하는 시간만큼 지연되며 지터도 추가됩니다. 연결이 다시 설정되면 OTA 에이전트는 작업을 계속합니다.
AWS IoT MQTT 브로커를 사용하는 작업 예제는 demos/ota
디렉터리의 OTA 데모 코드를 참조하세요.
OTA 에이전트는 자체 작업이므로 이 예의 의도적인 1초 지연은 이 애플리케이션에만 영향을 줍니다. 따라서 에이전트의 성능에는 영향을 주지 않습니다.
static BaseType_t prvRunOTADemo( void )
{
/* Status indicating a successful demo or not. */
BaseType_t xStatus = pdFAIL;
/* OTA library return status. */
OtaErr_t xOtaError = OtaErrUninitialized;
/* OTA event message used for sending event to OTA Agent.*/
OtaEventMsg_t xEventMsg = { 0 };
/* OTA interface context required for library interface functions.*/
OtaInterfaces_t xOtaInterfaces;
/* OTA library packet statistics per job.*/
OtaAgentStatistics_t xOtaStatistics = { 0 };
/* OTA Agent state returned from calling OTA_GetState.*/
OtaState_t xOtaState = OtaAgentStateStopped;
/* Set OTA Library interfaces.*/
prvSetOtaInterfaces( &xOtaInterfaces );
/*************************** Init OTA Library. ***************************/
if( ( xOtaError = OTA_Init( &xOtaBuffer,
&xOtaInterfaces,
( const uint8_t * ) ( democonfigCLIENT_IDENTIFIER ),
prvOtaAppCallback ) ) != OtaErrNone )
{
LogError( ( "Failed to initialize OTA Agent, exiting = %u.",
xOtaError ) );
}
else
{
xStatus = pdPASS;
}
/************************ Create OTA Agent Task. ************************/
if( xStatus == pdPASS )
{
xStatus = xTaskCreate( prvOTAAgentTask,
"OTA Agent Task",
otaexampleAGENT_TASK_STACK_SIZE,
NULL,
otaexampleAGENT_TASK_PRIORITY,
NULL );
if( xStatus != pdPASS )
{
LogError( ( "Failed to create OTA agent task:" ) );
}
}
/****************************** Start OTA ******************************/
if( xStatus == pdPASS )
{
/* Send start event to OTA Agent.*/
xEventMsg.eventId = OtaAgentEventStart;
OTA_SignalEvent( &xEventMsg );
}
/******************** Loop and display OTA statistics ********************/
if( xStatus == pdPASS )
{
while( ( xOtaState = OTA_GetState() ) != OtaAgentStateStopped )
{
/* Get OTA statistics for currently executing job. */
if( xOtaState != OtaAgentStateSuspended )
{
OTA_GetStatistics( &xOtaStatistics );
LogInfo( ( " Received: %u Queued: %u Processed: %u Dropped: %u",
xOtaStatistics.otaPacketsReceived,
xOtaStatistics.otaPacketsQueued,
xOtaStatistics.otaPacketsProcessed,
xOtaStatistics.otaPacketsDropped ) );
}
vTaskDelay( pdMS_TO_TICKS( otaexampleEXAMPLE_TASK_DELAY_MS ) );
}
}
return xStatus;
}
다음은 이 데모 애플리케이션의 상위 수준 흐름입니다.
-
MQTT 에이전트 컨텍스트를 생성합니다.
-
AWS IoT 엔드포인트에 연결합니다.
-
OTA 에이전트를 초기화합니다.
-
OTA 업데이트 작업을 허용하고 1초에 1회 통계를 출력하는 루프입니다.
-
MQTT 연결이 끊어지면 OTA 에이전트 작업을 일시 중단합니다.
-
연결을 다시 시도합니다(이때 기하급수적인 지연 및 지터가 발생함).
-
다시 연결되면 OTA 에이전트 작업을 재개합니다.
-
에이전트가 중지되면 1초 정도 지연한 다음 재연결을 시도합니다.
OTA 에이전트 이벤트에 애플리케이션 콜백 사용
이전 예제에서는 prvOtaAppCallback
이 OTA 에이전트 이벤트에 대한 콜백 핸들러로 사용되었습니다. (OTA_Init
API 직접 호출의 네 번째 단락을 참조하세요.) 완료 이벤트의 사용자 지정 처리를 구현하려면 OTA 데모/애플리케이션에서 기본 처리를 변경해야 합니다. OTA 프로세스 중에 OTA 에이전트는 다음 이벤트 열거형 중 하나를 콜백 핸들러에 전송할 수 있습니다. 이벤트를 처리하는 방법과 시기는 애플리케이션 개발자가 결정해야 합니다.
/**
* @ingroup ota_enum_types
* @brief OTA Job callback events.
*
* After an OTA update image is received and authenticated, the agent calls the user
* callback (set with the @ref OTA_Init API) with the value OtaJobEventActivate to
* signal that the device must be rebooted to activate the new image. When the device
* boots, if the OTA job status is in self test mode, the agent calls the user callback
* with the value OtaJobEventStartTest, signaling that any additional self tests
* should be performed.
*
* If the OTA receive fails for any reason, the agent calls the user callback with
* the value OtaJobEventFail instead to allow the user to log the failure and take
* any action deemed appropriate by the user code.
*
* See the OtaImageState_t type for more information.
*/
typedef enum OtaJobEvent
{
OtaJobEventActivate = 0, /*!< @brief OTA receive is authenticated and ready to activate. */
OtaJobEventFail = 1, /*!< @brief OTA receive failed. Unable to use this update. */
OtaJobEventStartTest = 2, /*!< @brief OTA job is now in self test, perform user tests. */
OtaJobEventProcessed = 3, /*!< @brief OTA event queued by OTA_SignalEvent is processed. */
OtaJobEventSelfTestFailed = 4, /*!< @brief OTA self-test failed for current job. */
OtaJobEventParseCustomJob = 5, /*!< @brief OTA event for parsing custom job document. */
OtaJobEventReceivedJob = 6, /*!< @brief OTA event when a new valid AFT-OTA job is received. */
OtaJobEventUpdateComplete = 7, /*!< @brief OTA event when the update is completed. */
OtaLastJobEvent = OtaJobEventStartTest
} OtaJobEvent_t;
OTA 에이전트는 기본 애플리케이션에서 활성 처리 중에 백그라운드에서 업데이트를 수신할 수 있습니다. 이러한 이벤트를 전달하는 목적은 즉시 조치할 수 있는지, 아니면 일부 다른 애플리케이션별 처리가 완료될 때까지 지연할지 여부를 애플리케이션에서 결정할 수 있도록 하기 위한 것입니다. 그러면 활성 처리(예: vacuum 수행) 중에 디바이스의 예기치 않은 중단으로 펌웨어 업데이트 후에 재설정하는 것을 방지할 수 있습니다. 다음은 콜백 핸들러에 의해 수신되는 작업 이벤트입니다.
OtaJobEventActivate
-
콜백 핸들러가 이 이벤트를 수신하면 즉시 디바이스를 재설정하거나 나중에 디바이스 재설정을 위한 호출을 예약할 수 있습니다. 따라서 필요한 경우 디바이스 재설정 및 자체 테스트 단계를 연기할 수 있습니다.
OtaJobEventFail
-
콜백 핸들러가 이 이벤트를 수신하면 업데이트가 실패한 것입니다. 이 경우 아무것도 수행할 필요가 없습니다. 로그 메시지를 출력하거나 애플리케이션 관련 작업을 수행할 수 있습니다.
OtaJobEventStartTest
-
자체 테스트 단계에서는 새로 업데이트된 펌웨어를 실행하고 자체 테스트를 실시하여 올바르게 작동하는지 결정한 이후에 최신 영구 애플리케이션 이미지로 커밋할 수 있습니다. 새 업데이트를 수신하여 인증하고 디바이스를 재설정한 후 테스트 준비가 되면 OTA 에이전트가
OtaJobEventStartTest
이벤트를 콜백 함수에 전송합니다. 개발자는 업데이트 후 디바이스 펌웨어가 올바르게 작동하는지 확인하는 데 필요한 테스트를 추가할 수 있습니다. 자체 테스트에서 디바이스 펌웨어가 안정적인 것으로 간주될 경우 코드는OTA_SetImageState( OtaImageStateAccepted )
함수를 호출하여 펌웨어를 새 영구 이미지로 커밋해야 합니다. OtaJobEventProcessed
-
OTA_SignalEvent
에서 대기열에 추가한 OTA 이벤트가 처리되므로 OTA 버퍼 해제와 같은 정리 작업을 수행할 수 있습니다. OtaJobEventSelfTestFailed
-
현재 작업에서 OTA 자체 테스트가 실패했습니다. 이 이벤트의 기본 처리는 OTA 에이전트를 종료했다가 다시 시작하여 디바이스가 이전 이미지로 롤백되도록 하는 것입니다.
OtaJobEventUpdateComplete
-
OTA 작업 업데이트 완료에 대한 알림 이벤트입니다.