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

BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST event not generated


I want to read characteristics (central needs read data from peripheral whenever he want ) but don’t want to use notification.

I am trying this with authorization but it can not generate BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST event. I just didn’t get what are the exactly settings required for that. I made changes in led service characteristics as follows.

What are the exactly changes I have to done here?
OR
Is there any example available where such solution used?

uint32_t ble_lbs_init(ble_lbs_t * p_lbs, const ble_lbs_init_t * p_lbs_init )
{
   uint32_t              err_code;
    ble_uuid_t            ble_uuid;
    ble_add_char_params_t add_char_params;
    ble_gatts_attr_md_t attr_md;

    // Initialize service structure.
    p_lbs->led_write_handler = p_lbs_init->led_write_handler;

    // Add service.
    ble_uuid128_t base_uuid = {LBS_UUID_BASE};
    err_code = sd_ble_uuid_vs_add(&base_uuid, &p_lbs->uuid_type);
    VERIFY_SUCCESS(err_code);

    ble_uuid.type = p_lbs->uuid_type;
    ble_uuid.uuid = LBS_UUID_SERVICE;

    err_code = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY, &ble_uuid, &p_lbs->service_handle);
    VERIFY_SUCCESS(err_code);


    // Add LED characteristic.
    memset(&add_char_params, 0, sizeof(add_char_params));
    add_char_params.uuid             = LBS_UUID_LED_CHAR;
    add_char_params.uuid_type        = p_lbs->uuid_type;
    add_char_params.init_len             = sizeof(uint8_t);
    add_char_params.max_len            = sizeof(uint8_t);
    add_char_params.char_props.read  = 1;
    add_char_params.char_props.write = 1;

    attr_md.rd_auth = 1; 

    add_char_params.read_access  = SEC_OPEN;
    add_char_params.write_access = SEC_OPEN;

   err_code = characteristic_add(p_lbs->service_handle,
                                  &add_char_params,
                                  &p_lbs->led_char_handles);

}

void ble_lbs_on_ble_evt(ble_evt_t const * p_ble_evt, void * p_context)
{ 
  
    ble_lbs_t * p_lbs = (ble_lbs_t *)p_context;

    switch (p_ble_evt->header.evt_id)
    {
        case BLE_GATTS_EVT_WRITE:
            on_write(p_lbs, p_ble_evt);
            break;

        case BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST:
            on_read(p_lbs, p_ble_evt);
           break;
           
        default:
            // No implementation needed.
            break;
    }
}

static void on_read(ble_lbs_t * p_lbs, ble_evt_t const * p_ble_evt)
{
     uint32_t err_code;
     uint8_t update_data = 0xAB;
		
     ble_gatts_rw_authorize_reply_params_t reply_params;

     memset(&reply_params, 0, sizeof(reply_params));
	
     reply_params.type = BLE_GATTS_AUTHORIZE_TYPE_READ;
     reply_params.params.read.p_data    = &update_data;
     reply_params.params.read.len       = sizeof(update_data);
     reply_params.params.read.offset    = 0;
     reply_params.params.read.update    = 0;
     reply_params.params.read.gatt_status = NRF_SUCCESS;
	
    sd_ble_gatts_rw_authorize_reply(p_ble_evt->evt.gap_evt.conn_handle, &reply_params);
}

Thanks in advance.

Regards,

Pooja

Parents Reply Children
No Data
Related