esp_https_ota.rst 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. ESP HTTPS OTA 升级
  2. ====================
  3. :link_to_translation:`en:[English]`
  4. 概述
  5. --------
  6. ``esp_https_ota`` 是现有 OTA(空中升级)API 的抽象层,其中提供了简化的 API,能够通过 HTTPS 升级固件。
  7. 应用示例
  8. -------------------
  9. .. code-block:: c
  10. esp_err_t do_firmware_upgrade()
  11. {
  12. esp_http_client_config_t config = {
  13. .url = CONFIG_FIRMWARE_UPGRADE_URL,
  14. .cert_pem = (char *)server_cert_pem_start,
  15. };
  16. esp_https_ota_config_t ota_config = {
  17. .http_config = &config,
  18. };
  19. esp_err_t ret = esp_https_ota(&ota_config);
  20. if (ret == ESP_OK) {
  21. esp_restart();
  22. } else {
  23. return ESP_FAIL;
  24. }
  25. return ESP_OK;
  26. }
  27. 服务器验证
  28. -------------------
  29. 验证服务器时,应将 PEM 格式的根证书提供给 :cpp:member:`esp_http_client_config_t::cert_pem` 成员。如需了解有关服务器验证的更多信息,请参阅 :ref:`esp_tls_server_verification`。
  30. .. note::
  31. 应使用服务器端点的 **根** 证书应用于验证,而不能使用证书链中的任何中间证书,因为根证书有效期最长,且通常长时间维持不变。用户还可以通过 :cpp:member:`esp_http_client_config_t::crt_bundle_attach` 成员使用 ``ESP x509 证书包`` 功能进行验证,其中涵盖了大多数受信任的根证书。
  32. 通过 HTTPS 下载部分镜像
  33. ---------------------------------
  34. 要使用部分镜像下载功能,请启用 ``esp_https_ota_config_t`` 中的 ``partial_http_download`` 配置。启用此配置后,固件镜像将通过多个指定大小的 HTTP 请求进行下载。将 ``max_http_request_size`` 设置为所需值,即可指定每个请求的最大内容长度。
  35. 在从 AWS S3 等服务获取镜像时,这一选项非常有用。在启用该选项时, 可以将 mbedTLS Rx 的 buffer 大小(即 :ref:`CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN`)设置为较小的值。不启用此配置时,无法将其设置为较小值。
  36. mbedTLS Rx buffer 的默认大小为 16 KB,但如果将 ``partial_http_download`` 的 ``max_http_request_size`` 设置为 4 KB,便能将 mbedTLS Rx 的 buffer 减小到 4 KB。使用这一配置方式预计可以节省约 12 KB 内存。
  37. 签名验证
  38. ----------------------
  39. 要进一步提升安全性,还可以验证 OTA 固件镜像的签名。更多内容请参考 :ref:`secure-ota-updates`。
  40. 高级 API
  41. -------------
  42. ``esp_https_ota`` 还提供一些高级 API,用于查看 OTA 过程的更多信息并满足其他控制需求。
  43. 如需查看使用高级 ESP_HTTPS_OTA API 的示例,请前往 :example:`system/ota/advanced_https_ota`。
  44. .. _ota_updates_pre-encrypted-firmware:
  45. 使用预加密固件进行 OTA 升级
  46. ----------------------------------------
  47. 如需使用预加密的固件进行 OTA 升级,请在组件的菜单配置中启用 :ref:`CONFIG_ESP_HTTPS_OTA_DECRYPT_CB` 选项。
  48. 如需查看使用预加密固件进行 OTA 升级的示例,请前往 :example:`system/ota/pre_encrypted_ota`。
  49. OTA 系统事件
  50. -----------------
  51. ESP HTTPS OTA 过程中可能发生各种系统事件。当特定事件发生时,会由 :doc:`../system/esp_event` 触发处理程序。此处理程序必须使用 :cpp:func:`esp_event_handler_register` 注册。这有助于 ESP HTTPS OTA 进行事件处理。
  52. :cpp:enum:`esp_https_ota_event_t` 中包含了使用 ESP HTTPS OTA 升级时可能发生的所有事件。
  53. 事件处理程序示例
  54. ^^^^^^^^^^^^^^^^^^^^^
  55. .. code-block:: c
  56. /* 用于捕获系统事件的事件处理程序 */
  57. static void event_handler(void* arg, esp_event_base_t event_base,
  58. int32_t event_id, void* event_data)
  59. {
  60. if (event_base == ESP_HTTPS_OTA_EVENT) {
  61. switch (event_id) {
  62. case ESP_HTTPS_OTA_START:
  63. ESP_LOGI(TAG, "OTA started");
  64. break;
  65. case ESP_HTTPS_OTA_CONNECTED:
  66. ESP_LOGI(TAG, "Connected to server");
  67. break;
  68. case ESP_HTTPS_OTA_GET_IMG_DESC:
  69. ESP_LOGI(TAG, "Reading Image Description");
  70. break;
  71. case ESP_HTTPS_OTA_VERIFY_CHIP_ID:
  72. ESP_LOGI(TAG, "Verifying chip id of new image: %d", *(esp_chip_id_t *)event_data);
  73. break;
  74. case ESP_HTTPS_OTA_DECRYPT_CB:
  75. ESP_LOGI(TAG, "Callback to decrypt function");
  76. break;
  77. case ESP_HTTPS_OTA_WRITE_FLASH:
  78. ESP_LOGD(TAG, "Writing to flash: %d written", *(int *)event_data);
  79. break;
  80. case ESP_HTTPS_OTA_UPDATE_BOOT_PARTITION:
  81. ESP_LOGI(TAG, "Boot partition updated. Next Partition: %d", *(esp_partition_subtype_t *)event_data);
  82. break;
  83. case ESP_HTTPS_OTA_FINISH:
  84. ESP_LOGI(TAG, "OTA finish");
  85. break;
  86. case ESP_HTTPS_OTA_ABORT:
  87. ESP_LOGI(TAG, "OTA abort");
  88. break;
  89. }
  90. }
  91. }
  92. 系统事件循环中,不同 ESP HTTPS OTA 事件的预期数据类型如下所示:
  93. - ESP_HTTPS_OTA_START : ``NULL``
  94. - ESP_HTTPS_OTA_CONNECTED : ``NULL``
  95. - ESP_HTTPS_OTA_GET_IMG_DESC : ``NULL``
  96. - ESP_HTTPS_OTA_VERIFY_CHIP_ID : ``esp_chip_id_t``
  97. - ESP_HTTPS_OTA_DECRYPT_CB : ``NULL``
  98. - ESP_HTTPS_OTA_WRITE_FLASH : ``int``
  99. - ESP_HTTPS_OTA_UPDATE_BOOT_PARTITION : ``esp_partition_subtype_t``
  100. - ESP_HTTPS_OTA_FINISH : ``NULL``
  101. - ESP_HTTPS_OTA_ABORT : ``NULL``
  102. API 参考
  103. -------------
  104. .. include-build-file:: inc/esp_https_ota.inc