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

Sending sensor data via bluetooth LE

Hi Nordic. 

I have an issue that I'm really stuck on. I am trying to send data from a radar sensor via your nRF52 DK BLE board. I've managed to make a working connection between the sensor and the board but when I enable notification the data I see is not correct. I've tried printing the frames out from the Segger studio debug terminal and the data looks fine on that end.

I've used the custom service example from your github as base since I would like to add more characteristics in the future. The radar frame being sent is 288 bytes long and I am adding char like this: 

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_STACK;
    attr_md.rd_auth    = 0;
    attr_md.wr_auth    = 0;
    attr_md.vlen       = 1;

    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  = BIN_COUNT * sizeof(float32_t);
    attr_char_value.init_offs = 0;
    attr_char_value.max_len   = BIN_COUNT * sizeof(float32_t);

    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;
}

I've tried printing the frames out from the Segger studio debug terminal and the data looks fine. 

uint32_t ble_cus_custom_value_update(ble_cus_t * p_cus, uint8_t* custom_value)
{
    if (p_cus == NULL)
    {
        return NRF_ERROR_NULL;
    }

    uint32_t err_code = NRF_SUCCESS;
    ble_gatts_value_t gatts_value;

    // Initialize value struct.
    memset(&gatts_value, 0, sizeof(gatts_value));

    gatts_value.len     = 288;
    gatts_value.offset  = 0;
    gatts_value.p_value = &custom_value;
    // Update database.
    err_code = sd_ble_gatts_value_set(p_cus->conn_handle,
                                      p_cus->custom_value_handles.value_handle,
                                      &gatts_value);
    if (err_code != NRF_SUCCESS)
    {
        return err_code;
    }

    // Send value if connected and notifying.
    if ((p_cus->conn_handle != BLE_CONN_HANDLE_INVALID)) 
    {
        ble_gatts_hvx_params_t hvx_params;

        memset(&hvx_params, 0, sizeof(hvx_params));

        hvx_params.handle = p_cus->custom_value_handles.value_handle;
        hvx_params.type   = BLE_GATT_HVX_NOTIFICATION;
        hvx_params.offset = gatts_value.offset;
        hvx_params.p_len  = &gatts_value.len;
        hvx_params.p_data = gatts_value.p_value;

        err_code = sd_ble_gatts_hvx(p_cus->conn_handle, &hvx_params);
        NRF_LOG_INFO("sd_ble_gatts_hvx result: %x. \r\n", err_code); 
    }
    else
    {
        err_code = NRF_ERROR_INVALID_STATE;
        NRF_LOG_INFO("sd_ble_gatts_hvx result: NRF_ERROR_INVALID_STATE. \r\n"); 
    }


    return err_code;
}

This is where I update the char. 

When I look at my phone only one or two byte seems to change, while in the Debugging terminal every byte change, like expected. 

Can you see any errors? 

Sincerely 

Aksel

