ret_code_t app_ble_db_discovery_start(app_ble_db_disc_t * pDisc)
{
    // Initialize the service discovery database
    ret_code_t err_code = ble_db_discovery_init(app_db_disc_handler);
    if (err_code != NRF_SUCCESS)
    {
        APP_DISC_INFO("ble_db_discovery_init(), err = %s." , nrf_strerror_get(err_code));
        return err_code;
    }

    // Register the UUIDs to be explored in order
    for (uint8_t i = 0; i < pDisc->count; i++)
    {
        err_code = ble_db_discovery_evt_register(&pDisc->uuid[i]);
        if (err_code != NRF_SUCCESS)
        {
            APP_DISC_ERR("ble_db_discovery_evt_register(), uuid[%d], err = 0x04X", i, err_code);
        }
        else
            APP_DISC_INFO("ble_db_discovery_evt_register(), uuid[%d]: 0x%04X", i, pDisc->uuid[i].uuid);
    }

    // Save the function handles for processing search events and the total number of services that started exploration
    m_service_count = pDisc->count;
    APP_DISC_INFO("db discovery start, service count = %d.", m_service_count);

    // Start service exploration, and return whether the startup is successful
    memset(&m_db_disc, 0x00, sizeof(m_db_disc));
    err_code = ble_db_discovery_start(&m_db_disc, pDisc->conn_handle);
    if (err_code != NRF_SUCCESS)
    {
        APP_DISC_INFO("ble_db_discovery_start(), conn_handle = 0x%04X, err = %s." , pDisc->conn_handle, nrf_strerror_get(err_code));
    }

    return err_code;
}