Hi all,
As it happens, I fixed the bug in my code. It now correctly retrieves
LTKs and bond is maintained even after reboot.
Apart from this I just wanted to understand reason behind including
'idx' in structure 'ble_store_key_sec'. Could you please help me
understand use-case behind including 'idx'?
/** Number of results to skip; 0 means retrieve the first match. */
uint8_t idx;
Regards
Prasad
On 12/02/19 7:35 PM, prasad wrote:
Hi all,
With further debug effort the disconnect happens with HCI error 0x3d:
BLE_ERR_CONN_TERM_MIC.
Once the connection is establish, if we disconnect and try to
reconnect it is disconnecting with said reason.
I am attaching logs with additional prints. Please help me to know if
I am making any obvious mistake.
Regards
Prasad
On 11/02/19 7:10 PM, prasad wrote:
Hi all,
Are there any pointers/documentation for storing NIMBLE bond
information in NVS memory?
I tried to quickly implement simple application by modifying
'*ble_store_ram.c*'. I modified
/ble_hs_cfg.store_read_cb/store_write_cb/store_delete_cb/ callbacks
according to the requirement. I find this much of change is not
sufficient to get NVS bond stored in NVS as I am continuously getting
disconnect HCI event.
FYI, I am putting snippet of my code for each of these 3 callbacks
which will help you understand the changes I have made.
1.**/*ble_hs_cfg.store_read_cb* :
/
/case BLE_STORE_OBJ_TYPE_OUR_SEC:
nvs_open("nimble_bond", NVS_READWRITE, &nimble_handle);
BLE_HS_LOG(DEBUG, "looking up our sec; ");
err = nvs_get_blob(nimble_handle, "our_sec_key", NULL,
&required_size);
if (err != ESP_OK && err != ESP_ERR_NVS_NOT_FOUND) return err;
if (required_size == 0) {
nvs_close(nimble_handle);
return BLE_HS_ENOENT;
} else {
struct ble_store_key_sec* our_sec_key =
malloc(required_size);
err = nvs_get_blob(nimble_handle, "our_sec_key",
our_sec_key, &required_size);
if (err != ESP_OK) {
free(our_sec_key);
return err;
}
if (ble_addr_cmp(&key->sec.peer_addr, BLE_ADDR_ANY)) {
if (ble_addr_cmp(&our_sec_key->peer_addr,
&key->sec.peer_addr)){
err = nvs_get_blob(nimble_handle, "our_sec", NULL,
&required_size);
if (err != ESP_OK && err != ESP_ERR_NVS_NOT_FOUND) return
err;
struct ble_store_value_sec* our_sec = malloc(required_size);
err = nvs_get_blob(nimble_handle, "our_sec", our_sec,
&required_size);
if (err != ESP_OK) {
free(our_sec);
return err;
}
memcpy(&value->sec, our_sec, required_size);
free(our_sec);
}
}
free(our_sec_key);
}
/* NVS Close */
nvs_close(nimble_handle);
/
/2. ///*ble_hs_cfg.store_write_cb
*//
//case BLE_STORE_OBJ_TYPE_OUR_SEC:
ble_store_key_from_value_sec(&key_sec, &val->sec);
required_size = sizeof(struct ble_store_key_sec);
err = nvs_set_blob(nimble_handle, "our_sec_key", &key_sec,
required_size);
required_size = sizeof(struct ble_store_value_sec);
err = nvs_set_blob(nimble_handle, "our_sec", &val->sec,
required_size);
/* NVS Commit */
err = nvs_commit(nimble_handle);
if (err != ESP_OK) return err;
/* NVS Close */
nvs_close(nimble_handle);
return 0;//
Regards
Prasad