Parents
  • I suggest you make a sniffer trace of this transfer. If the data goes on-air then the problem lies with the android device, if it does not then there's something wrong with the application. 

  • Hi, 

    Thanks for the prompt reply.

    Can't seem to get the nrf sniffer to work. I even manually programmed my nrf52 dk board, but the sniffer still couldn't detect it. 

    I've tried to send to several other devices as well and get the same error. There is clearly something wrong with the application. I tried printing out the custom value in the ble_cus_custom_value_update() function and it looks fine.

     Print out from update function.

    But after it I send it it looks like this: 

    C:\Users\akkvj\Documents\Master\nrf_py\Prototype>python BLE_Trilateration.py NRF52 COM5
    Base UUID For Radar-collector: [173, 74, 0, 65, 85, 98, 65, 18, 154, 168, 10, 162, 61, 12, 229, 122]
    Value UUID for Radar-collector: 65
    Serial port used: COM5
    open
    Enabling larger ATT MTUs
    connect_and_discover
    Received advertisment report, address: 0xFDF5061F3241, device_name: Nord
    on_gap_evt_connected
    New connection: 0
    0
    Found Device
    ATT MTU exchanged: conn_handle=0 att_mtu=133
    ATT MTU exchanged: conn_handle=0 att_mtu=133
    ATT MTU exchange response: conn_handle=0
    on_notification
    Connection: 0, 0x41 = [208, 57, 0, 32, 252, 53, 0, 32, 13, 0, 1, 0, 0, 0, 0, 0, 248, 254, 0, 32, 224, 254, 0, 32, 0, 0, 0, 0, 224, 254, 0, 32, 168, 56, 1, 51, 0, 0, 0, 0, 172, 56, 0, 32, 41, 1, 3, 0, 204, 6, 72, 0, 208, 57, 0, 32, 11, 0, 0, 0, 0, 0, 0, 0, 252, 15, 0, 0, 13, 68, 3, 0, 68, 133, 0, 1, 31, 0, 0, 0, 220, 11, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 189, 227, 2, 0, 0, 0, 0, 0, 220, 0, 0, 32, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 249, 131, 1, 0, 208, 10]
    on_notification
    Connection: 0, 0x41 = [208, 57, 0, 32, 252, 53, 0, 32, 13, 0, 1, 0, 0, 0, 0, 0, 248, 254, 0, 32, 224, 254, 0, 32, 0, 0, 0, 0, 224, 254, 0, 32, 168, 56, 1, 51, 0, 0, 0, 0, 172, 56, 0, 32, 41, 1, 3, 0, 204, 6, 72, 0, 208, 57, 0, 32, 12, 0, 0, 0, 0, 0, 0, 0, 252, 15, 0, 0, 13, 68, 3, 0, 68, 133, 0, 1, 31, 0, 0, 0, 220, 11, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 189, 227, 2, 0, 0, 0, 0, 0, 220, 0, 0, 32, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 249, 131, 1, 0, 208, 10]
    on_notification
    Connection: 0, 0x41 = [208, 57, 0, 32, 252, 53, 0, 32, 13, 0, 1, 0, 0, 0, 0, 0, 248, 254, 0, 32, 224, 254, 0, 32, 0, 0, 0, 0, 224, 254, 0, 32, 168, 56, 1, 51, 0, 0, 0, 0, 172, 56, 0, 32, 41, 1, 3, 0, 204, 6, 72, 0, 208, 57, 0, 32, 13, 0, 0, 0, 0, 0, 0, 0, 252, 15, 0, 0, 13, 68, 3, 0, 68, 133, 0, 1, 31, 0, 0, 0, 220, 11, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 189, 227, 2, 0, 0, 0, 0, 0, 220, 0, 0, 32, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 249, 131, 1, 0, 208, 10]
    on_notification
    Connection: 0, 0x41 = [208, 57, 0, 32, 252, 53, 0, 32, 13, 0, 1, 0, 0, 0, 0, 0, 248, 254, 0, 32, 224, 254, 0, 32, 0, 0, 0, 0, 224, 254, 0, 32, 168, 56, 1, 51, 0, 0, 0, 0, 172, 56, 0, 32, 41, 1, 3, 0, 204, 6, 72, 0, 208, 57, 0, 32, 14, 0, 0, 0, 0, 0, 0, 0, 252, 15, 0, 0, 13, 68, 3, 0, 68, 133, 0, 1, 31, 0, 0, 0, 220, 11, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 189, 227, 2, 0, 0, 0, 0, 0, 220, 0, 0, 32, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 249, 131, 1, 0, 208, 10]
    on_notification
    Connection: 0, 0x41 = [208, 57, 0, 32, 252, 53, 0, 32, 13, 0, 1, 0, 0, 0, 0, 0, 248, 254, 0, 32, 224, 254, 0, 32, 0, 0, 0, 0, 224, 254, 0, 32, 168, 56, 1, 51, 0, 0, 0, 0, 172, 56, 0, 32, 41, 1, 3, 0, 204, 6, 72, 0, 208, 57, 0, 32, 15, 0, 0, 0, 0, 0, 0, 0, 252, 15, 0, 0, 13, 68, 3, 0, 68, 133, 0, 1, 31, 0, 0, 0, 220, 11, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 189, 227, 2, 0, 0, 0, 0, 0, 220, 0, 0, 32, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 249, 131, 1, 0, 208, 10]
    on_notification
    Connection: 0, 0x41 = [208, 57, 0, 32, 252, 53, 0, 32, 13, 0, 1, 0, 0, 0, 0, 0, 248, 254, 0, 32, 224, 254, 0, 32, 0, 0, 0, 0, 224, 254, 0, 32, 168, 56, 1, 51, 0, 0, 0, 0, 172, 56, 0, 32, 41, 1, 3, 0, 204, 6, 72, 0, 208, 57, 0, 32, 16, 0, 0, 0, 0, 0, 0, 0, 252, 15, 0, 0, 13, 68, 3, 0, 0, 0, 0, 1, 31, 0, 0, 0, 143, 161, 1, 0, 0, 0, 0, 0, 208, 10, 0, 32, 189, 227, 2, 0, 223, 0, 0, 0, 25, 4, 0, 0, 172, 29, 0, 32, 0, 0, 0, 0, 220, 0, 0, 32, 225, 131, 1, 0, 208, 10, 0, 32, 1, 0, 0, 0, 208, 10]

    As you can see all frame values are the same for each transmission. This is even true when i turn the device on and off. I used the pc-ble-driver and nrf connect and both shows the same static values.

    Any ideas? 

    EDIT: 

    I just found something: 

    If I print out the custom_value at line 13 in ble_cus_custom_value_update I get the correct value. BUT if I print the hvx_params.p_data below I get the values seen printed out above([208, 57, 0, 32, 252, 53, 0, 32, 13, 0, 1, 0, etc]).

    Does this make more sense?

    best regards

    --

    Aksel  

