Skip to content

Commit b2a24ca

Browse files
committed
Merge branch 'bugfix/claiming' into 'master'
claim: Fixes for assisted claiming See merge request app-frameworks/esp-rainmaker!608
2 parents c1e3016 + d70a00a commit b2a24ca

File tree

5 files changed

+81
-18
lines changed

5 files changed

+81
-18
lines changed

components/esp_rainmaker/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Changelog
22

3+
## 1.8.7
4+
5+
### Bug Fixes
6+
- If assisted claiming was already performed before calling `esp_rmaker_start()`,
7+
the firmware was stalling with an incorrect print saying that the Node connected to network
8+
without claiming.
9+
310
## 1.8.6
411

512
### New Feature

components/esp_rainmaker/idf_component.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
## IDF Component Manager Manifest File
2-
version: "1.8.6"
2+
version: "1.8.7"
33
description: ESP RainMaker firmware agent
44
url: https://github.com/espressif/esp-rainmaker/tree/master/components/esp_rainmaker
55
repository: https://github.com/espressif/esp-rainmaker.git

components/esp_rainmaker/src/core/esp_rmaker_claim.c

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -486,14 +486,19 @@ esp_err_t esp_rmaker_self_claim_perform(esp_rmaker_claim_data_t *claim_data)
486486
ESP_LOGE(TAG, "Self claiming not initialised.");
487487
return ESP_ERR_INVALID_STATE;
488488
}
489+
esp_rmaker_post_event(RMAKER_EVENT_CLAIM_STARTED, NULL, 0);
489490
esp_err_t err = esp_rmaker_claim_perform_init(claim_data);
490491
if (err != ESP_OK) {
491492
ESP_LOGE(TAG, "Claim Init Sequence Failed.");
493+
esp_rmaker_post_event(RMAKER_EVENT_CLAIM_FAILED, NULL, 0);
492494
return err;
493495
}
494496
err = esp_rmaker_claim_perform_verify(claim_data);
495497
if (err == ESP_OK) {
496498
ESP_LOGI(TAG, "Self Claiming was successful. Certificate received.");
499+
esp_rmaker_post_event(RMAKER_EVENT_CLAIM_SUCCESSFUL, NULL, 0);
500+
} else {
501+
esp_rmaker_post_event(RMAKER_EVENT_CLAIM_FAILED, NULL, 0);
497502
}
498503
esp_rmaker_claim_data_free(claim_data);
499504
return err;
@@ -601,6 +606,7 @@ esp_err_t esp_rmaker_assisted_claim_handle_start(RmakerClaim__RMakerClaimPayload
601606
response->resppayload->status = RMAKER_CLAIM__RMAKER_CLAIM_STATUS__Success;
602607
claim_data->state = RMAKER_CLAIM_STATE_INIT;
603608
ESP_LOGI(TAG, "Assisted Claiming Started.");
609+
esp_rmaker_post_event(RMAKER_EVENT_CLAIM_STARTED, NULL, 0);
604610
return ESP_OK;
605611
}
606612

@@ -729,11 +735,16 @@ esp_err_t esp_rmaker_assisted_claim_handle_verify(RmakerClaim__RMakerClaimPayloa
729735
if (handle_claim_verify_response(claim_data) == ESP_OK) {
730736
ESP_LOGI(TAG,"Assisted Claiming was Successful.");
731737
claim_data->state = RMAKER_CLAIM_STATE_VERIFY_DONE;
738+
esp_rmaker_post_event(RMAKER_EVENT_CLAIM_SUCCESSFUL, NULL, 0);
732739
if (claim_event_group) {
733740
xEventGroupSetBits(claim_event_group, CLAIM_TASK_BIT);
734741
}
735742
} else {
743+
esp_rmaker_post_event(RMAKER_EVENT_CLAIM_FAILED, NULL, 0);
736744
response->resppayload->status = RMAKER_CLAIM__RMAKER_CLAIM_STATUS__InvalidParam;
745+
if (claim_event_group) {
746+
xEventGroupSetBits(claim_event_group, CLAIM_TASK_BIT);
747+
}
737748
return ESP_OK;
738749
}
739750
}
@@ -792,6 +803,10 @@ esp_err_t esp_rmaker_claiming_handler(uint32_t session_id, const uint8_t *inbuf,
792803
claim_data->state = RMAKER_CLAIM_STATE_PK_GENERATED;
793804
resppayload.status = RMAKER_CLAIM__RMAKER_CLAIM_STATUS__Success;
794805
ESP_LOGW(TAG, "Assisted Claiming Aborted.");
806+
esp_rmaker_post_event(RMAKER_EVENT_CLAIM_FAILED, NULL, 0);
807+
if (claim_event_group) {
808+
xEventGroupSetBits(claim_event_group, CLAIM_TASK_BIT);
809+
}
795810
break;
796811
default:
797812
break;
@@ -921,10 +936,13 @@ static esp_rmaker_claim_data_t *esp_rmaker_claim_init(void)
921936
ESP_LOGE(TAG, "Claim already initialised");
922937
return NULL;
923938
}
924-
claim_event_group = xEventGroupCreate();
939+
/* Create event group if it doesn't exist (for assisted claiming, it may already exist) */
925940
if (!claim_event_group) {
926-
ESP_LOGE(TAG, "Couldn't create event group");
927-
return NULL;
941+
claim_event_group = xEventGroupCreate();
942+
if (!claim_event_group) {
943+
ESP_LOGE(TAG, "Couldn't create event group");
944+
return NULL;
945+
}
928946
}
929947
esp_rmaker_claim_data_t *claim_data = NULL;
930948

