This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

BLE Reads of 500 bytes taking 9 seconds

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

Parents
  • Hi,

    The connection interval in original example is 100-200 msec. If you didn't change it, device can transfer 5-10 packets per second. A default MTU size is 23 bytes that allows you to transfer your characteristic by twenty five 20-byte chunks, requiring 50 packets - 25 requests and 25 responses, so total time will vary from 5 to 10 seconds - that's your case. To improve speed, a simplest way is to decrease connection interval:

    #define MIN_CONN_INTERVAL      MSEC_TO_UNITS(15, UNIT_1_25_MS)
    #define MAX_CONN_INTERVAL      MSEC_TO_UNITS(20, UNIT_1_25_MS)
    

    A better speed improvement can be achieved by increasing MTU up to 251 bytes and use DLE (data length extension), but it has to be supported by both sides. You can search forum, there was a number of threads about increasing MTU size.

  • Thank you *VERY* much, Dmitry. That was it. Clearly I have more learning to do with respect to BLE. I did not understand this aspect of the protocol at all.

Reply Children
No Data
Related