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

When 128bit characteristic UUID is different form 128bit service UUID,how to discovery it?

I have the same problem as how to discovery 128bit characteristic UUID which is totally different form 128bit service UUID,the uuid in this question is the same with me,but I can not find solution .

I modified the ble_nus_c_init()  like this:

#define BASE_UUID                   {{0xfb,0x34,0x9b,0x5f,0x80,0x00,0x00,0x80,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00}}
#define BASE_UUID_FEE9              {{0xfb,0x34,0x9b,0x5f,0x80,0x00,0x00,0x80,0x00,0x10,0x00,0x00,0xe9,0xfe,0x00,0x00}}
#define BASE_UUID_CHAR_RX           {{0x00,0x96,0x12,0x16,0x54,0x92,0x75,0xb5,0xa2,0x45,0xfd,0xab,0x39,0xc4,0x4b,0xd4}}
#define BASE_UUID_CHAR_TX           {{0x01,0x96,0x12,0x16,0x54,0x92,0x75,0xb5,0xa2,0x45,0xfd,0xab,0x39,0xc4,0x4b,0xd4}}


uint32_t ble_nus_c_init(ble_nus_c_t * p_ble_nus_c, ble_nus_c_init_t * p_ble_nus_c_init)
{
    uint32_t      err_code;
    ble_uuid_t    uart_uuid,ble_uuid1,ble_uuid2;
    ble_uuid128_t nus_base_uuid =BASE_UUID;         //NUS_BASE_UUID;
    ble_uuid128_t base_uuid1 = BASE_UUID_CHAR_RX;
    ble_uuid128_t base_uuid2 = BASE_UUID_CHAR_TX;
    
    VERIFY_PARAM_NOT_NULL(p_ble_nus_c);
    VERIFY_PARAM_NOT_NULL(p_ble_nus_c_init);
    
    err_code = sd_ble_uuid_vs_add(&nus_base_uuid, &p_ble_nus_c->uuid_type);
    VERIFY_SUCCESS(err_code);

    uart_uuid.type = p_ble_nus_c->uuid_type;
    uart_uuid.uuid = 0xfee9;            //BLE_UUID_NUS_SERVICE;

    p_ble_nus_c->conn_handle           = BLE_CONN_HANDLE_INVALID;
    p_ble_nus_c->evt_handler           = p_ble_nus_c_init->evt_handler;
    p_ble_nus_c->handles.nus_tx_handle = BLE_GATT_HANDLE_INVALID;
    p_ble_nus_c->handles.nus_rx_handle = BLE_GATT_HANDLE_INVALID;

    ble_db_discovery_evt_register(&uart_uuid);
    
    ble_uuid1.uuid = 0;    
    err_code = sd_ble_uuid_vs_add(&base_uuid1, &ble_uuid1.type);
    VERIFY_SUCCESS(err_code);

    ble_uuid2.uuid = 0;    
    err_code = sd_ble_uuid_vs_add(&base_uuid2, &ble_uuid2.type);
    VERIFY_SUCCESS(err_code);

    err_code=ble_db_discovery_evt_register(&ble_uuid1);
    err_code=ble_db_discovery_evt_register(&ble_uuid2);
    return err_code;
}

And I set NRF_SDH_BLE_VS_UUID_COUNT to 4 , modified the ram start and size.

I can't receive the event BLE_DB_DISCOVERY_COMPLETE, but  receive event  BLE_DB_DISCOVERY_ERROR and BLE_DB_DISCOVERY_SRV_NOT_FOUND

When I change 0xFEE9 to 0xFEE8 I can receive the event BLE_DB_DISCOVERY_COMPLETE,but characteristic.uuid.uuid = 0x00 I don't know why.

How to discovery 128bit characteristic UUID which is totally different form 128bit service UUID?

Can someone help me?

NRF52832   SDK14.2  code base "on ble_app_uart_c"   pca10040  s132

