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.

Parents
  • 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.

  • Also, the ble_uuid_t variables should be global to that file (i.e. your_service and your_characteristic), so that you have access to those variables in the db_evt_handler as well.

Reply Children
No Data
Related