为 OTA 应用程序从版本 1 迁移到版本 3 - FreeRTOS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

为 OTA 应用程序从版本 1 迁移到版本 3

本指南将帮助您将应用程序从 OTA 库版本 1 迁移到版本 3。

注意

OTA 版本 2 的 API 与 OTA v3 API 相同,因此,如果您的应用程序使用的是版本 2 的 API,则无需对 API 调用进行更改,但我们建议您集成该库的版本 3。

从下面可以获得 OTA 版本 3 的演示:

API 更改摘要

OTA 库版本 1 和版本 3 之间的 API 更改摘要

OTA 版本 1 API

OTA 版本 3 API

更改说明

ota_agentinit

ota_init

由于 OTA v3 中实施的更改,输入参数以及从函数返回的值都发生了变化。有关详细信息,请参阅下面的 OTA_Init 部分。

OTA_AgentShutdown

OTA_Shutdown

对输入参数的更改,包括用于可选取消订阅 MQTT 主题的附加参数。有关详细信息,请参阅下面的 OTA_Shutdown 部分。

OTA_GetAgentState

OTA_GetState

已更改 API 名称,但未更改输入参数。返回值相同,但重命名了枚举和成员。有关详细信息,请参阅下面的 OTA_GetState 部分。

不适用

OTA_GetStatistics

添加了新的 API 来取代 OTA_GetPacketsReceived、OTA_GetPacketsQueued、OTA_GetPacketsProcessed、OTA_GetPacketsDropped。有关详细信息,请参阅下面的 OTA_GetStatistics 部分。

OTA_GetPacketsReceived

不适用

已从版本 3 中移除此 API,将其替换成了 OTA_GetStatistics。

OTA_GetPacketsQueued

不适用

已从版本 3 中移除此 API,将其替换成了 OTA_GetStatistics。

OTA_GetPacketsProcessed

不适用

已从版本 3 中移除此 API,将其替换成了 OTA_GetStatistics。

OTA_GetPacketsDropped

不适用

已从版本 3 中移除此 API,将其替换成了 OTA_GetStatistics。

OTA_ActivateNewImage

OTA_ActivateNewImage

输入参数相同,但重命名了返回的 OTA 错误代码,并在 OTA 库的版本 3 中添加了新的错误代码。有关详细信息,请参阅 OTA_ActivateNewImage 部分。

OTA_SetImageState

OTA_SetImageState

输入参数相同但但已重命名,同时重命名了返回的 OTA 错误代码,并在 OTA 库的版本 3 中添加了新的错误代码。有关详细信息,请参阅 OTA_SetImageState 部分。

OTA_GetImageState

OTA_GetImageState

输入参数相同,但在 OTA 库的版本 3 中重命名了返回枚举。有关详细信息,请参阅 OTA_GetImageState 部分。

OTA_Suspend

OTA_Suspend

输入参数相同,但重命名了返回的 OTA 错误代码,并在 OTA 库的版本 3 中添加了新的错误代码。有关详细信息,请参阅 OTA_Suspend 部分。

OTA_Resume

OTA_Resume

移除了连接的输入参数,因为该连接在 OTA 演示/应用程序中进行处理,重命名了返回的 OTA 错误代码,并在 OTA 库的版本 3 中添加了新的错误代码。有关详细信息,请参阅 OTA_Resume 部分。

OTA_CheckForUpdate

OTA_CheckForUpdate

输入参数相同,但重命名了返回的 OTA 错误代码,并在 OTA 库的版本 3 中添加了新的错误代码。有关详细信息,请参阅 OTA_CheckForUpdate 部分。

不适用

OTA_EventProcessingTask

添加了新的 API,它是处理 OTA 更新事件的主事件循环,必须由应用程序任务调用。有关详细信息,请参阅 OTA_EventProcessingTask 部分。

不适用

OTA_SignalEvent

添加了新的 API,它将事件添加到 OTA 事件队列后,并由内部 OTA 模块用来向代理任务发出信号。有关详细信息,请参阅 OTA_SignalEvent 部分。

不适用

OTA_Err_strerror

用于将 OTA 错误的错误代码转换为字符串的新 API。

不适用

OTA_JobParse_strerror

用于将作业解析错误的错误代码转换为字符串的新 API。

不适用

OTA_OsStatus_strerror

用于将 OTA OS 端口状态的状态代码转换为字符串的新 API。

