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

Number of services found at the peers GATT database is 0

Hi everyone,

I am developing a remote control using nRF52832 chip. My prototype is currently developed in PC10040 board. The IDE is Eclipse Oxygen, and the SDK is S132 v5.0.0.

Currently, I am trying to discover the services. But the number of of services found at the peers GATT database, which is returned by m_db_disc.srv_count, is 0. Below is the ble_evt_handler function.

static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
{
ret_code_t            err_code;
ble_gap_evt_t const * p_gap_evt = &p_ble_evt->evt.gap_evt;

switch (p_ble_evt->header.evt_id)
{
case BLE_GAP_EVT_CONNECTED:
	PrintInfo("BLE GAP event: Connected");
    err_code = ble_rcs_handles_assign(&m_ble_rcs, p_ble_evt->evt.gap_evt.conn_handle, NULL);
    APP_ERROR_CHECK(err_code);

    // start discovery of services. The service client waits for a discovery result
    PrintInfo("Start discovery of services");
    err_code = ble_db_discovery_start(&m_db_disc, p_ble_evt->evt.gap_evt.conn_handle);
    PrintInfo("Number of services at the peers GATT database: %d", m_db_disc.srv_count);
    int i;
    for(i = 0; i < m_db_disc.srv_count; i++)
    {
    	PrintInfo("Service %X", m_db_disc.services[i].srv_uuid.type);
    }
    APP_ERROR_CHECK(err_code);
	break;

case BLE_GAP_EVT_DISCONNECTED:
	PrintInfo("BLE GAP event: Disconnected");
    break;

	break;

case BLE_GAP_EVT_ADV_REPORT:
	{
		// The advertisement report
		ble_gap_evt_adv_report_t const * p_adv_report = &p_gap_evt->params.adv_report;
		PrintDebug("Discovered device %02x%02x%02x%02x%02x%02x",
									p_adv_report->peer_addr.addr[0],
									p_adv_report->peer_addr.addr[1],
									p_adv_report->peer_addr.addr[2],
									p_adv_report->peer_addr.addr[3],
									p_adv_report->peer_addr.addr[4],
									p_adv_report->peer_addr.addr[5]);
		if (is_uuid_present(&m_scan_uuids, p_adv_report))
		{

			err_code = sd_ble_gap_connect(&p_adv_report->peer_addr,
					&m_scan_params,
					&m_connection_param,
					APP_BLE_CONN_CFG_TAG);

			if (err_code == NRF_SUCCESS)
			{
				// scan is automatically stopped by the connect
				PrintInfo("Connecting to target %02x%02x%02x%02x%02x%02x",
						p_adv_report->peer_addr.addr[0],
						p_adv_report->peer_addr.addr[1],
						p_adv_report->peer_addr.addr[2],
						p_adv_report->peer_addr.addr[3],
						p_adv_report->peer_addr.addr[4],
						p_adv_report->peer_addr.addr[5]);
			}
		}
	}
	break;

case BLE_GATTC_EVT_TIMEOUT:
    // Disconnect on GATT Client timeout event.
    PrintInfo("GATT Client Timeout.");
    err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
                                     BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
    APP_ERROR_CHECK(err_code);
    break;

case BLE_GATTS_EVT_TIMEOUT:
    // Disconnect on GATT Server timeout event.
	PrintInfo("GATT Server Timeout.");
    err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
                                     BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
    APP_ERROR_CHECK(err_code);
    break;

default:
	// No implementation needed.
	break;
}

}
Parents
  • Hi,

    You need to register the services you are interested in discovering at the server using the function ble_db_discovery_evt_register().

    For the rscs service, which is a Bluetooth SIG UUID (16-bit), this is done like this:

    uint32_t ble_rscs_c_init(ble_rscs_c_t * p_ble_rscs_c, ble_rscs_c_init_t * p_ble_rscs_c_init)
    {
        VERIFY_PARAM_NOT_NULL(p_ble_rscs_c);
        VERIFY_PARAM_NOT_NULL(p_ble_rscs_c_init);
    
        ble_uuid_t rscs_uuid;
    
        rscs_uuid.type = BLE_UUID_TYPE_BLE;
        rscs_uuid.uuid = BLE_UUID_RUNNING_SPEED_AND_CADENCE;
    
        p_ble_rscs_c->evt_handler             = p_ble_rscs_c_init->evt_handler;
        p_ble_rscs_c->conn_handle             = BLE_CONN_HANDLE_INVALID;
        p_ble_rscs_c->peer_db.rsc_cccd_handle = BLE_GATT_HANDLE_INVALID;
        p_ble_rscs_c->peer_db.rsc_handle      = BLE_GATT_HANDLE_INVALID;
    
        return ble_db_discovery_evt_register(&rscs_uuid);
    }
    

    For Vendor UUID services (128-bit), e.g. for the NUS Service, this is done like this:

    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_uuid128_t nus_base_uuid = NUS_BASE_UUID;
    
        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 = 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;
    
        return ble_db_discovery_evt_register(&uart_uuid);
    }
    
Reply
  • Hi,

    You need to register the services you are interested in discovering at the server using the function ble_db_discovery_evt_register().

    For the rscs service, which is a Bluetooth SIG UUID (16-bit), this is done like this:

    uint32_t ble_rscs_c_init(ble_rscs_c_t * p_ble_rscs_c, ble_rscs_c_init_t * p_ble_rscs_c_init)
    {
        VERIFY_PARAM_NOT_NULL(p_ble_rscs_c);
        VERIFY_PARAM_NOT_NULL(p_ble_rscs_c_init);
    
        ble_uuid_t rscs_uuid;
    
        rscs_uuid.type = BLE_UUID_TYPE_BLE;
        rscs_uuid.uuid = BLE_UUID_RUNNING_SPEED_AND_CADENCE;
    
        p_ble_rscs_c->evt_handler             = p_ble_rscs_c_init->evt_handler;
        p_ble_rscs_c->conn_handle             = BLE_CONN_HANDLE_INVALID;
        p_ble_rscs_c->peer_db.rsc_cccd_handle = BLE_GATT_HANDLE_INVALID;
        p_ble_rscs_c->peer_db.rsc_handle      = BLE_GATT_HANDLE_INVALID;
    
        return ble_db_discovery_evt_register(&rscs_uuid);
    }
    

    For Vendor UUID services (128-bit), e.g. for the NUS Service, this is done like this:

    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_uuid128_t nus_base_uuid = NUS_BASE_UUID;
    
        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 = 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;
    
        return ble_db_discovery_evt_register(&uart_uuid);
    }
    
Children
No Data
Related