EC600U_esp32_iap_uart/LinkSDK/components/ota/aiot_ota_api.h

956 lines
30 KiB
C
Raw Permalink Normal View History

2024-02-05 17:39:56 +08:00
/**
* @file aiot_ota_api.h
* @brief OTA模块头文件,
* @date 2019-12-27
*
* @copyright Copyright (C) 2015-2018 Alibaba Group Holding Limited
*
* @details
*
* OTA模块可用于配合阿里云平台的固件升级服务, [](https://help.aliyun.com/document_detail/58328.html)页面有介绍OTA的控制操作流程
*
* + [OTA升级](https://help.aliyun.com/document_detail/58328.html)页面, 了解设备端配合OTA升级时的网络交互流程
*
* + 使OTA服务, @ref aiot_ota_report_version ,
* + , @ref aiot_download_send_request , SDK不会自动下载固件
* + , buffer中的固件内容写到Flash上, SDK不含有固件烧录的逻辑
* + , @ref aiot_ota_report_version , ,
* + @ref aiot_ota_recv_handler_t , , @ref aiot_ota_query_firmware
*
* + , MQTT通道, OTA升级的前提是成功建立并保持MQTT长连接通道在线
*
*/
#ifndef __AIOT_OTA_API_H__
#define __AIOT_OTA_API_H__
#if defined(__cplusplus)
extern "C" {
#endif
#include <stdint.h>
/**
* @brief OTA消息的类型,
*
* @details
* @ref aiot_ota_recv_handler_t MQTT报文类型
*
*/
typedef enum {
/**
* @brief OTA消息为固件升级消息
*
*/
AIOT_OTARECV_FOTA,
/**
* @brief OTA消息为远程配置消息
*
*/
AIOT_OTARECV_COTA
} aiot_ota_recv_type_t;
/**
* @brief OTA过程中使用的digest方法类型, MD5和SHA256两种
*
*/
typedef enum {
/**
* @brief OTA固件的digest方法为MD5
*
*/
AIOT_OTA_DIGEST_MD5,
/**
* @brief OTA固件的digest方法为SHA256
*
*/
AIOT_OTA_DIGEST_SHA256,
AIOT_OTA_DIGEST_MAX
} aiot_ota_digest_type_t;
/**
* @brief , url, ,
*
*/
typedef struct {
/**
* @brief product_key
*
*/
char *product_key;
/**
* @brief device_name
*
*/
char *device_name;
/*
* @brief
*
*/
char *url;
/*
* @brief , Byte
*
*/
uint32_t size_total;
/*
* @brief , @ref aiot_ota_digest_type_t
*
*/
uint8_t digest_method;
/*
* @brief
*
*/
char *expect_digest;
/**
* @brief . , version字段为固件的版本号. , configId
*
*/
char *version;
/**
* @brief
*
*/
char *module;
/**
* @brief *mqtt句柄
*/
void *mqtt_handle;
} aiot_download_task_desc_t;
/**
* @brief OTA消息, (/)
*
*/
typedef struct {
/**
* @brief OTA消息类型, @ref aiot_ota_recv_type_t
*/
aiot_ota_recv_type_t type;
/**
* @brief , url, , , @ref aiot_download_task_desc_t
*/
aiot_download_task_desc_t *task_desc;
} aiot_ota_recv_t;
/**
* @brief OTA的mqtt下行报文时的接收回调函数., (, )
* @param[in] handle OTA实例句柄
* @param[in] msg OTA消息
* @param[in] userdata
*
* @return void
*/
typedef void (* aiot_ota_recv_handler_t)(void *handle, const aiot_ota_recv_t *const msg, void *userdata);
/**
* @brief
*
*/
typedef enum {
/**
* @brief HTTP传输的固件分片报文
*
*/
AIOT_DLRECV_HTTPBODY
} aiot_download_recv_type_t;
/**
* @brief , , buffer地址, buffer的长度,
*
*/
typedef struct {
/**
* @brief , @ref aiot_download_recv_type_t
*
*/
aiot_download_recv_type_t type;
struct {
/**
* @brief , SDK分配出来的存储云端下行的固件内容的buffer地址.SDK就会主动释放..
*
*/
uint8_t *buffer;
/**
* @brief , SDK分配出来的存储云端下行的固件内容的buffer的大小, @ref AIOT_DLOPT_BODY_BUFFER_MAX_LEN
*
*/
uint32_t len;
/**
* @brief
*
*/
int32_t percent;
} data;
} aiot_download_recv_t;
/**
* @brief , .https报文下推分段后的固件内容.
* @param[in] handle download实例句柄
* @param[in] packet
* @param[in] userdata
*
* @return void
*/
typedef void (* aiot_download_recv_handler_t)(void *handle, const aiot_download_recv_t *packet,
void *userdata);
/**
* @brief OTA过程中的错误码,
*
*/
typedef enum {
/**
* @brief
*/
AIOT_OTAERR_UPGRADE_FAILED = -1,
/**
* @brief
*/
AIOT_OTAERR_FETCH_FAILED = -2,
/**
* @brief
*/
AIOT_OTAERR_CHECKSUM_MISMATCH = -3,
/**
* @brief
*/
AIOT_OTAERR_BURN_FAILED = -4
} aiot_ota_protocol_errcode_t;
/**
* @brief @ref aiot_ota_setopt , option参数的可用值
*
*/
typedef enum {
/**
* @brief OTA消息的用户回调函数
*
* @details
*
* , : .
*
* , url, version, digest method, sign等内容.
*
* , . , aiot_download_init初始化一个download实例句柄.
* demos目录下的fota_xxx_xxx.c的用例
*
* : (void *)
*/
AIOT_OTAOPT_RECV_HANDLER,
/**
* @brief MQTT的handle
*
* @details
*
* OTA过程中使用MQTT的通道能力, , ,
*
* : (void *)
*/
AIOT_OTAOPT_MQTT_HANDLE,
/**
* @brief SDK暂存的上下文
*
* @details
*
* @ref AIOT_OTAOPT_RECV_HANDLER
*
* : (void *)
*/
AIOT_OTAOPT_USERDATA,
/**
* @brief ota是针对某个外接模块(mcu等),
*
* @details
*
* OTA可能会针对某个外接的模块进行, , .
* .
*
* : (void *)
*/
AIOT_OTAOPT_MODULE,
AIOT_OTAOPT_MAX
} aiot_ota_option_t;
/**
* @brief @ref aiot_download_setopt , option参数的可用值
*
*/
typedef enum {
/**
* @brief HTTP与固件服务器建联时, 使
*
* @details
*
* @ref aiot_sysdep_network_cred_t
*
* 1. , HTTP将以tcp方式直接建联
*
* 2. @ref aiot_sysdep_network_cred_t option配置为@ref AIOT_SYSDEP_NETWORK_CRED_NONE , HTTP将以tcp方式直接建联
*
* 3. @ref aiot_sysdep_network_cred_t option配置为@ref AIOT_SYSDEP_NETWORK_CRED_SVRCERT_CA , HTTP将以tls方式建联
*
* 4. @ref aiot_sysdep_network_cred_t option配置为@ref AIOT_SYSDEP_NETWORK_CRED_SVRCERT_PSK , HTTP将以tls psk方式建联
*
* : (aiot_sysdep_network_cred_t *)
*/
AIOT_DLOPT_NETWORK_CRED,
/**
* @brief HTTP访问固件下载服务器的端口号
*
* @details
*
* 使tcp或者tls证书方式, 443
*
* : (uint16_t *)
*/
AIOT_DLOPT_NETWORK_PORT,
/**
* @brief socket连接时的pdp通道
*
* @details
*
* 使tcp或者tls证书方式, 443
*
* : (uint16_t *)
*/
AIOT_DLOPT_PROFILE_IDX,
/**
* @brief HTTP接收固件内容时,
*
* @details
*
* : (uint32_t *) : (5 * 1000) ms
*/
AIOT_DLOPT_RECV_TIMEOUT_MS,
/**
* @brief HTTP
*
* @details
*
* : (aiot_download_recv_handler_t)
*/
AIOT_DLOPT_RECV_HANDLER,
/**
* @brief SDK暂存的上下文
*
* @details
*
* HTTP数据时, @ref aiot_download_recv_handler_t userdata
*
* : (void *)
*/
AIOT_DLOPT_USERDATA,
/**
* @brief download实例句柄所包含下载任务的具体内容
*
* @details
*
* OTA的mqtt消息后, , , download实例句柄中开辟内存,
* OTA消息中携带的url, version, digest method, sign等信息复制过来,
*
* : (aiot_download_task_desc_t *)
*
**/
AIOT_DLOPT_TASK_DESC,
/**
* @brief range下载的起始地址
*
* @details
*
* HTTP (range requests), byte开始下载
* , start的值为0
*
* : (uint32_t *)
*
**/
AIOT_DLOPT_RANGE_START,
/**
* @brief range下载的结束地址
*
* @details
* HTTP (range requests), byte后结束.
* 10byte后结束,
* start = 0, end = 9, 10byte
*
* : (uint32_t *)
*
**/
AIOT_DLOPT_RANGE_END,
/**
* @brief http报文时, @ref aiot_download_recv_handler_t body最大长度
*
* @details
* , aiot_download_recv_handler_t回调函数给出的长度是设备实际接收到的长度
*
* : (uint32_t *) : (2 *1024) Bytes
*/
AIOT_DLOPT_BODY_BUFFER_MAX_LEN,
AIOT_DLOPT_MAX
} aiot_download_option_t;
/**
* @brief
*
* @details
* 线, OTA任务, SDK会通过@ref aiot_ota_recv_handler_t .
* , OTA任务可能被暂时忽略, api来让云端再次下推这个OTA任务.
* , SDK会从@ref aiot_ota_recv_handler_t OTA任务透给用户
*
* @return int32_t
* @retval STATE_SUCCESS
* @retval STATE_OTA_QUERY_FIRMWARE_HANDLE_IS_NULL handle句柄没有经过初始化, @ref aiot_ota_init
*
*/
int32_t aiot_ota_query_firmware(void *handle);
/**
* @brief OTA实例
*
* @return void*
* @retval NULL ota实例句柄
* @retval NULL , portfile,
*
*/
void *aiot_ota_init();
/**
* @brief ota实例句柄
*
* @param[in] handle ota实例句柄的指针
*
* @return int32_t
* @retval STATE_OTA_DEINIT_HANDLE_IS_NULL handle或者handle所指向的地址为空
* @retval STATE_SUCCESS
*
*/
int32_t aiot_ota_deinit(void **handle);
/**
* @brief ()
*
* @details
*
* , OTA服务, ,
*
* OTA要正常工作, , ,
*
* handle通过@ref aiot_ota_init , , "1.0.0"
*
* ```c
* handle = aiot_ota_init();
* ...
* aiot_ota_report_version(handle, "1.0.0");
* ```
*
* @param[in] handle ota实例句柄的指针
* @param[in] version
*
* @return int32_t
* @retval STATE_OTA_REPORT_HANDLE_IS_NULL ota句柄为空
* @retval STATE_OTA_REPORT_VERSION_IS_NULL
* @retval STATE_OTA_REPORT_MQTT_HANDLE_IS_NULL ota_handle句柄中的mqtt句柄为空
* @retval STATE_OTA_REPORT_FAILED
* @retval STATE_SUCCESS
*
*/
int32_t aiot_ota_report_version(void *handle, char *version);
/**
* @brief
*
* @param[in] handle ota实例句柄
* @param[in] product_key product_key
* @param[in] device_name
* @param[in] version
*
* @return int32_t
* @retval STATE_SUCCESS
* @retval STATE_OTA_REPORT_EXT_HANELD_IS_NULL ota句柄为空
* @retval STATE_OTA_REPORT_EXT_VERSION_NULL
* @retval STATE_OTA_REPORT_EXT_PRODUCT_KEY_IS_NULL product_key输入为空
* @retval STATE_OTA_REPORT_EXT_DEVICE_NAME_IS_NULL device_name输入为空
* @retval STATE_OTA_REPORT_EXT_MQTT_HANDLE_IS_NULL ota句柄中的mqtt_handle为空
* @retval STATE_OTA_REPORT_FAILED
*
*/
int32_t aiot_ota_report_version_ext(void *handle, char *product_key, char *device_name, char *version);
/**
* @brief ota句柄的参数
*
* @details
*
* OTA会话进行配置,
*
* + `AIOT_OTAOPT_MQTT_HANDLE`: @ref aiot_mqtt_init MQTT会话句柄跟OTA会话关联起来
* + `AIOT_OTAOPT_RECV_HANDLER`: OTA消息的数据处理回调, OTA消息的时候, @ref aiot_mqtt_recv
*
* @param[in] handle ota句柄
* @param[in] option , @ref aiot_ota_option_t
* @param[in] data , @ref aiot_ota_option_t
*
* @return int32_t
* @retval STATE_OTA_SETOPT_HANDLE_IS_NULL ota句柄为空
* @retval STATE_OTA_SETOPT_DATA_IS_NULL data字段为空
* @retval STATE_USER_INPUT_UNKNOWN_OPTION option不支持
* @retval STATE_SUCCESS
*
*/
int32_t aiot_ota_setopt(void *handle, aiot_ota_option_t option, void *data);
/**
* @brief download实例并设置默认参数
*
* @return void*
* @retval NULL download实例句柄
* @retval NULL , portfile, download或者http实例
*
*/
void *aiot_download_init();
/**
* @brief download实例句柄的资源
*
* @param[in] handle download实例句柄的指针
*
* @return int32_t
* @retval STATE_DOWNLOAD_DEINIT_HANDLE_IS_NULL handle或者handle指向的内容为空
* @retval STATE_SUCCESS
*
*/
int32_t aiot_download_deinit(void **handle);
/**
* @brief download实例句柄下载一段buffer
*
* @details
*
* OTA消息, , HTTP下载固件内容
*
* , , @ref aiot_download_setopt SDK
*
* @param[in] handle download实例句柄的指针
*
* @return int32_t
* @retval >STATE_SUCCESS
* @retval STATE_DOWNLOAD_HTTPRSP_CODE_ERROR 使url链接不可访问, code并非200或者206
* @retval STATE_DOWNLOAD_FINISHED
* @retval STATE_DOWNLOAD_RANGE_FINISHED ,
* @retval STATE_DOWNLOAD_HTTPRSP_HEADER_ERROR 访http的回复报文中并没有Content-Length字段
* @retval STATE_DOWNLOAD_RECV_HANDLE_IS_NULL download句柄为空
* @retval STATE_DOWNLOAD_RENEWAL_REQUEST_SENT
* @retval @ref aiot_state_api.h
*
*/
int32_t aiot_download_recv(void *handle); /* 返回条件: 网络出错 | 校验出错 | 读到EOF | buf填满 */
/**
* @brief download句柄参数
*
* @details
*
* ,
*
* + `AIOT_DLOPT_RECV_HANDLER`: SDK, SDK收到固件内容的时候,
* + `AIOT_DLOPT_NETWORK_CRED`: HTTP还是走HTTPS下载固件内容
* + `AIOT_DLOPT_BODY_BUFFER_MAX_LEN`: , SDK下载中, , , ,
*
* @param[in] handle download句柄
* @param[in] option , @ref aiot_download_option_t
* @param[in] data , @ref aiot_download_option_t
*
* @return int32_t
* @retval STATE_SUCCESS
* @retval STATE_DOWNLOAD_SETOPT_HANDLE_IS_NULL download句柄为空
* @retval STATE_DOWNLOAD_SETOPT_DATA_IS_NULL data字段为空
* @retval STATE_DOWNLOAD_SETOPT_COPIED_DATA_IS_NULL task_desc失败
* @retval STATE_DOWNLOAD_SETOPT_MALLOC_SHA256_CTX_FAILED shs256算法的context分配内存失败
* @retval STATE_DOWNLOAD_SETOPT_MALLOC_MD5_CTX_FAILED MD5算法的context分配内存失败
* @retval @ref aiot_state_api.h
*
*/
int32_t aiot_download_setopt(void *handle, aiot_download_option_t option, void *data);
/**
* @brief
*
* @details
*
* , ,
*
* + , , , percent参数, SDK会自动计算好,
* + , , @ref aiot_ota_protocol_errcode_t
* + @ref aiot_download_report_progress , OTA升级进度, OTA升级失败等
*
* @param[in] handle download句柄
* @param[in] percent
*
* @return int32_t
* @retval STATE_SUCCESS
* @retval STATE_DOWNLOAD_REPORT_HANDLE_IS_NULL handle为空
* @retval STATE_DOWNLOAD_REPORT_TASK_DESC_IS_NULL task_desc为空, product_key, device_name
* @retval @ref aiot_state_api.h
*
*/
int32_t aiot_download_report_progress(void *handle, int32_t percent);
/**
* @brief GET固件报文请求
*
* @details
*
* OTA消息回调函数知道了固件下载地址后, ,
*
* + `AIOT_DLOPT_RANGE_START``AIOT_DLOPT_RANGE_END`
* + , SDK会整段去请求固件内容, 1buffer就会通知用户1次, buffer长度用`AIOT_DLOPT_BODY_BUFFER_MAX_LEN`
*
* @param[in] handle download句柄, url等信息
*
* @return int32_t
* @retval STATE_SUCCESS
* @retval STATE_DOWNLOAD_REQUEST_HANDLE_IS_NULL GET请求的时候handle为空
* @retval STATE_DOWNLOAD_REQUEST_URL_IS_NULL GET请求的时候task_desc不为空, url为空
* @retval STATE_DOWNLOAD_SEND_REQUEST_FAILED GET请求的时候http底层发包逻辑报错
* @retval STATE_DOWNLOAD_REQUEST_TASK_DESC_IS_NULL GET请求的时候task_desc字段为空
* @retval @ref aiot_state_api.h
*/
int32_t aiot_download_send_request(void *handle);
/**
* @brief -0x0900~-0x09FFSDK在OTA模块内的状态码, 使`STATE_DOWNLOAD_XXX`
*
*/
#define STATE_OTA_BASE (-0x0900)
/**
* @brief OTA固件下载已完成,
*
*/
#define STATE_OTA_DIGEST_MATCH (-0x0901)
/**
* @brief OTA下载进度消息或固件版本号消息上报到服务器时遇到失败
*
*/
#define STATE_OTA_REPORT_FAILED (-0x0902)
/**
* @brief OTA模块收取固件内容数据时出现错误
*
*/
#define STATE_DOWNLOAD_RECV_ERROR (-0x0903)
/**
* @brief OTA模块下载固件时出现校验和签名验证错误
*
* @details
*
* md5或者sha256计算结果跟云端通知的期望值不匹配所致的错误
*
*/
#define STATE_OTA_DIGEST_MISMATCH (-0x0904)
/**
* @brief OTA模块解析服务器下推的MQTT下行JSON报文时出错
*
* @details
*
* JSON报文中, key, value
*
*/
#define STATE_OTA_PARSE_JSON_ERROR (-0x0905)
/**
* @brief OTA模块发送HTTP报文,
*
* @details
*
* OTA模块往存储固件的服务器发送GET请求失败
*
*/
#define STATE_DOWNLOAD_SEND_REQUEST_FAILED (-0x0906)
/**
* @brief OTA模块下载固件内容已到达之前设置的range末尾,
*
* @details
*
* range下载的时候已经下载到了range_end字段指定的地方. , SDK返回返回错误码提示用户
*
*/
#define STATE_DOWNLOAD_RANGE_FINISHED (-0x0907)
/**
* @brief OTA模块为解析JSON报文而申请内存时,
*
*/
#define STATE_OTA_PARSE_JSON_MALLOC_FAILED (-0x0908)
/**
* @brief OTA会话实例时, ,
*
*/
#define STATE_OTA_DEINIT_HANDLE_IS_NULL (-0x0909)
/**
* @brief OTA会话实例时, ,
*
*/
#define STATE_OTA_SETOPT_HANDLE_IS_NULL (-0x090A)
/**
* @brief OTA会话实例时, ,
*
*/
#define STATE_OTA_SETOPT_DATA_IS_NULL (-0x090B)
/**
* @brief , ,
*
*/
#define STATE_DOWNLOAD_DEINIT_HANDLE_IS_NULL (-0x090C)
/**
* @brief , ,
*
*/
#define STATE_DOWNLOAD_SETOPT_HANDLE_IS_NULL (-0x090D)
/**
* @brief , ,
*
*/
#define STATE_DOWNLOAD_SETOPT_DATA_IS_NULL (-0x090E)
/**
* @brief , OTA会话同步配置发生内部错误,
*
*/
#define STATE_DOWNLOAD_SETOPT_COPIED_DATA_IS_NULL (-0x090F)
/**
* @brief , OTA句柄为空,
*
*/
#define STATE_OTA_REPORT_HANDLE_IS_NULL (-0x0910)
/**
* @brief , ,
*
*/
#define STATE_OTA_REPORT_VERSION_IS_NULL (-0x0911)
/**
* @brief , MQTT句柄为空,
*
*/
#define STATE_OTA_REPORT_MQTT_HANDLE_IS_NULL (-0x0912)
/**
* @brief , OTA句柄为空,
*
*/
#define STATE_OTA_REPORT_EXT_HANELD_IS_NULL (-0x0913)
/**
* @brief , ,
*
*/
#define STATE_OTA_REPORT_EXT_VERSION_NULL (-0x0914)
/**
* @brief , productKey为空,
*
*/
#define STATE_OTA_REPORT_EXT_PRODUCT_KEY_IS_NULL (-0x0915)
/**
* @brief , deviceName为空,
*
*/
#define STATE_OTA_REPORT_EXT_DEVICE_NAME_IS_NULL (-0x0916)
/**
* @brief , MQTT会话句柄为空,
*
*/
#define STATE_OTA_REPORT_EXT_MQTT_HANDLE_IS_NULL (-0x0917)
/**
* @brief OTA错误码时, ,
*
*/
#define STATE_DOWNLOAD_REPORT_HANDLE_IS_NULL (-0x0918)
/**
* @brief OTA错误码时, ,
*
*/
#define STATE_DOWNLOAD_REPORT_TASK_DESC_IS_NULL (-0x0919)
/**
* @brief aiot_download_recv接收固件内容时, ,
*
*/
#define STATE_DOWNLOAD_RECV_HANDLE_IS_NULL (-0x091A)
/**
* @brief aiot_download_send_request发送固件下载请求时, ,
*
*/
#define STATE_DOWNLOAD_REQUEST_HANDLE_IS_NULL (-0x091B)
/**
* @brief aiot_download_send_request发送固件下载请求时, ,
*
*/
#define STATE_DOWNLOAD_REQUEST_TASK_DESC_IS_NULL (-0x091C)
/**
* @brief aiot_download_send_request发送固件下载请求时, URL为空,
*
*/
#define STATE_DOWNLOAD_REQUEST_URL_IS_NULL (-0x091D)
/**
* @brief OTA的MQTT下行报文时, digest方法并非md5或sha256, SDK不支持
*
*/
#define STATE_OTA_UNKNOWN_DIGEST_METHOD (-0x091E)
/**
* @brief (),
*
*/
#define STATE_DOWNLOAD_FINISHED (-0x091F)
/**
* @brief GET请求时, HTTP报文中Status Code错误, 200, 206
*
*/
#define STATE_DOWNLOAD_HTTPRSP_CODE_ERROR (-0x0920)
/**
* @brief GET请求时, HTTP报文header里, Content-Length
*
*/
#define STATE_DOWNLOAD_HTTPRSP_HEADER_ERROR (-0x0921)
/**
* @brief OTA固件下载失败后, , SDK向服务端重新发起了下载请求
*
*/
#define STATE_DOWNLOAD_RENEWAL_REQUEST_SENT (-0x0922)
/**
* @brief OTA模块为计算固件的SHA256校验和申请内存时遇到失败
*
*/
#define STATE_DOWNLOAD_SETOPT_MALLOC_SHA256_CTX_FAILED (-0x0923)
/**
* @brief OTA模块为计算固件的MD5校验和内存时遇到失败
*
*/
#define STATE_DOWNLOAD_SETOPT_MALLOC_MD5_CTX_FAILED (-0x0924)
/**
* @brief OTA模块从任务描述数据结构中解析固件下载URL时, HOST字段为空,
*
*/
#define STATE_OTA_PARSE_URL_HOST_IS_NULL (-0x0925)
/**
* @brief OTA模块从任务描述数据结构中解析固件下载URL时, PATH字段为空,
*
*/
#define STATE_OTA_PARSE_URL_PATH_IS_NULL (-0x0926)
/**
* @brief OTA模块分多段下载固件时,
*
* @details range来下载, range之间存在重叠等原因,
*
*/
#define STATE_DOWNLOAD_FETCH_TOO_MANY (-0x0927)
/**
* @brief OTA的升级任务时, OTA句柄为空
*
* @details aiot_ota_init函数来初始化一个OTA句柄, aiot_ota_query_firmware. ,
* ,
*
*/
#define STATE_OTA_QUERY_FIRMWARE_HANDLE_IS_NULL (-0x0928)
/**
* @brief OTA下行报文中url字段中的host字段超出长度限制
*
* @details OTA的下行报文中, url. url中包含host字段, host字段超出限制(1024),
*
*/
#define STATE_OTA_HOST_STRING_OVERFLOW (-0x0929)
/**
* @brief OTA下行报文中url字段中的path字段超出长度限制
*
* @details OTA的下行报文中, url. url中包含path字段, path字段超出限制(1024),
*
*/
#define STATE_OTA_PATH_STRING_OVERFLOW (-0x092A)
#if defined(__cplusplus)
}
#endif
#endif /* #ifndef __AIOT_OTA_API_H__ */