不适用

OTA_PalStatus_strerror

用于将 OTA PAL 端口状态的状态代码转换为字符串的新 API。

所需更改的描述

ota_init

在 v1 中初始化 OTA 代理时会使用 OTA_AgentInit API,它将连接上下文、事物名称、完整回调和超时的参数作为输入。

OTA_State_t OTA_AgentInit( void * pvConnectionContext, const uint8_t * pucThingName, pxOTACompleteCallback_t xFunc, TickType_t xTicksToWait );

此 API 现已更改为 OTA_Init,带有 ota、ota 接口、事物名称和应用程序回调所需的缓冲区的参数。

OtaErr_t OTA_Init( OtaAppBuffer_t * pOtaBuffer, OtaInterfaces_t * pOtaInterfaces, const uint8_t * pThingName, OtaAppCallback OtaAppCallback );
移除了输入参数 -
pvConnectionContext -

移除了连接上下文,因为 OTA 库版本 3 不需要将连接上下文传递给它,而且 MQTT/HTTP 操作由 OTA 演示/应用程序中的相应接口处理。

xTicksToWait -

还移除了等待刻度数参数,因为任务是在调用 OTA_Init 之前在 OTA 演示/应用程序中创建的。

重命名了输入参数 -
xFunc -

该参数已重命名为 OtaAppCallback,并且其类型已更改为 OtaAppCallback_t。

新的输入参数 -
pOtaBuffer

在初始化期间,应用程序必须使用 OtaAppBuffer_t 结构分配缓冲区并将其传递给 OTA 库。根据下载文件所使用的协议,所需的缓冲区略有不同。对于 MQTT 协议,需要流名称的缓冲区,对于 HTTP 协议,则需要预签名 url 和授权方案的缓冲区。

使用 MQTT 下载文件时需要的缓冲区 -

static OtaAppBuffer_t otaBuffer = { .pUpdateFilePath = updateFilePath, .updateFilePathsize = otaexampleMAX_FILE_PATH_SIZE, .pCertFilePath = certFilePath, .certFilePathSize = otaexampleMAX_FILE_PATH_SIZE, .pStreamName = streamName, .streamNameSize = otaexampleMAX_STREAM_NAME_SIZE, .pDecodeMemory = decodeMem, .decodeMemorySize = ( 1U << otaconfigLOG2_FILE_BLOCK_SIZE ), .pFileBitmap = bitmap, .fileBitmapSize = OTA_MAX_BLOCK_BITMAP_SIZE };

使用 HTTP 下载文件时需要的缓冲区 -

static OtaAppBuffer_t otaBuffer = { .pUpdateFilePath = updateFilePath, .updateFilePathsize = otaexampleMAX_FILE_PATH_SIZE, .pCertFilePath = certFilePath, .certFilePathSize = otaexampleMAX_FILE_PATH_SIZE, .pDecodeMemory = decodeMem, .decodeMemorySize = ( 1U << otaconfigLOG2_FILE_BLOCK_SIZE ), .pFileBitmap = bitmap, .fileBitmapSize = OTA_MAX_BLOCK_BITMAP_SIZE, .pUrl = updateUrl, .urlSize = OTA_MAX_URL_SIZE, .pAuthScheme = authScheme, .authSchemeSize = OTA_MAX_AUTH_SCHEME_SIZE };

其中 -

pUpdateFilePath Path to store the files. updateFilePathsize Maximum size of the file path. pCertFilePath Path to certificate file. certFilePathSize Maximum size of the certificate file path. pStreamName Name of stream to download the files. streamNameSize Maximum size of the stream name. pDecodeMemory Place to store the decoded files. decodeMemorySize Maximum size of the decoded files buffer. pFileBitmap Bitmap of the parameters received. fileBitmapSize Maximum size of the bitmap. pUrl Presigned url to download files from S3. urlSize Maximum size of the URL. pAuthScheme Authentication scheme used to validate download. authSchemeSize Maximum size of the auth scheme.
pOtaInterfaces

OTA_Init 的第二个输入参数是对 OtaInterfaces_t 类型的 OTA 接口的引用。必须将这一组接口传递给 OTA 库,并在操作系统接口中包含 MQTT 接口、HTTP 接口和平台抽象层接口。

OTA 操作系统接口

