hilink_ota.h 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /*
  2. * Copyright (c) Huawei Technologies Co., Ltd. 2018-2021. All rights reserved.
  3. * Description: 此文件提供了升级相关的接口实现示例;
  4. * 其中升级相关功能的接口需要开发者或厂商进行实现,HiLink SDK在收到升级相关命令时会调用对应接口;
  5. * 请开发者仔细阅读文件中的注释说明,参考或修改实现。
  6. */
  7. #ifndef HILINK_OTA_H
  8. #define HILINK_OTA_H
  9. #ifdef __cplusplus
  10. extern "C" {
  11. #endif
  12. // 返回正常
  13. #define RETURN_OK 0
  14. // 没有MCU
  15. #define RETURN_ERROR_NO_MCU (-1)
  16. // MCU返回其他错误
  17. #define RETURN_ERROR (-2)
  18. // MCU不需要升级
  19. #define RETURN_MCU_NO_NEED_OTA (-3)
  20. // 模组可以重启
  21. #define MODULE_CAN_REBOOT 1
  22. // 模组不能重启
  23. #define MODULE_CANNOT_REBOOT 0
  24. // 手动升级
  25. #define UPDATE_TYPE_MANUAL 0
  26. // 自动升级
  27. #define UPDATE_TYPE_AUTO 1
  28. // 开始发送MCU数据
  29. #define START_SEND_DATA 0
  30. // 发送MCU数据结束
  31. #define STOP_SEND_DATA 1
  32. // 异常终止
  33. #define SEND_DATA_ERROR 2
  34. typedef enum {
  35. SUB_DEV_UPDATE_SUCCESS = 0,
  36. SUB_DEV_UPDATE_FAIL
  37. } SubDevUpdateStatus;
  38. typedef void (*GetOtaVerCb)(const char *version);
  39. /*
  40. * 获取MCU当前版本
  41. * version表示版本字符串
  42. * inLen表示输入字符串长度
  43. * outLen表示输出字符串长度
  44. * 返回值是RETURN_OK时,表示获取成功
  45. * 返回值是RETURN_ERROR_NO_MCU时,表示没有MCU
  46. * 返回值是RETURN_ERROR时,表示获取失败
  47. * 注意:如果获取不到MCU的版本,则不对MCU进行升级。
  48. * 建议厂商在MCU正常启动后,或升级启动后,就将MCU的版本号传递给模组,确保模组可以获取到MCU的版本。
  49. */
  50. int HilinkGetMcuVersion(char *version, unsigned int inLen, unsigned int *outLen);
  51. /*
  52. * 开始模组升级
  53. * type表示升级类型
  54. * 当type是UPDATE_TYPE_MANUAL时,表示本次升级流程是由用户主动发起的手动升级
  55. * 当type是UPDATE_TYPE_AUTO时,表示本次升级流程是经过用户同意的自动升级
  56. * 返回值是RETURN_OK时,表示处理成功,HiLink SDK将开始启动升级流程
  57. * 返回值是RETURN_ERROR时,表示处理不成功,HiLink SDK将终止本次升级流程
  58. * 注意:在手动场景场景下,HiLink SDK在接收到用户发出的升级指令后,将直接调用此接口;
  59. * 在自动升级场景下,当HiLink SDK在调用HilinkGetRebootFlag接口返回值是MODULE_CAN_REBOOT时,HiLink SDK将调用此接口。
  60. * 厂商可在此接口中完成和升级流程相关的处理。
  61. * 开机后10分钟到1小时内随机时间检测一次是否有新版本,之后以当前时间为起点,23小时加1小时内随机值周期性检测新版本。
  62. * 如果用户打开了自动升级开关,检测到有新版本并且是可以重启的情况下,就进行新版本的下载,下载完成后自动重启。
  63. * 自动升级流程可能在凌晨进行,因此厂商在实现升级流程相关功能时,确保在升级的下载安装固件和重启设备时避免对用户产生
  64. * 影响,比如发出声音,光亮等。
  65. */
  66. int HilinkOtaStartProcess(int type);
  67. /*
  68. * 模组升级结束
  69. * status表示升级结果
  70. * 当status是100时,表示升级成功
  71. * 当status不是100时,表示升级失败
  72. * 返回值是RETURN_OK时,表示处理成功,HiLink SDK将置升级标志或切换运行区标志
  73. * 返回值不是RETURN_OK时,表示处理不成功,HiLink SDK将终止本次升级流程
  74. * 注意:HiLink SDK在将固件写入到OTA升级区后,且完整性校验通过后,将调用厂商适配的此接口;
  75. * 厂商可在此接口中完成和升级流程相关的处理。
  76. * 开机后10分钟到1小时内随机时间检测一次是否有新版本,之后以当前时间为起点,23小时加1小时内随机值周期性检测新版本。
  77. * 如果用户打开了自动升级开关,检测到有新版本并且是可以重启的情况下,就进行新版本的下载,下载完成后自动重启。
  78. * 自动升级流程可能在凌晨进行,因此厂商在实现升级流程相关功能时,确保在升级的下载安装固件和重启设备时避免对用户产生
  79. * 影响,比如发出声音,光亮等;升级类型是否为自动升级可参考接口HilinkOtaStartProcess的参数type的描述。
  80. */
  81. int HilinkOtaEndProcess(int status);
  82. /*
  83. * 判断模组是否能立即升级并重启
  84. * 返回值是MODULE_CAN_REBOOT时,表示模组可以立即升级并重启,HiLink SDK将开始自动升级流程。
  85. * 返回值是MODULE_CANNOT_REBOOT时,表示模组不能立即升级并重启,HiLink SDK将不进行本次自动升级流程。
  86. * 注意:在用户同意设备可以自动升级的情况下,HiLink SDK调用此接口获取设备当前业务状态下,模组是否可以立即升级并重启的标志。
  87. * 只有当设备处于业务空闲状态时,接口才可以返回MODULE_CAN_REBOOT。
  88. * 当设备处于业务非空闲状态时,接口返回MODULE_CANNOT_REBOOT。
  89. */
  90. int HilinkGetRebootFlag();
  91. /*
  92. * HiLink SDK调用厂商适配的此接口通知MCU固件传输的状态
  93. * flag表示升级流程标志
  94. * 当flag是START_SEND_DATA时,表示通知模组即将开始发送MCU固件数据包
  95. * 当flag是STOP_SEND_DATA时,表示通知模组完整的MCU固件包已发送完成
  96. * 当flag是SEND_DATA_ERROR时,表示通知模组本次MCU固件升级异常终止
  97. * len表示MCU固件包的大小
  98. * type表示升级类型
  99. * 当type是UPDATE_TYPE_MANUAL时,表示本次升级流程是由用户主动发起的手动升级
  100. * 当type是UPDATE_TYPE_AUTO时,表示本次升级流程是经过用户同意的自动升级
  101. * 返回值是RETURN_OK时,表示处理成功,HiLink SDK继续正常处理后续流程
  102. * 返回值是RETURN_ERROR时,表示处理失败,HiLink SDK将终止本次MCU升级流程
  103. * 注意:当flag是STOP_SEND_DATA时,此接口需返回MCU侧固件升级的结果;当flag是其它值时,需返回接口接收到此消息后的处理结果。
  104. * 开机后10分钟到1小时内随机时间检测一次是否有新版本,之后以当前时间为起点,23小时加1小时内随机值周期性检测新版本。
  105. * 如果用户打开了自动升级开关,检测到有新版本并且是可以重启的情况下,就进行新版本的下载,下载完成后自动重启。
  106. * 自动升级流程可能在凌晨进行,因此厂商在实现升级流程相关功能时,确保在升级的下载安装固件和重启设备时避免对用户产生
  107. * 影响,比如发出声音,光亮等。
  108. */
  109. int HilinkNotifyOtaStatus(int flag, unsigned int len, unsigned int type);
  110. /*
  111. * HiLink SDK调用厂商适配的此接口通知厂商发送MCU固件文件数据
  112. * data表示发送的数据
  113. * len表示发送的数据的长度
  114. * offset表示发送的数据起始位置相对于完整固件包的偏移量
  115. * 此接口需要返回MCU接收这部分数据的处理结果
  116. * 返回值是RETURN_OK时,模组将通知的数据正确发送给MCU,且MCU正确处理发送的数据,HiLink SDK将继续正常处理后续流程
  117. * 返回值是RETURN_ERROR时,模组或MCU未能正常处理通知的MCU的固件文件数据,HiLink SDK将终止本次MCU固件升级流程
  118. */
  119. int HilinkNotifyOtaData(const unsigned char *data, unsigned int len, unsigned int offset);
  120. /*
  121. * 获取设备升级文件保存路径
  122. * filePath表示设备升级文件保存路径
  123. * len表示设备升级文件保存路径的长度
  124. * 返回值是RETURN_OK时,表示获取成功
  125. * 返回值是RETURN_ERROR时,表示获取失败
  126. * 注意:Linux系统和安卓系统需要适配此接口,其他操作系统不用适配此接口。
  127. * HiLink SDK下载的设备升级文件需保存在设备上的某个文件路径下;
  128. * 此文件路径,需由厂商适配提供,例如“/var/update.bin”。
  129. */
  130. int HILINK_GetUpdateFilePath(char *filePath, unsigned int len);
  131. /*
  132. * 厂商适配此接口提供设备上能够保存的升级文件的最大大小,
  133. * 避免当HiLink SDK下载的升级文件大小大于分区大小时,导致升级失败。
  134. * 注意:Linux系统和安卓系统需要适配此接口,其他操作系统不用适配此接口。
  135. */
  136. unsigned int HILINK_GetMaxUpdateFileSize(void);
  137. /*
  138. * 启动软件安装
  139. * 返回值是RETURN_OK时,表示启动成功
  140. * 返回值是RETURN_ERROR时,表示启动失败
  141. * 注意:Linux系统和安卓系统需要适配此接口,其他操作系统不用适配此接口。
  142. * HiLink SDK完成新版本的检测和下载流程后,由厂商实现软件安装流程。
  143. * HiLink SDK调用此接口后便会退出升级流程,交由厂商的安装程序来完成软件的安装。
  144. */
  145. int HILINK_StartSoftwareIntall(void);
  146. /*
  147. * 获取桥下子设备的当前版本
  148. * version返回同一proId品类的最低版本号
  149. * 返回值是RETURN_OK时,表示获取成功,反之失败
  150. */
  151. int HILINK_GetBrgSubDevVersion(const char *proId, unsigned int proIdLen,
  152. char *version, unsigned int versionLen);
  153. /*
  154. * HiLink SDK调用厂商适配的此接口通知厂商桥下子设备的hota最新版本号
  155. * version表示同一proId品类的最新版本号
  156. * 返回值是RETURN_OK时,表示获取成功,反之失败
  157. */
  158. int HILINK_NotifyBrgSubDevNewVersion(const char *proId, unsigned int proIdLen, const char *version,
  159. unsigned int versionLen);
  160. /*
  161. * HiLink SDK调用厂商适配的此接口通知厂商发送桥下子设备固件数据
  162. * data表示发送的数据
  163. * len表示发送的数据的长度
  164. * offset表示发送的数据起始位置相对于完整固件包的偏移量
  165. * 返回值是RETURN_OK时,表示接收成功,反之失败
  166. */
  167. int HILINK_NotifyBrgSubDevOtaData(const char *proId, unsigned int proIdLen,
  168. const unsigned char *data, unsigned int len, unsigned int offset);
  169. /*
  170. * HiLink SDK调用厂商适配的此接口通知桥下子设备固件传输的状态
  171. * flag表示升级流程标志
  172. * 当flag是START_SEND_DATA时,表示通知模组即将开始发送桥下子设备固件数据包
  173. * 当flag是STOP_SEND_DATA时,表示通知模组完整的桥下子设备固件包已发送完成
  174. * 当flag是SEND_DATA_ERROR时,表示通知模组本次桥下子设备固件升级异常终止
  175. * len表示MCU固件包的大小
  176. * type表示升级类型
  177. * 当type是UPDATE_TYPE_MANUAL时,表示本次升级流程是由用户主动发起的手动升级
  178. * 当type是UPDATE_TYPE_AUTO时,表示本次升级流程是经过用户同意的自动升级
  179. * 返回值是RETURN_OK时,表示处理成功,HiLink SDK继续正常处理后续流程
  180. * 返回值是RETURN_ERROR时,表示处理失败,HiLink SDK将终止本次桥下子设备升级流程
  181. * 注意:当flag是STOP_SEND_DATA时,此接口需返回桥下子设备侧固件升级的结果;当flag是其它值时,需返回接口接收到此消息后的处理结果。
  182. * 开机后10分钟到1小时内随机时间检测一次是否有新版本,如果用户打开了自动升级开关,检测到有新版本并且是可以重启的情况下,
  183. * 就进行新版本的下载,下载完成后自动重启。
  184. */
  185. int HILINK_NotifyBrgSubDevOtaStatus(const char *proId, unsigned int proIdLen, int flag,
  186. unsigned int len, unsigned int type);
  187. /*
  188. * 上报给模组桥下子设备的升级进度
  189. * progress合法值是[0,100],建议5%递增上报,无需频繁上报。
  190. * 注意:该接口只能在支持子设备升级的SDK版本中调用
  191. */
  192. void HILINK_ReportBrgSubDevUpdateProgress(const char *proId, unsigned int proIdLen, int progress);
  193. /*
  194. * 上报给模组桥下子设备的升级状态
  195. * 上报的状态在SubDevUpdateStatus枚举中
  196. * 无论是成功还是失败,都需要确保升级结束后将升级状态上报给模组。
  197. */
  198. void HILINK_ReportBrgSubDevUpdateStatus(const char *proId, unsigned int proIdLen, SubDevUpdateStatus status);
  199. /*
  200. * 触发设备的ota新版本检测
  201. * 检测到的版本,sdk将通过cb回调函数上报。如果不需要获取版本号,则可将cb置空。
  202. * 上报的version如果为空,则未成功获取到新版本。
  203. * 注意:1、建议调用频次最多一天一次
  204. * 2、首次通过手机配网成功后不能调用,建议连云成功后至少5s后调用
  205. */
  206. void HILINK_TrigOtaVersionCheck(GetOtaVerCb cb);
  207. #ifdef __cplusplus
  208. }
  209. #endif
  210. #endif