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

on_primary_srv_discovery_rsp() fail at example ble_app_hrs_rscs_relay.

1. SDK version : nRF5_SDK_15.0.0

2. Platform : nRF52832

3. Purpose: NUS service with example ble_app_hrs_rscs_relay.

4. Problem : NUS device connection only success "BLE_NUS_C_EVT_DISCOVERY_COMPLETE" in second time power on.

5. Debug Information : RELAY device power on and NUS device connect at first time, always fail in on_primary_srv_discovery_rsp() and in function characteristics_discover().

static void on_primary_srv_discovery_rsp(ble_db_discovery_t       * p_db_discovery,
                                         ble_gattc_evt_t    const * p_ble_gattc_evt)
{
    ble_gatt_db_srv_t * p_srv_being_discovered;

    p_srv_being_discovered = &(p_db_discovery->services[p_db_discovery->curr_srv_ind]);

    if (p_ble_gattc_evt->conn_handle != p_db_discovery->conn_handle)
    {
        return;
    }

    if (p_ble_gattc_evt->gatt_status == BLE_GATT_STATUS_SUCCESS)
    {
        uint32_t err_code;
        ble_gattc_evt_prim_srvc_disc_rsp_t const * p_prim_srvc_disc_rsp_evt;

        NRF_LOG_DEBUG("Found service UUID 0x%x.", p_srv_being_discovered->srv_uuid.uuid);

        p_prim_srvc_disc_rsp_evt = &(p_ble_gattc_evt->params.prim_srvc_disc_rsp);

        p_srv_being_discovered->srv_uuid     = p_prim_srvc_disc_rsp_evt->services[0].uuid;
        p_srv_being_discovered->handle_range = p_prim_srvc_disc_rsp_evt->services[0].handle_range;

        err_code = characteristics_discover(p_db_discovery, p_ble_gattc_evt->conn_handle);

	
        if (err_code != NRF_SUCCESS)				
        {
            p_db_discovery->discovery_in_progress = false;

            // Error with discovering the service.
            // Indicate the error to the registered user application.
            discovery_error_evt_trigger(p_db_discovery, err_code, p_ble_gattc_evt->conn_handle);

            m_pending_user_evts[0].evt.evt_type    = BLE_DB_DISCOVERY_AVAILABLE;
            m_pending_user_evts[0].evt.conn_handle = p_ble_gattc_evt->conn_handle;
        }
    }
    else
    {
        NRF_LOG_DEBUG("Service UUID 0x%x not found.", p_srv_being_discovered->srv_uuid.uuid);
        // Trigger Service Not Found event to the application.
        discovery_complete_evt_trigger(p_db_discovery, false, p_ble_gattc_evt->conn_handle);
        on_srv_disc_completion(p_db_discovery, p_ble_gattc_evt->conn_handle);
    }
}

6. Relay device debug log.

when NUS device power on in first time, connection fail.

<info> app: Relay example started.
<info> app: Fast advertising.
<info> app: new on_adv_report, find target uuid
<debug> nrf_ble_gatt: Requesting to update ATT MTU to 247 bytes on connection 0x0.
<debug> nrf_ble_gatt: Updating data length to 251 on connection 0x0.
<info> app: Central connected
<info> app: Attempt to find HRS or RSC or eNUS on conn_handle 0x0
<debug> ble_db_disc: Starting discovery of service with UUID 0x180D on connection handle 0x0.
<debug> nrf_ble_gatt: BLE GATTS EVT_EXCHANGE MTU REQUES
<debug> nrf_ble_gatt: Peer on connection 0x0 requested an ATT MTU of 247 bytes.
<debug> nrf_ble_gatt: Updating ATT MTU to 247 bytes (desired: 247) on connection 0x0.
<debug> nrf_ble_gatt: ATT MTU updated to 247 bytes on connection 0x0 (response).
<debug> ble_db_disc: Starting discovery of service with UUID 0x180D on connection handle 0x0.
<debug> nrf_ble_gatt: Data length updated to 251 on connection 0x0.
<debug> nrf_ble_gatt: max_rx_octets: 251
<debug> nrf_ble_gatt: max_tx_octets: 251
<debug> nrf_ble_gatt: max_rx_time: 2120
<debug> nrf_ble_gatt: max_tx_time: 2120
<debug> ble_db_disc: on_primary_srv_discovery_rsp try to Found service UUID 0x180D.
<debug> ble_db_disc: Service UUID 0x180D not found.
<debug> ble_db_disc: Starting discovery of service with UUID 0x1814 on connection handle 0x0.
<debug> ble_db_disc: on_primary_srv_discovery_rsp try to Found service UUID 0x0.
<debug> ble_db_disc: Service UUID 0x0 not found.
<debug> ble_db_disc: Starting discovery of service with UUID 0x1814 on connection handle 0x0.
<debug> ble_db_disc: on_primary_srv_discovery_rsp try to Found service UUID 0x1814.
<debug> ble_db_disc: Service UUID 0x1814 not found.
<debug> ble_db_disc: Starting discovery of service with UUID 0x1 on connection handle 0x0.
<debug> ble_db_disc: on_primary_srv_discovery_rsp try to Found service UUID 0x1814.
<debug> ble_db_disc: Service UUID 0x1814 not found.
<debug> ble_db_disc: Starting discovery of service with UUID 0x1 on connection handle 0x0.
<debug> ble_db_disc: on_primary_srv_discovery_rsp try to Found service UUID 0x1.
<debug> ble_db_disc: Found service UUID 0x1.
<debug> ble_db_disc: on_primary_srv_discovery_rsp try to Found service UUID 0x1.
<debug> ble_db_disc: Found service UUID 0x1.
<debug> ble_db_disc: Discovery of service with UUID 0x1 completed with success on connection handle 0x0.
<debug> ble_db_disc: Discovery of service with UUID 0x1 completed with success on connection handle 0x0.