Thanks.

  • Hi

    So what you want is the UUID found by sd_ble_gattc_attr_info_discover()? 

    If you add the ble_cus.c file, and the necessary header files from the aforementioned example to your project you should be able to add UUIDs by calling the ble_cus_init function in your main file. 

    Best regards,

    Simon

  • Hi

    I can find the 128bit characteristic UUID by  sd_ble_gattc_attr_info_discover()

    But I can not  find the 128bit characteristic UUID by the function ble_db_discovery_start(). Although I had add the 128bit characteristic uuid by sd_ble_uuid_vs_add() and ble_db_discovery_evt_register(). But in the function of ble_nus_c_on_db_disc_evt() the p_evt->evt_type is 0x01 or 0x02 or 0x010A but it is not 0x00 ,and p_evt->params.discovered_db.char_count still 0.

    Look forward to your help

    Thanks

  • Hi

    Could you try the sd_ble_gattc_char_value_by_uuid_read function? If you are not able to get this working, please send a snippet of your code, to show me how exactly you are reading the UUID.

    Best regards,

    Simon

  • Hi Simonr 

    The parameters p_uuid is 16bit UUID , but the characteristic I want to read is 128bit UUID . And it is totally different from the Primary Service UUID.

    How do I use sd_ble_gattc_char_value_by_uuid_read() function? Can you give me a example?

    This is my code , but I can read no data.

    void getCHAR(int handle)
    {
        ble_gattc_handle_range_t handle_range;
        ret_code_t            err_code;
        ble_uuid_t         uuid;
        uuid.uuid=0xc439;               
        uuid.type=2;
        
        handle_range.start_handle=1;
        handle_range.end_handle=50;
        err_code=sd_ble_gattc_char_value_by_uuid_read(handle,&uuid,&handle_range);
        APP_ERROR_CHECK(err_code);
    }

    In the ble_evt_handler()

    case BLE_GAP_EVT_CONNECTED:
    {
        ble_gap_evt_adv_report_t const * p_adv_report = &p_gap_evt->params.adv_report;
        NRF_LOG_INFO("Connected to target");
    
        getCHAR(p_ble_evt->evt.gap_evt.conn_handle);
    }
    break;
    
    case BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP:
    {
        int i=0;
        uint8_t data[20][100];
        static int cnt=0;
        
        memset(data,0,sizeof(data));
        
        for(i=0;i<p_ble_evt->evt.gattc_evt.params.char_val_by_uuid_read_rsp.count;i++)
        {
            memcpy(data[i],p_ble_evt->evt.gattc_evt.params.char_val_by_uuid_read_rsp.handle_value,p_ble_evt->evt.gattc_evt.params.char_val_by_uuid_read_rsp.value_len);
        }                 
    }
    break;

    Look forward to your reply

    Thanks

  • This is what you need, modify it as you see fit:

    In your init function:

    ble_uuid128_t   your_service_base_uuid = YOUR_SERVICE_BASE_UUID;
    ble_uuid128_t   your_characteristic_base_uuid = YOUR_CHARACTERISTIC_BASE_UUID;
    APP_ERROR_CHECK(sd_ble_uuid_vs_add(&your_service_base_uuid, &your_service.type));
    APP_ERROR_CHECK(sd_ble_uuid_vs_add(&your_characteristic_base_uuid, &your_characteristic.type));
    
    your_service.uuid = BLE_UUID_YOUR_SERVICE;
    your_characteristic.uuid = BLE_UUID_YOUR_CHARACTERISTIC;
    
    APP_ERROR_CHECK(ble_db_discovery_evt_register(&your_service));

    In your db_evt_handler:

    if (p_evt->evt_type == BLE_DB_DISCOVERY_COMPLETE) {
    	if ((p_evt->params.discovered_db.srv_uuid.uuid == your_service.uuid) &&
    		(p_evt->params.discovered_db.srv_uuid.type == your_service.type)) {
    		for (uint8_t i = 0; i < p_evt->params.discovered_db.char_count; i++) {
    			if (p_evt->params.discovered_db.charateristics[i].characteristic.uuid.type == your_characteristic.type) {
    				if (p_evt->params.discovered_db.charateristics[i].characteristic.uuid.uuid == your_characteristic.uuid) {
    					cccd_handle  = p_evt->params.discovered_db.charateristics[i].cccd_handle;
    					value_handle = p_evt->params.discovered_db.charateristics[i].characteristic.handle_value;
    				}
    			}
    		}
    	}
    }

    That should work. If it doesn't, my bet is that your calls to ble_db_discovery_evt_register are returning errors. Check the return codes of those functions to verify that they are returning NRF_SUCCESS.

Related