@@ -935,14 +953,23 @@ static esp_rmaker_claim_data_t *esp_rmaker_claim_init(void)
935953
if (xTaskCreate(&esp_rmaker_claim_task, "claim_task", ESP_RMAKER_CLAIM_TASK_STACK_SIZE,
936954
&claim_data, tskIDLE_PRIORITY, NULL) != pdPASS) {
937955
ESP_LOGE(TAG, "Couldn't create Claim task");
956+
/* On failure, delete event group and reset handle */
938957
vEventGroupDelete(claim_event_group);
958+
claim_event_group = NULL;
939959
return NULL;
940960
}
941961

942962
/* Wait for claim init to complete */
943963
xEventGroupWaitBits(claim_event_group, CLAIM_TASK_BIT, false, true, portMAX_DELAY);
964+
#ifdef CONFIG_ESP_RMAKER_SELF_CLAIM
965+
/* For self-claiming, delete event group after PK generation */
944966
vEventGroupDelete(claim_event_group);
945967
claim_event_group = NULL;
968+
#else
969+
/* For assisted claiming, clear the bit as it would be re-used later*/
970+
xEventGroupClearBits(claim_event_group, CLAIM_TASK_BIT);
971+
#endif
972+
/* For assisted claiming, keep event group for claiming completion signaling */
946973
return claim_data;
947974
}
948975

@@ -960,12 +987,11 @@ esp_err_t esp_rmaker_assisted_claim_perform(esp_rmaker_claim_data_t *claim_data)
960987
ESP_LOGE(TAG, "Assisted claiming not initialised.");
961988
return ESP_ERR_INVALID_STATE;
962989
}
963-
claim_event_group = xEventGroupCreate();
964990
if (!claim_event_group) {
965-
ESP_LOGE(TAG, "Couldn't create event group");
966-
return ESP_ERR_NO_MEM;
991+
ESP_LOGE(TAG, "Claim event group not created.");
992+
return ESP_ERR_INVALID_STATE;
967993
}
968-
/* Wait for assisted claim to complete */
994+
/* Wait for assisted claim to complete (returns immediately if bit already set) */
969995
ESP_LOGI(TAG, "Waiting for assisted claim to finish.");
970996
xEventGroupWaitBits(claim_event_group, CLAIM_TASK_BIT, false, true, portMAX_DELAY);
971997
esp_err_t err = ESP_FAIL;
@@ -976,16 +1002,20 @@ esp_err_t esp_rmaker_assisted_claim_perform(esp_rmaker_claim_data_t *claim_data)
9761002
esp_event_handler_unregister(NETWORK_PROV_EVENT, NETWORK_PROV_START, &event_handler);
9771003
esp_rmaker_claim_data_free(claim_data);
9781004
vEventGroupDelete(claim_event_group);
1005+
claim_event_group = NULL;
9791006
return err;
9801007
}
9811008
esp_rmaker_claim_data_t *esp_rmaker_assisted_claim_init(void)
9821009
{
9831010
ESP_LOGI(TAG, "Initialising Assisted Claiming. This may take time.");
1011+
/* esp_rmaker_claim_init() will create the event group, and for assisted claiming,
1012+
* it will be kept after PK generation for claiming completion signaling */
9841013
esp_rmaker_claim_data_t *claim_data = esp_rmaker_claim_init();
9851014
if (claim_data) {
9861015
esp_event_handler_register(NETWORK_PROV_EVENT, NETWORK_PROV_INIT, &event_handler, claim_data);
9871016
esp_event_handler_register(NETWORK_PROV_EVENT, NETWORK_PROV_START, &event_handler, claim_data);
9881017
}
1018+
/* If claim init failed, event group is already cleaned up in esp_rmaker_claim_init() */
9891019
return claim_data;
9901020
}
9911021
#endif