when NUS device power on in second time, connection success.

<info> app: new on_adv_report, find target uuid
<debug> nrf_ble_gatt: Requesting to update ATT MTU to 247 bytes on connection 0x1.
<debug> nrf_ble_gatt: Updating data length to 251 on connection 0x1.
<info> app: Central connected
<info> app: Attempt to find HRS or RSC or eNUS on conn_handle 0x1
<debug> ble_db_disc: Starting discovery of service with UUID 0x180D on connection handle 0x1.
<debug> nrf_ble_gatt: BLE GATTS EVT_EXCHANGE MTU REQUES
<debug> nrf_ble_gatt: Peer on connection 0x1 requested an ATT MTU of 247 bytes.
<debug> nrf_ble_gatt: Updating ATT MTU to 247 bytes (desired: 247) on connection 0x1.
<debug> nrf_ble_gatt: ATT MTU updated to 247 bytes on connection 0x1 (response).
<debug> ble_db_disc: Starting discovery of service with UUID 0x180D on connection handle 0x1.
<debug> nrf_ble_gatt: Data length updated to 251 on connection 0x1.
<debug> nrf_ble_gatt: max_rx_octets: 251
<debug> nrf_ble_gatt: max_tx_octets: 251
<debug> nrf_ble_gatt: max_rx_time: 2120
<debug> nrf_ble_gatt: max_tx_time: 2120
<debug> ble_db_disc: on_primary_srv_discovery_rsp try to Found service UUID 0x180D.
<debug> ble_db_disc: Service UUID 0x180D not found.
<debug> ble_db_disc: Starting discovery of service with UUID 0x1814 on connection handle 0x1.
<debug> ble_db_disc: on_primary_srv_discovery_rsp try to Found service UUID 0x1814.
<debug> ble_db_disc: Service UUID 0x1814 not found.
<debug> ble_db_disc: Starting discovery of service with UUID 0x1 on connection handle 0x1.
<debug> ble_db_disc: on_primary_srv_discovery_rsp try to Found service UUID 0x1.
<debug> ble_db_disc: Found service UUID 0x1.
<debug> ble_db_disc: Discovery of service with UUID 0x1 completed with success on connection handle 0x1.
<info> app: Discovery complete.
<info> app: eTest Nus discovered on conn_handle 0x1
<info> app: Connected to device with Nordic UART Service.

Parents Reply Children
  • Hi Vidar Berg,

    Thank you very much.

    Actually I have fixed it in below coding modification before your replay, thanks a lot your share.

    #if 1
    BLE_DB_DISCOVERY_DEF(m_db_discovery);                                   /**< DB Discovery module instance. */
    #else
    BLE_DB_DISCOVERY_ARRAY_DEF(m_db_discovery, 2);                      /**< Database discovery module instances. */
    #endif
    
    #if 1
    				err_code = ble_db_discovery_start(&m_db_discovery,
    												  p_ble_evt->evt.gap_evt.conn_handle);
    				APP_ERROR_CHECK(err_code);
    
    #else
                    err_code = ble_db_discovery_start(&m_db_discovery[0], p_gap_evt->conn_handle);
                    if (err_code == NRF_ERROR_BUSY)
                    {
                        err_code = ble_db_discovery_start(&m_db_discovery[1], p_gap_evt->conn_handle);
                        APP_ERROR_CHECK(err_code);
    					
    					if (err_code == NRF_ERROR_BUSY)
    					{
    						err_code = ble_db_discovery_start(&m_db_discovery[2], p_gap_evt->conn_handle);
    						APP_ERROR_CHECK(err_code);						
    					}
    
    					
                    }
                    else
                    {
                        APP_ERROR_CHECK(err_code);
                    }
    
    #endif

    I have test enlarge the m_db_discovery size from 2 to 3, it also can be fixed this problem, but make some way fail, I forgot the error code.

    #if 1
    BLE_DB_DISCOVERY_ARRAY_DEF(m_db_discovery, 3);                      /**< Database discovery module instances. */
    #else
    BLE_DB_DISCOVERY_ARRAY_DEF(m_db_discovery, 2);                      /**< Database discovery module instances. */
    #endif

    Thanks a lot for you replay.

  • Hi,

    Glad to hear that it works. There is a  bug in the discovery module  that might explain the error you got. The bug was reported here: https://devzone.nordicsemi.com/f/nordic-q-a/37744/bug-in-discovery-module-ble_db_discovery-c. It should not be a problem as long as you only run one discovery instance at a time. 

Related