I have taken the code found here:
https://github.com/bjornspockeli/custom_ble_service_example
and modified it so that the custom characteristic is located in user memory instead of on the stack, and also made the size of it 500 bytes instead of 1 byte that was used in the example.
My modified version of custom_value_char_add is shown below with comments showing the lines I changed from the original.
static uint8_t buffer[500]; // NEW BUFFER static uint32_t custom_value_char_add(ble_cus_t * p_cus, const ble_cus_init_t * p_cus_init) { uint32_t err_code; ble_gatts_char_md_t char_md; ble_gatts_attr_md_t cccd_md; ble_gatts_attr_t attr_char_value; ble_uuid_t ble_uuid; ble_gatts_attr_md_t attr_md; // Add Custom Value characteristic memset(&cccd_md, 0, sizeof(cccd_md)); // Read operation on cccd should be possible without authentication. BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.read_perm); BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.write_perm); cccd_md.write_perm = p_cus_init->custom_value_char_attr_md.cccd_write_perm; cccd_md.vloc = BLE_GATTS_VLOC_STACK; memset(&char_md, 0, sizeof(char_md)); char_md.char_props.read = 1; char_md.char_props.write = 1; char_md.char_props.notify = 1; char_md.p_char_user_desc = NULL; char_md.p_char_pf = NULL; char_md.p_user_desc_md = NULL; char_md.p_cccd_md = &cccd_md; char_md.p_sccd_md = NULL; ble_uuid.type = p_cus->uuid_type; ble_uuid.uuid = CUSTOM_VALUE_CHAR_UUID; memset(&attr_md, 0, sizeof(attr_md)); attr_md.read_perm = p_cus_init->custom_value_char_attr_md.read_perm; attr_md.write_perm = p_cus_init->custom_value_char_attr_md.write_perm; attr_md.vloc = BLE_GATTS_VLOC_USER; // CHANGED FROM STACK attr_md.rd_auth = 0; attr_md.wr_auth = 0; attr_md.vlen = 0; memset(&attr_char_value, 0, sizeof(attr_char_value)); attr_char_value.p_uuid = &ble_uuid; attr_char_value.p_attr_md = &attr_md; attr_char_value.init_len = sizeof(buffer); // CHANGED SIZE attr_char_value.init_offs = 0; attr_char_value.max_len = sizeof(buffer); // CHANGED SIZE attr_char_value.p_value = buffer; // ADDED POINTER err_code = sd_ble_gatts_characteristic_add(p_cus->service_handle, &char_md, &attr_char_value, &p_cus->custom_value_handles); if (err_code != NRF_SUCCESS) { return err_code; } return NRF_SUCCESS; }
When I read this characteristic it takes approximately 9 seconds to receive the data back. This seems highly excessive to me.
I've tried compiling in release mode and that has not helped.
I've used different apps to read the characteristic on both an iOS device and an Android device to rule out that end of the equation. I've tried it both on the 52840 DM as well as our own custom hardware with identical results.
Any hints as to why it would take so long?
Environment:
nRF5_SDK_15.3.0
s140 soft device
segger development tools running on mac