components/esp_rainmaker/src/core/esp_rmaker_core.c

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ typedef struct {
8484
esp_rmaker_mqtt_conn_params_t *mqtt_conn_params;
8585
#ifdef ESP_RMAKER_CLAIM_ENABLED
8686
bool need_claim;
87+
bool claim_done;
8788
esp_rmaker_claim_data_t *claim_data;
8889
#endif /* ESP_RMAKER_CLAIM_ENABLED */
8990
/* Use Thread partition ID as the Thread network identifier. */
@@ -165,6 +166,27 @@ static void reset_event_handler(void* arg, esp_event_base_t event_base,
165166
}
166167
}
167168

169+
#ifdef ESP_RMAKER_CLAIM_ENABLED
170+
static void claim_event_handler(void* arg, esp_event_base_t event_base,
171+
int32_t event_id, void* event_data)
172+
{
173+
if (!esp_rmaker_priv_data) {
174+
return;
175+
}
176+
if (event_id == RMAKER_EVENT_CLAIM_SUCCESSFUL) {
177+
esp_rmaker_priv_data->need_claim = false;
178+
esp_rmaker_priv_data->claim_done = true;
179+
esp_event_handler_unregister(RMAKER_EVENT, RMAKER_EVENT_CLAIM_STARTED, &claim_event_handler);
180+
esp_event_handler_unregister(RMAKER_EVENT, RMAKER_EVENT_CLAIM_SUCCESSFUL, &claim_event_handler);
181+
esp_event_handler_unregister(RMAKER_EVENT, RMAKER_EVENT_CLAIM_FAILED, &claim_event_handler);
182+
} else if (event_id == RMAKER_EVENT_CLAIM_FAILED) {
183+
esp_event_handler_unregister(RMAKER_EVENT, RMAKER_EVENT_CLAIM_STARTED, &claim_event_handler);
184+
esp_event_handler_unregister(RMAKER_EVENT, RMAKER_EVENT_CLAIM_SUCCESSFUL, &claim_event_handler);
185+
esp_event_handler_unregister(RMAKER_EVENT, RMAKER_EVENT_CLAIM_FAILED, &claim_event_handler);
186+
}
187+
}
188+
#endif /* ESP_RMAKER_CLAIM_ENABLED */
189+
168190
static void esp_rmaker_mqtt_event_handler(void* arg, esp_event_base_t event_base,
169191
int32_t event_id, void* event_data)
170192
{
@@ -459,11 +481,9 @@ static void esp_rmaker_task(void *data)
459481
err = ESP_FAIL;
460482
goto rmaker_end;
461483
}
462-
esp_rmaker_post_event(RMAKER_EVENT_CLAIM_STARTED, NULL, 0);
463484
err = esp_rmaker_assisted_claim_perform(esp_rmaker_priv_data->claim_data);
464485
if (err != ESP_OK) {
465-
esp_rmaker_post_event(RMAKER_EVENT_CLAIM_FAILED, NULL, 0);
466-
ESP_LOGE(TAG, "esp_rmaker_self_claim_perform() returned %d. Aborting", err);
486+
ESP_LOGE(TAG, "esp_rmaker_assisted_claim_perform() returned %d. Aborting", err);
467487
#if defined(CONFIG_ESP_RMAKER_NETWORK_OVER_WIFI)
468488
esp_event_handler_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, &esp_rmaker_event_handler);
469489
#elif defined(CONFIG_ESP_RMAKER_NETWORK_OVER_THREAD)
@@ -473,7 +493,6 @@ static void esp_rmaker_task(void *data)
473493
goto rmaker_end;
474494
}
475495
esp_rmaker_priv_data->claim_data = NULL;
476-
esp_rmaker_post_event(RMAKER_EVENT_CLAIM_SUCCESSFUL, NULL, 0);
477496
}
478497
#endif /* CONFIG_ESP_RMAKER_ASSISTED_CLAIM */
479498
#if defined(CONFIG_ESP_RMAKER_NETWORK_OVER_WIFI)
@@ -504,19 +523,17 @@ static void esp_rmaker_task(void *data)
504523
/* Self claiming can be done only after Wi-Fi connection */
505524
#ifdef CONFIG_ESP_RMAKER_SELF_CLAIM
506525
if (esp_rmaker_priv_data->need_claim) {
507-
esp_rmaker_post_event(RMAKER_EVENT_CLAIM_STARTED, NULL, 0);
508526
err = esp_rmaker_self_claim_perform(esp_rmaker_priv_data->claim_data);
509527
if (err != ESP_OK) {
510-
esp_rmaker_post_event(RMAKER_EVENT_CLAIM_FAILED, NULL, 0);
511528
ESP_LOGE(TAG, "esp_rmaker_self_claim_perform() returned %d. Aborting", err);
512529
goto rmaker_end;
513530
}
514531
esp_rmaker_priv_data->claim_data = NULL;
515-
esp_rmaker_post_event(RMAKER_EVENT_CLAIM_SUCCESSFUL, NULL, 0);
516532
}
517533
#endif
518534
#ifdef ESP_RMAKER_CLAIM_ENABLED
519-
if (esp_rmaker_priv_data->need_claim) {
535+
/* Initialize MQTT if claiming was needed (either still in progress or just completed) */
536+
if (esp_rmaker_priv_data->need_claim || esp_rmaker_priv_data->claim_done) {
520537
esp_rmaker_priv_data->mqtt_conn_params = esp_rmaker_get_mqtt_conn_params();
521538
if (!esp_rmaker_priv_data->mqtt_conn_params) {
522539
ESP_LOGE(TAG, "Failed to initialise MQTT Config after claiming. Aborting");
@@ -529,6 +546,7 @@ static void esp_rmaker_task(void *data)
529546
goto rmaker_end;
530547
}
531548
esp_rmaker_priv_data->need_claim = false;
549+
esp_rmaker_priv_data->claim_done = false;
532550
}
533551
#endif /* ESP_RMAKER_CLAIM_ENABLED */
534552
#ifdef CONFIG_ESP_RMAKER_CMD_RESP_ENABLE
@@ -643,6 +661,7 @@ static esp_err_t esp_rmaker_mqtt_conn_params_init(esp_rmaker_priv_data_t *rmaker
643661
return ESP_FAIL;
644662
} else {
645663
rmaker_priv_data->need_claim = true;
664+
rmaker_priv_data->claim_done = false;
646665
return ESP_OK;
647666
}
648667
}
@@ -737,6 +756,13 @@ static esp_err_t esp_rmaker_init(const esp_rmaker_config_t *config, bool use_cla
737756
#endif /* CONFIG_ESP_RMAKER_ENABLE_CHALLENGE_RESPONSE */
738757

739758
esp_rmaker_priv_data->enable_time_sync = config->enable_time_sync;
759+
#ifdef ESP_RMAKER_CLAIM_ENABLED
760+
if (esp_rmaker_priv_data->need_claim) {
761+
esp_event_handler_register(RMAKER_EVENT, RMAKER_EVENT_CLAIM_STARTED, &claim_event_handler, NULL);
762+
esp_event_handler_register(RMAKER_EVENT, RMAKER_EVENT_CLAIM_SUCCESSFUL, &claim_event_handler, NULL);
763+
esp_event_handler_register(RMAKER_EVENT, RMAKER_EVENT_CLAIM_FAILED, &claim_event_handler, NULL);
764+
}
765+
#endif /* ESP_RMAKER_CLAIM_ENABLED */
740766
esp_rmaker_post_event(RMAKER_EVENT_INIT_DONE, NULL, 0);
741767
esp_rmaker_priv_data->state = ESP_RMAKER_STATE_INIT_DONE;
742768

components/esp_rainmaker/src/mqtt/esp_rmaker_mqtt.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ esp_err_t esp_rmaker_mqtt_disconnect(void)
9292

9393
esp_err_t esp_rmaker_mqtt_subscribe(const char *topic, esp_rmaker_mqtt_subscribe_cb_t cb, uint8_t qos, void *priv_data)
9494
{
95-
ESP_LOGI(TAG, "Subscribing to topic: %s", topic);
95+
ESP_LOGD(TAG, "Subscribing to topic: %s", topic);
9696
if (g_mqtt_config.subscribe) {
9797
return g_mqtt_config.subscribe(topic, cb, qos, priv_data);
9898
}
@@ -111,7 +111,7 @@ esp_err_t esp_rmaker_mqtt_unsubscribe(const char *topic)
111111

112112
esp_err_t esp_rmaker_mqtt_publish(const char *topic, void *data, size_t data_len, uint8_t qos, int *msg_id)
113113
{
114-
ESP_LOGI(TAG, "Publishing to topic: %s", topic);
114+
ESP_LOGD(TAG, "Publishing to topic: %s", topic);
115115
if (esp_rmaker_mqtt_is_budget_available() != true) {
116116
ESP_LOGE(TAG, "Out of MQTT Budget. Dropping publish message.");
117117
return ESP_FAIL;

0 commit comments

Comments
 (0)