Reply
  • Hi, 

    Thanks for the prompt reply.

    Can't seem to get the nrf sniffer to work. I even manually programmed my nrf52 dk board, but the sniffer still couldn't detect it. 

    I've tried to send to several other devices as well and get the same error. There is clearly something wrong with the application. I tried printing out the custom value in the ble_cus_custom_value_update() function and it looks fine.

     Print out from update function.

    But after it I send it it looks like this: 

    C:\Users\akkvj\Documents\Master\nrf_py\Prototype>python BLE_Trilateration.py NRF52 COM5
    Base UUID For Radar-collector: [173, 74, 0, 65, 85, 98, 65, 18, 154, 168, 10, 162, 61, 12, 229, 122]
    Value UUID for Radar-collector: 65
    Serial port used: COM5
    open
    Enabling larger ATT MTUs
    connect_and_discover
    Received advertisment report, address: 0xFDF5061F3241, device_name: Nord
    on_gap_evt_connected
    New connection: 0
    0
    Found Device
    ATT MTU exchanged: conn_handle=0 att_mtu=133
    ATT MTU exchanged: conn_handle=0 att_mtu=133
    ATT MTU exchange response: conn_handle=0
    on_notification
    Connection: 0, 0x41 = [208, 57, 0, 32, 252, 53, 0, 32, 13, 0, 1, 0, 0, 0, 0, 0, 248, 254, 0, 32, 224, 254, 0, 32, 0, 0, 0, 0, 224, 254, 0, 32, 168, 56, 1, 51, 0, 0, 0, 0, 172, 56, 0, 32, 41, 1, 3, 0, 204, 6, 72, 0, 208, 57, 0, 32, 11, 0, 0, 0, 0, 0, 0, 0, 252, 15, 0, 0, 13, 68, 3, 0, 68, 133, 0, 1, 31, 0, 0, 0, 220, 11, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 189, 227, 2, 0, 0, 0, 0, 0, 220, 0, 0, 32, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 249, 131, 1, 0, 208, 10]
    on_notification
    Connection: 0, 0x41 = [208, 57, 0, 32, 252, 53, 0, 32, 13, 0, 1, 0, 0, 0, 0, 0, 248, 254, 0, 32, 224, 254, 0, 32, 0, 0, 0, 0, 224, 254, 0, 32, 168, 56, 1, 51, 0, 0, 0, 0, 172, 56, 0, 32, 41, 1, 3, 0, 204, 6, 72, 0, 208, 57, 0, 32, 12, 0, 0, 0, 0, 0, 0, 0, 252, 15, 0, 0, 13, 68, 3, 0, 68, 133, 0, 1, 31, 0, 0, 0, 220, 11, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 189, 227, 2, 0, 0, 0, 0, 0, 220, 0, 0, 32, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 249, 131, 1, 0, 208, 10]
    on_notification
    Connection: 0, 0x41 = [208, 57, 0, 32, 252, 53, 0, 32, 13, 0, 1, 0, 0, 0, 0, 0, 248, 254, 0, 32, 224, 254, 0, 32, 0, 0, 0, 0, 224, 254, 0, 32, 168, 56, 1, 51, 0, 0, 0, 0, 172, 56, 0, 32, 41, 1, 3, 0, 204, 6, 72, 0, 208, 57, 0, 32, 13, 0, 0, 0, 0, 0, 0, 0, 252, 15, 0, 0, 13, 68, 3, 0, 68, 133, 0, 1, 31, 0, 0, 0, 220, 11, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 189, 227, 2, 0, 0, 0, 0, 0, 220, 0, 0, 32, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 249, 131, 1, 0, 208, 10]
    on_notification
    Connection: 0, 0x41 = [208, 57, 0, 32, 252, 53, 0, 32, 13, 0, 1, 0, 0, 0, 0, 0, 248, 254, 0, 32, 224, 254, 0, 32, 0, 0, 0, 0, 224, 254, 0, 32, 168, 56, 1, 51, 0, 0, 0, 0, 172, 56, 0, 32, 41, 1, 3, 0, 204, 6, 72, 0, 208, 57, 0, 32, 14, 0, 0, 0, 0, 0, 0, 0, 252, 15, 0, 0, 13, 68, 3, 0, 68, 133, 0, 1, 31, 0, 0, 0, 220, 11, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 189, 227, 2, 0, 0, 0, 0, 0, 220, 0, 0, 32, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 249, 131, 1, 0, 208, 10]
    on_notification
    Connection: 0, 0x41 = [208, 57, 0, 32, 252, 53, 0, 32, 13, 0, 1, 0, 0, 0, 0, 0, 248, 254, 0, 32, 224, 254, 0, 32, 0, 0, 0, 0, 224, 254, 0, 32, 168, 56, 1, 51, 0, 0, 0, 0, 172, 56, 0, 32, 41, 1, 3, 0, 204, 6, 72, 0, 208, 57, 0, 32, 15, 0, 0, 0, 0, 0, 0, 0, 252, 15, 0, 0, 13, 68, 3, 0, 68, 133, 0, 1, 31, 0, 0, 0, 220, 11, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 189, 227, 2, 0, 0, 0, 0, 0, 220, 0, 0, 32, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 249, 131, 1, 0, 208, 10]
    on_notification
    Connection: 0, 0x41 = [208, 57, 0, 32, 252, 53, 0, 32, 13, 0, 1, 0, 0, 0, 0, 0, 248, 254, 0, 32, 224, 254, 0, 32, 0, 0, 0, 0, 224, 254, 0, 32, 168, 56, 1, 51, 0, 0, 0, 0, 172, 56, 0, 32, 41, 1, 3, 0, 204, 6, 72, 0, 208, 57, 0, 32, 16, 0, 0, 0, 0, 0, 0, 0, 252, 15, 0, 0, 13, 68, 3, 0, 0, 0, 0, 1, 31, 0, 0, 0, 143, 161, 1, 0, 0, 0, 0, 0, 208, 10, 0, 32, 189, 227, 2, 0, 223, 0, 0, 0, 25, 4, 0, 0, 172, 29, 0, 32, 0, 0, 0, 0, 220, 0, 0, 32, 225, 131, 1, 0, 208, 10, 0, 32, 1, 0, 0, 0, 208, 10]

    As you can see all frame values are the same for each transmission. This is even true when i turn the device on and off. I used the pc-ble-driver and nrf connect and both shows the same static values.

    Any ideas? 

    EDIT: 

    I just found something: 

    If I print out the custom_value at line 13 in ble_cus_custom_value_update I get the correct value. BUT if I print the hvx_params.p_data below I get the values seen printed out above([208, 57, 0, 32, 252, 53, 0, 32, 13, 0, 1, 0, etc]).

    Does this make more sense?

    best regards

    --

    Aksel  

Children
Related