OTA 操作系统功能接口是一组 API,必须为设备实现这些接口才能使用 OTA 库。此接口的函数实现会在用户应用程序中提供给 OTA 库。OTA 库调用函数实现来执行通常由操作系统提供的功能。其中包括管理事件、计时器和内存分配。FreeRTOS 和 POSIX 的实现在 OTA 库中提供。

使用提供的 FreeRTOS 移植的 FreeRTOS 示例 -

OtaInterfaces_t otaInterfaces; otaInterfaces.os.event.init = OtaInitEvent_FreeRTOS; otaInterfaces.os.event.send = OtaSendEvent_FreeRTOS; otaInterfaces.os.event.recv = OtaReceiveEvent_FreeRTOS; otaInterfaces.os.event.deinit = OtaDeinitEvent_FreeRTOS; otaInterfaces.os.timer.start = OtaStartTimer_FreeRTOS; otaInterfaces.os.timer.stop = OtaStopTimer_FreeRTOS; otaInterfaces.os.timer.delete = OtaDeleteTimer_FreeRTOS; otaInterfaces.os.mem.malloc = Malloc_FreeRTOS; otaInterfaces.os.mem.free = Free_FreeRTOS;

使用提供的 POSIX 端口的 Linux 示例 -

OtaInterfaces_t otaInterfaces; otaInterfaces.os.event.init = Posix_OtaInitEvent; otaInterfaces.os.event.send = Posix_OtaSendEvent; otaInterfaces.os.event.recv = Posix_OtaReceiveEvent; otaInterfaces.os.event.deinit = Posix_OtaDeinitEvent; otaInterfaces.os.timer.start = Posix_OtaStartTimer; otaInterfaces.os.timer.stop = Posix_OtaStopTimer; otaInterfaces.os.timer.delete = Posix_OtaDeleteTimer; otaInterfaces.os.mem.malloc = STDC_Malloc; otaInterfaces.os.mem.free = STDC_Free;
MQTT 接口

OTA MQTT 接口是一组 API,必须在库中实现这些接口才能让 OTA 库从流式服务下载文件块。

使用 OTA over MQTT 演示演示中的 coreMQTT 代理 API 的示例 -

OtaInterfaces_t otaInterfaces; otaInterfaces.mqtt.subscribe = prvMqttSubscribe; otaInterfaces.mqtt.publish = prvMqttPublish; otaInterfaces.mqtt.unsubscribe = prvMqttUnSubscribe;
HTTP 接口

OTA HTTP 接口是一组 API,必须在库中实现这些接口才能让 OTA 库通过连接到预签名 URL 并获取数据块来下载文件块。除非您将 OTA 库配置为从预签名 URL(而不是流式服务)下载,否则它是可选的。

使用 OTA over HTTP 演示中的 coreHTTP API 的示例 -

OtaInterfaces_t otaInterfaces; otaInterfaces.http.init = httpInit; otaInterfaces.http.request = httpRequest; otaInterfaces.http.deinit = httpDeinit;
OTA PAL 接口

OTA PAL 接口是一组 API,必须为设备实现这些接口才能使用 OTA 库。OTA PAL 的设备特定实现在用户应用程序中提供给库。库使用这些函数来存储、管理和验证下载。

OtaInterfaces_t otaInterfaces; otaInterfaces.pal.getPlatformImageState = otaPal_GetPlatformImageState; otaInterfaces.pal.setPlatformImageState = otaPal_SetPlatformImageState; otaInterfaces.pal.writeBlock = otaPal_WriteBlock; otaInterfaces.pal.activate = otaPal_ActivateNewImage; otaInterfaces.pal.closeFile = otaPal_CloseFile; otaInterfaces.pal.reset = otaPal_ResetDevice; otaInterfaces.pal.abort = otaPal_Abort; otaInterfaces.pal.createFile = otaPal_CreateFileForRx;
返回结果的变化 -

返回值从 OTA 代理状态更改为了 OTA 错误代码。请参阅 Amazon IoT空中下载更新 v3.0.0:OtaErr_t

OTA_Shutdown

在 OTA 库版本 1 中,用于关闭 OTA 代理的 API 是 OTA_AgentShutdown,由于输入参数的更改,该 API 现在已更改为 OTA_Shutdown。

OTA 代理关闭(版本 1)
OTA_State_t OTA_AgentShutdown( TickType_t xTicksToWait );
OTA 代理关闭(版本 3)
OtaState_t OTA_Shutdown( uint32_t ticksToWait, uint8_t unsubscribeFlag );
ticksToWait -

