diff --git a/components/esp_rainmaker/Kconfig.projbuild b/components/esp_rainmaker/Kconfig.projbuild index 7f94c1d..5085e68 100644 --- a/components/esp_rainmaker/Kconfig.projbuild +++ b/components/esp_rainmaker/Kconfig.projbuild @@ -109,6 +109,15 @@ menu "ESP RainMaker Config" help Default SNTP Server which is used for time synchronization. + config ESP_RMAKER_DISABLE_USER_MAPPING_PROV + bool "Disable User Mapping during Provisioning" + default n + help + The handlers for User Node Mapping are now registered internally by ESP RainMaker core, + by registering to appropriate Wi-Fi Provisioning events. If your application code also + has the calls to create and register the user mapping handlers, enable this config + option to prevent duplication. + choice ESP_RMAKER_CONSOLE_UART_NUM prompt "UART for console input" default ESP_RMAKER_CONSOLE_UART_NUM_0 diff --git a/components/esp_rainmaker/include/esp_rmaker_user_mapping.h b/components/esp_rainmaker/include/esp_rmaker_user_mapping.h index 5c24e5f..a763561 100644 --- a/components/esp_rainmaker/include/esp_rmaker_user_mapping.h +++ b/components/esp_rainmaker/include/esp_rmaker_user_mapping.h @@ -29,7 +29,7 @@ extern "C" * @return ESP_OK on success * @return error on failure */ -esp_err_t esp_rmaker_user_mapping_endpoint_create(); +esp_err_t esp_rmaker_user_mapping_endpoint_create(void); /** * Register User Mapping Endpoint @@ -41,7 +41,7 @@ esp_err_t esp_rmaker_user_mapping_endpoint_create(); * @return ESP_OK on success * @return error on failure */ -esp_err_t esp_rmaker_user_mapping_endpoint_register(); +esp_err_t esp_rmaker_user_mapping_endpoint_register(void); /** Add User-Node mapping * diff --git a/components/esp_rainmaker/src/core/esp_rmaker_core.c b/components/esp_rainmaker/src/core/esp_rmaker_core.c index 908fe93..12655a6 100644 --- a/components/esp_rainmaker/src/core/esp_rmaker_core.c +++ b/components/esp_rainmaker/src/core/esp_rmaker_core.c @@ -144,6 +144,9 @@ static esp_err_t esp_rmaker_deinit_priv_data(esp_rmaker_priv_data_t *rmaker_priv if (rmaker_priv_data->work_queue) { vQueueDelete(rmaker_priv_data->work_queue); } +#ifndef CONFIG_ESP_RMAKER_DISABLE_USER_MAPPING_PROV + esp_rmaker_user_mapping_prov_deinit(); +#endif #ifdef ESP_RMAKER_CLAIM_ENABLED if (rmaker_priv_data->claim_data) { esp_rmaker_claim_data_free(rmaker_priv_data->claim_data); @@ -221,6 +224,14 @@ static esp_err_t esp_rmaker_init(const esp_rmaker_config_t *config) ESP_LOGE(TAG, "ESP RainMaker Queue Creation Failed"); return ESP_ERR_NO_MEM; } +#ifndef CONFIG_ESP_RMAKER_DISABLE_USER_MAPPING_PROV + if (esp_rmaker_user_mapping_prov_init()) { + esp_rmaker_deinit_priv_data(esp_rmaker_priv_data); + esp_rmaker_priv_data = NULL; + ESP_LOGE(TAG, "Could not initialise User-Node mapping."); + return ESP_FAIL; + } +#endif /* !CONFIG_ESP_RMAKER_DISABLE_USER_MAPPING_PROV */ esp_rmaker_priv_data->mqtt_config = esp_rmaker_get_mqtt_config(); if (!esp_rmaker_priv_data->mqtt_config) { #ifdef ESP_RMAKER_CLAIM_ENABLED diff --git a/components/esp_rainmaker/src/core/esp_rmaker_internal.h b/components/esp_rainmaker/src/core/esp_rmaker_internal.h index 483c1b6..8aec1c5 100644 --- a/components/esp_rainmaker/src/core/esp_rmaker_internal.h +++ b/components/esp_rainmaker/src/core/esp_rmaker_internal.h @@ -97,7 +97,8 @@ esp_err_t esp_rmaker_attribute_delete(esp_rmaker_attr_t *attr); char *esp_rmaker_get_node_config(void); char *esp_rmaker_get_node_params(void); esp_err_t esp_rmaker_handle_set_params(char *data, size_t data_len, esp_rmaker_req_src_t src); - +esp_err_t esp_rmaker_user_mapping_prov_init(void); +esp_err_t esp_rmaker_user_mapping_prov_deinit(void); static inline esp_err_t esp_rmaker_post_event(esp_rmaker_event_t event_id, void* data, size_t data_size) { return esp_event_post(RMAKER_EVENT, event_id, data, data_size, portMAX_DELAY); diff --git a/components/esp_rainmaker/src/core/esp_rmaker_user_mapping.c b/components/esp_rainmaker/src/core/esp_rmaker_user_mapping.c index 666baec..a7d22bc 100644 --- a/components/esp_rainmaker/src/core/esp_rmaker_user_mapping.c +++ b/components/esp_rainmaker/src/core/esp_rmaker_user_mapping.c @@ -14,12 +14,14 @@ #include #include +#include #include #include #include +#include #include - #include "esp_rmaker_user_mapping.pb-c.h" +#include "esp_rmaker_internal.h" static const char *TAG = "esp_rmaker_user_mapping"; @@ -44,6 +46,28 @@ static void esp_rmaker_user_mapping_cleanup_data(esp_rmaker_user_mapping_data_t } } +static void esp_rmaker_user_mapping_event_handler(void* arg, esp_event_base_t event_base, + int event_id, void* event_data) +{ + if (event_base == WIFI_PROV_EVENT) { + switch (event_id) { + case WIFI_PROV_INIT: { + if (esp_rmaker_user_mapping_endpoint_create() != ESP_OK) { + ESP_LOGE(TAG, "Failed to create user mapping end point."); + } + break; + } + case WIFI_PROV_START: + if (esp_rmaker_user_mapping_endpoint_register() != ESP_OK) { + ESP_LOGE(TAG, "Failed to register user mapping end point."); + } + break; + default: + break; + } + } +} + static void esp_rmaker_user_mapping_cb(void *priv_data) { esp_rmaker_user_mapping_data_t *data = (esp_rmaker_user_mapping_data_t *)priv_data; @@ -86,6 +110,7 @@ esp_err_t esp_rmaker_start_user_node_mapping(char *user_id, char *secret_key) if (esp_rmaker_queue_work(esp_rmaker_user_mapping_cb, data) != ESP_OK) { goto user_mapping_error; } + esp_rmaker_user_mapping_prov_deinit(); return ESP_OK; user_mapping_error: @@ -141,13 +166,31 @@ int esp_rmaker_user_mapping_handler(uint32_t session_id, const uint8_t *inbuf, s rainmaker__rmaker_config_payload__free_unpacked(data, NULL); return ESP_OK; } -esp_err_t esp_rmaker_user_mapping_endpoint_create() +esp_err_t esp_rmaker_user_mapping_endpoint_create(void) { esp_err_t err = wifi_prov_mgr_endpoint_create(USER_MAPPING_ENDPOINT); return err; } -esp_err_t esp_rmaker_user_mapping_endpoint_register() +esp_err_t esp_rmaker_user_mapping_endpoint_register(void) { return wifi_prov_mgr_endpoint_register(USER_MAPPING_ENDPOINT, esp_rmaker_user_mapping_handler, NULL); } + +esp_err_t esp_rmaker_user_mapping_prov_init(void) +{ + int ret = ESP_OK; + ret = esp_event_handler_register(WIFI_PROV_EVENT, WIFI_PROV_INIT, &esp_rmaker_user_mapping_event_handler, NULL); + if (ret != ESP_OK) { + return ret; + } + ret = esp_event_handler_register(WIFI_PROV_EVENT, WIFI_PROV_START, &esp_rmaker_user_mapping_event_handler, NULL); + return ret; +} + +esp_err_t esp_rmaker_user_mapping_prov_deinit(void) +{ + esp_event_handler_unregister(WIFI_PROV_EVENT, WIFI_PROV_INIT, &esp_rmaker_user_mapping_event_handler); + esp_event_handler_unregister(WIFI_PROV_EVENT, WIFI_PROV_START, &esp_rmaker_user_mapping_event_handler); + return ESP_OK; +} diff --git a/examples/common/app_wifi/app_wifi.c b/examples/common/app_wifi/app_wifi.c index c5377bf..dff09b7 100644 --- a/examples/common/app_wifi/app_wifi.c +++ b/examples/common/app_wifi/app_wifi.c @@ -31,7 +31,6 @@ #include #endif /* CONFIG_APP_WIFI_PROV_TRANSPORT_BLE */ -#include #include #include #include @@ -314,20 +313,8 @@ esp_err_t app_wifi_start(app_wifi_pop_type_t pop_type) } #endif /* CONFIG_APP_WIFI_PROV_TRANSPORT_BLE */ - /* Create endpoint for ESP Cloud User-Device Association */ - err = esp_rmaker_user_mapping_endpoint_create(); - if (err != ESP_OK) { - ESP_LOGE(TAG, "esp_rmaker_user_mapping_endpoint_create failed %d", err); - return err; - } /* Start provisioning service */ ESP_ERROR_CHECK(wifi_prov_mgr_start_provisioning(security, pop, service_name, service_key)); - /* Register endpoint for ESP Cloud User-Device Association */ - err = esp_rmaker_user_mapping_endpoint_register(); - if (err != ESP_OK) { - ESP_LOGE(TAG, "esp_rmaker_user_mapping_endpoint_register failed %d", err); - return err; - } /* Print QR code for provisioning */ #ifdef CONFIG_APP_WIFI_PROV_TRANSPORT_BLE app_wifi_print_qr(service_name, pop, PROV_TRANSPORT_BLE); diff --git a/examples/homekit_switch/main/app_wifi_with_homekit.c b/examples/homekit_switch/main/app_wifi_with_homekit.c index de219e0..8e1a064 100644 --- a/examples/homekit_switch/main/app_wifi_with_homekit.c +++ b/examples/homekit_switch/main/app_wifi_with_homekit.c @@ -32,7 +32,6 @@ #include #endif /* CONFIG_APP_WIFI_PROV_TRANSPORT_BLE */ -#include #include #include #include @@ -318,20 +317,8 @@ esp_err_t app_wifi_with_homekit_start(app_wifi_pop_type_t pop_type) wifi_prov_scheme_softap_set_httpd_handle(hap_platform_httpd_get_handle()); #endif /* CONFIG_APP_WIFI_PROV_TRANSPORT_SOFTAP */ - /* Create endpoint for ESP Cloud User-Device Association */ - err = esp_rmaker_user_mapping_endpoint_create(); - if (err != ESP_OK) { - ESP_LOGE(TAG, "esp_rmaker_user_mapping_endpoint_create failed %d", err); - return err; - } /* Start provisioning service */ ESP_ERROR_CHECK(wifi_prov_mgr_start_provisioning(security, pop, service_name, service_key)); - /* Register endpoint for ESP Cloud User-Device Association */ - err = esp_rmaker_user_mapping_endpoint_register(); - if (err != ESP_OK) { - ESP_LOGE(TAG, "esp_rmaker_user_mapping_endpoint_register failed %d", err); - return err; - } /* Print QR code for provisioning */ #ifdef CONFIG_APP_WIFI_PROV_TRANSPORT_BLE app_wifi_print_qr(service_name, pop, PROV_TRANSPORT_BLE);