等待 OTA 代理完成关闭过程的刻度数量。如果将其设置为零,该函数将立即返回,无需等待。实际状态将返回给调用方。代理暂时不会进入睡眠状态,而会用于繁忙的循环。

新的输入参数 -

unsubscribeFlag -

用于指示在调用关闭时是否应从作业主题执行取消订阅操作的标记。如果该标记为 0,则不会为作业主题调用取消订阅操作。如果应用程序必须取消订阅作业主题,则在调用 OTA_Shutdown 时必须将此标记设置为 1。

返回结果的变化 -

OtaState_t -

重命名了 OTA 代理状态的枚举及其成员。请参阅 Amazon IoT 空中下载更新 v3.0.0

OTA_GetState

API 名称从 OTA_AgentGetState 更改为了 OTA_GetState。

OTA 代理关闭(版本 1)
OTA_State_t OTA_GetAgentState( void );
OTA 代理关闭(版本 3)
OtaState_t OTA_GetState( void );
返回结果的变化 -

OtaState_t -

重命名了 OTA 代理状态的枚举及其成员。请参阅 Amazon IoT 空中下载更新 v3.0.0

OTA_GetStatistics

为统计数据添加了新的单一 API。它取代了 API OTA_GetPacketsReceived、OTA_GetPacketsQueued、OTA_GetPacketsProcessed、OTA_GetPacketsDropped。此外,在 OTA 库版本 3 中,统计数字仅与当前作业相关。

OTA 库版本 1
uint32_t OTA_GetPacketsReceived( void ); uint32_t OTA_GetPacketsQueued( void ); uint32_t OTA_GetPacketsProcessed( void ); uint32_t OTA_GetPacketsDropped( void );
OT3 库版本 3
OtaErr_t OTA_GetStatistics( OtaAgentStatistics_t * pStatistics );
pStatistics -

统计数据的输入/输出参数,例如,为当前作业接收、丢弃、排队和处理的数据包。

输出参数 -

OTA 错误代码。

示例用法 -
OtaAgentStatistics_t otaStatistics = { 0 }; OTA_GetStatistics( &otaStatistics ); LogInfo( ( " Received: %u Queued: %u Processed: %u Dropped: %u", otaStatistics.otaPacketsReceived, otaStatistics.otaPacketsQueued, otaStatistics.otaPacketsProcessed, otaStatistics.otaPacketsDropped ) );

OTA_ActivateNewImage

输入参数相同,但重命名了返回的 OTA 错误代码,并在 OTA 库的版本 3 中添加了新的错误代码。

OTA 库版本 1
OTA_Err_t OTA_ActivateNewImage( void );
OT3 库版本 3
OtaErr_t OTA_ActivateNewImage( void );

更改了返回的 OTA 错误代码枚举,并添加了新的错误代码。请参阅 Amazon IoT空中下载更新 v3.0.0:OtaErr_t

示例用法 -
OtaErr_t otaErr = OtaErrNone; otaErr = OTA_ActivateNewImage(); /* Handle error */

OTA_SetImageState

输入参数相同但但已重命名,同时重命名了返回的 OTA 错误代码,并在 OTA 库的版本 3 中添加了新的错误代码。

OTA 库版本 1
OTA_Err_t OTA_SetImageState( OTA_ImageState_t eState );
OT3 库版本 3
OtaErr_t OTA_SetImageState( OtaImageState_t state );

输入参数已重命名为 OtaImageState_t。请参阅 Amazon IoT 空中下载更新 v3.0.0

更改了返回的 OTA 错误代码枚举,并添加了新的错误代码。请参阅 Amazon IoT 空中下载更新 v3.0.0 / OtaErr_t

示例用法 -
OtaErr_t otaErr = OtaErrNone; otaErr = OTA_SetImageState( OtaImageStateAccepted ); /* Handle error */

OTA_GetImageState

输入参数相同,但在 OTA 库的版本 3 中重命名了返回枚举。

OTA 库版本 1
OTA_ImageState_t OTA_GetImageState( void );
OT3 库版本 3
OtaImageState_t OTA_GetImageState( void );

返回枚举已重命名为 OtaImageState_t。请参阅 Amazon IoT 空中下载更新 v3.0.0:OtaImageState_t

示例用法 -
OtaImageState_t imageState; imageState = OTA_GetImageState();

OTA_Suspend

输入参数相同,但重命名了返回的 OTA 错误代码,并在 OTA 库的版本 3 中添加了新的错误代码。

OTA 库版本 1
OTA_Err_t OTA_Suspend( void );
OT3 库版本 3
OtaErr_t OTA_Suspend( void );

更改了返回的 OTA 错误代码枚举,并添加了新的错误代码。请参阅 Amazon IoT空中下载更新 v3.0.0:OtaErr_t

示例用法 -
OtaErr_t xOtaError = OtaErrUninitialized; xOtaError = OTA_Suspend(); /* Handle error */

OTA_Resume

移除了连接的输入参数,因为该连接在 OTA 演示/应用程序中进行处理,重命名了返回的 OTA 错误代码,并在 OTA 库的版本 3 中添加了新的错误代码。

OTA 库版本 1
OTA_Err_t OTA_Resume( void * pxConnection );
OT3 库版本 3
OtaErr_t OTA_Resume( void );

更改了返回的 OTA 错误代码枚举,并添加了新的错误代码。请参阅 Amazon IoT空中下载更新 v3.0.0:OtaErr_t

示例用法 -
OtaErr_t xOtaError = OtaErrUninitialized; xOtaError = OTA_Resume(); /* Handle error */

OTA_CheckForUpdate

输入参数相同,但重命名了返回的 OTA 错误代码,并在 OTA 库的版本 3 中添加了新的错误代码。

OTA 库版本 1
OTA_Err_t OTA_CheckForUpdate( void );
OT3 库版本 3
OtaErr_t OTA_CheckForUpdate( void )

更改了返回的 OTA 错误代码枚举,并添加了新的错误代码。请参阅 Amazon IoT空中下载更新 v3.0.0:OtaErr_t

OTA_EventProcessingTask

这是一个新的 API,也是处理 OTA 更新事件的主事件循环。它必须由应用程序任务调用。此循环将继续处理和执行接收到的 OTA 更新事件,直到应用程序终止此任务。

OT3 库版本 3
void OTA_EventProcessingTask( void * pUnused );
FreeRTOS 的示例 -
/* Create FreeRTOS task*/ xTaskCreate( prvOTAAgentTask, "OTA Agent Task", otaexampleAGENT_TASK_STACK_SIZE, NULL, otaexampleAGENT_TASK_PRIORITY, NULL ); /* Call OTA_EventProcessingTask from the task */ static void prvOTAAgentTask( void * pParam ) { /* Calling OTA agent task. */ OTA_EventProcessingTask( pParam ); LogInfo( ( "OTA Agent stopped." ) ); /* Delete the task as it is no longer required. */ vTaskDelete( NULL ); }
POSIX 的示例 -
/* Create posix thread.*/ if( pthread_create( &threadHandle, NULL, otaThread, NULL ) != 0 ) { LogError( ( "Failed to create OTA thread: " ",errno=%s", strerror( errno ) ) ); /* Handle error. */ } /* Call OTA_EventProcessingTask from the thread.*/ static void * otaThread( void * pParam ) { /* Calling OTA agent task. */ OTA_EventProcessingTask( pParam ); LogInfo( ( "OTA Agent stopped." ) ); return NULL; }

OTA_SignalEvent

这是一个新的 API,可将事件添加到事件队列后,并由内部 OTA 模块来向单个代理任务发出信号。

OT3 库版本 3
bool OTA_SignalEvent( const OtaEventMsg_t * const pEventMsg );
示例用法 -
OtaEventMsg_t xEventMsg = { 0 }; xEventMsg.eventId = OtaAgentEventStart; ( void ) OTA_SignalEvent( &xEventMsg );

将 OTA 库作为子模块集成到应用程序中

如果您希望将 OTA 库集成到自己的应用程序中,则可以使用 git submodule 命令。Git 子模块允许您将一个 Git 仓库作为另一个 Git 存储库的子目录。OTA 库版本 3 在 ota-for-aws-iot-embedded-sdk 存储库中进行维护。

git submodule add https://github.com/aws/ota-for-aws-iot-embedded-sdk.git destination_folder
git commit -m "Added the OTA Library as submodule to the project."
git push

有关更多信息,请参阅《FreeRTOS 用户指南》中的将 OTA 代理集成到应用程序中

参考