<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>how to bonding BLE in 52832?</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/50779/how-to-bonding-ble-in-52832</link><description>I try to bonding func using ble_app_gls example. 
 just connect is fine. 
 here is ble_evt handler 
 for trying connect bonding, I use pm_handler_secure_on_connection(p_ble_evt) 
 but here is occur error : pm_conn_secure() failed because conn_handle 0</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Tue, 13 Aug 2019 06:21:45 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/50779/how-to-bonding-ble-in-52832" /><item><title>RE: how to bonding BLE in 52832?</title><link>https://devzone.nordicsemi.com/thread/203720?ContentTypeID=1</link><pubDate>Tue, 13 Aug 2019 06:21:45 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:75c9678c-9e96-4249-9278-63f45b0aa04d</guid><dc:creator>Vidar Berg</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;Did you erase any existing bonds on the peripheral before this test? Note that the app data region holding the bond information will not be overwritten when you re-program the application.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s another thread that you might find relevant:&amp;nbsp;&lt;a href="https://devzone.nordicsemi.com/f/nordic-q-a/38663/keep-getting-failed-to-secure-connection-error"&gt;https://devzone.nordicsemi.com/f/nordic-q-a/38663/keep-getting-failed-to-secure-connection-error&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: how to bonding BLE in 52832?</title><link>https://devzone.nordicsemi.com/thread/203481?ContentTypeID=1</link><pubDate>Mon, 12 Aug 2019 07:17:43 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:aac9a481-7270-4dea-b717-5074f1dbc5ef</guid><dc:creator>BEN_HB</dc:creator><description>&lt;p&gt;yes.&amp;nbsp;remove second&amp;nbsp;&lt;span&gt;pm_handler_secure_on_connection in IF sentence, still happend error.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;I test 52832(peripheral) and nRF connect app (android).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;I reupload my code.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Goal is&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;1. success bonding (just work, no lesc)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;2. add whitelist&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;3.after disconnect, using whitelist connect one more.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
{
    ret_code_t err_code;

    ble_conn_state_status_t st;
    pm_handler_secure_on_connection(p_ble_evt);    

    switch (p_ble_evt-&amp;gt;header.evt_id)
    {
        case BLE_GAP_EVT_CONNECTED:  

            NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_CONNECTED\n&amp;quot;);

            bsp_board_led_off(BSP_BOARD_LED_2);
            bsp_board_led_on(BSP_BOARD_LED_1);
            
            m_conn_handle = p_ble_evt-&amp;gt;evt.gap_evt.conn_handle;

            err_code = nrf_ble_qwr_conn_handle_assign(&amp;amp;m_qwr, m_conn_handle);
            APP_ERROR_CHECK(err_code);           
            break;

        case BLE_GAP_EVT_DISCONNECTED:
            NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_DISCONNECTED\n&amp;quot;);
            bsp_board_led_off(BSP_BOARD_LED_1);
            m_conn_handle = BLE_CONN_HANDLE_INVALID;
            advertising_start(BLE_ADV_MODE_FAST);

            break;

        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
          NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_PHY_UPDATE_REQUEST\n&amp;quot;);
        {
            ble_gap_phys_t const phys =
            {
                .rx_phys = BLE_GAP_PHY_AUTO,
                .tx_phys = BLE_GAP_PHY_AUTO,
            };

            err_code = sd_ble_gap_phy_update(p_ble_evt-&amp;gt;evt.gap_evt.conn_handle, &amp;amp;phys);
            APP_ERROR_CHECK(err_code);
        } break;


        case BLE_GAP_EVT_SEC_INFO_REQUEST:
            NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_SEC_INFO_REQUEST\n&amp;quot;);
            err_code = sd_ble_gap_sec_info_reply(m_conn_handle, NULL, NULL, NULL);
            APP_ERROR_CHECK(err_code);
            break;

        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
            NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_SEC_PARAMS_REQUEST\n&amp;quot;);
            err_code = sd_ble_gap_sec_params_reply(m_conn_handle,
                                                   BLE_GAP_SEC_STATUS_SUCCESS,
                                                   &amp;amp;sec_param,
                                                   &amp;amp;sec_key);
            APP_ERROR_CHECK(err_code);
            break;

        case BLE_GAP_EVT_ADV_SET_TERMINATED:
          NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_ADV_SET_TERMINATED\n&amp;quot;);
            if (p_ble_evt-&amp;gt;evt.gap_evt.params.adv_set_terminated.reason ==
                BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_TIMEOUT)
            {
               bsp_board_led_off(BSP_BOARD_LED_2);
               if(ble_adv_t.adv_mode_current == BLE_ADV_MODE_FAST)
               {
                  advertising_start(BLE_ADV_MODE_SLOW);
               }       
                
            }
            break;

        case BLE_GATTS_EVT_SYS_ATTR_MISSING:
          NRF_LOG_INFO(&amp;quot;BLE_GATTS_EVT_SYS_ATTR_MISSING\n&amp;quot;);
            err_code = sd_ble_gatts_sys_attr_set(m_conn_handle,
                                                 NULL,
                                                 0,
                                                 BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS | BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS);
            APP_ERROR_CHECK(err_code);
            break;

        case BLE_GAP_EVT_TIMEOUT :
           NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_TIMEOUT\n&amp;quot;);
           break;

        case BLE_GAP_EVT_PHY_UPDATE  :
           NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_PHY_UPDATE \n&amp;quot;);
           break;

        case BLE_GAP_EVT_CONN_PARAM_UPDATE : 
          NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_CONN_PARAM_UPDATE \n&amp;quot;);
           break;

        case BLE_GAP_EVT_PASSKEY_DISPLAY  :      
          NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_PASSKEY_DISPLAY passkey \n&amp;quot;);
           break;

        case BLE_GAP_EVT_KEY_PRESSED  : 
          NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_KEY_PRESSED  \n&amp;quot;);
           break;

        case BLE_GAP_EVT_AUTH_KEY_REQUEST   : 
          NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_AUTH_KEY_REQUEST   \n&amp;quot;);
           break;

        case BLE_GAP_EVT_LESC_DHKEY_REQUEST   : 
          NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_LESC_DHKEY_REQUEST   \n&amp;quot;);
           break;

        case BLE_GAP_EVT_AUTH_STATUS  : 

          NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_AUTH_STATUS  \n&amp;quot;);
          NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_AUTH_STATUS: status=0x%x bond=0x%x lv4: %d kdist_own:0x%x kdist_peer:0x%x&amp;quot;,
                         p_ble_evt-&amp;gt;evt.gap_evt.params.auth_status.auth_status,
                         p_ble_evt-&amp;gt;evt.gap_evt.params.auth_status.bonded,
                         p_ble_evt-&amp;gt;evt.gap_evt.params.auth_status.sm1_levels.lv4,
                         *((uint8_t *)&amp;amp;p_ble_evt-&amp;gt;evt.gap_evt.params.auth_status.kdist_own),
                         *((uint8_t *)&amp;amp;p_ble_evt-&amp;gt;evt.gap_evt.params.auth_status.kdist_peer));
           break;

        case BLE_GAP_EVT_CONN_SEC_UPDATE   : 
          NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_CONN_SEC_UPDATE   \n&amp;quot;);
           break;  
                 
        case BLE_GAP_EVT_RSSI_CHANGED   : 
          NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_RSSI_CHANGED   \n&amp;quot;);
           break;

        case BLE_GAP_EVT_ADV_REPORT   : 
          NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_ADV_REPORT   \n&amp;quot;);
           break;

        case BLE_GAP_EVT_SEC_REQUEST    : 
          NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_SEC_REQUEST    \n&amp;quot;);
           break;

        case BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST    : 
          NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST    \n&amp;quot;);
           break;

        case BLE_GAP_EVT_SCAN_REQ_REPORT    : 
          NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_SCAN_REQ_REPORT    \n&amp;quot;);
           break;  
               
        case BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST    : 
          NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST    \n&amp;quot;);
           break;

        case BLE_GAP_EVT_DATA_LENGTH_UPDATE    : 
          NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_DATA_LENGTH_UPDATE    \n&amp;quot;);
           break;

        case BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT    : 
          NRF_LOG_INFO(&amp;quot;BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT    \n&amp;quot;);
           break; 
                
        default:
            NRF_LOG_INFO(&amp;quot;DEFUALT %x\n&amp;quot; ,p_ble_evt-&amp;gt;header.evt_id);
            // No implementation needed.
            break;
    }
}

static void peer_manager_init()
{    

    memset(&amp;amp;whitelist, 0xFFFF , sizeof(whitelist)); // 0xFFFF = invalid peer id
    whitelist_count = 0;
    ret_code_t  err_code;

    err_code = pm_init();
    APP_ERROR_CHECK(err_code);

    memset(&amp;amp;sec_param, 0, sizeof(ble_gap_sec_params_t));

    // Security parameters to be used for all security procedures.
    sec_param.bond           = SEC_PARAM_BOND;
    sec_param.mitm           = SEC_PARAM_MITM;
    sec_param.lesc           = SEC_PARAM_LESC;
    sec_param.keypress       = SEC_PARAM_KEYPRESS;
    sec_param.io_caps        = SEC_PARAM_IO_CAPABILITIES;
    sec_param.oob            = SEC_PARAM_OOB;
    sec_param.min_key_size   = SEC_PARAM_MIN_KEY_SIZE;
    sec_param.max_key_size   = SEC_PARAM_MAX_KEY_SIZE;
    sec_param.kdist_own.enc  = 1;
    sec_param.kdist_own.id   = 1;
    sec_param.kdist_peer.enc = 1;
    sec_param.kdist_peer.id  = 1;

    err_code = pm_sec_params_set(&amp;amp;sec_param); 
    // Until this function is called, all bonding procedures that are initiated by the peer are rejected.
    APP_ERROR_CHECK(err_code);    

    err_code = pm_peers_delete();
    APP_ERROR_CHECK(err_code);

    err_code = pm_register(pm_evt_handler);
    APP_ERROR_CHECK(err_code);

    NRF_LOG_INFO(&amp;quot;PEER MANAGER INIT END\n&amp;quot;);
}

static void pm_evt_handler(pm_evt_t const * p_evt)
{
    pm_handler_on_pm_evt(p_evt);

    pm_handler_flash_clean(p_evt);

    ret_code_t err_code;
    pm_conn_sec_status_t conn_sec_status;

    switch (p_evt-&amp;gt;evt_id)
    {
        case PM_EVT_BONDED_PEER_CONNECTED :
            NRF_LOG_INFO(&amp;quot;PM_EVT_BONDED_PEER_CONNECTED \n&amp;quot;);            
            break;

        case PM_EVT_CONN_SEC_START :
            NRF_LOG_INFO(&amp;quot;PM_EVT_CONN_SEC_START \n&amp;quot;);
            break;

        case PM_EVT_CONN_SEC_SUCCEEDED :
            
            // Check if the link is authenticated (meaning at least MITM).
            err_code = pm_conn_sec_status_get(p_evt-&amp;gt;conn_handle, &amp;amp;conn_sec_status);
            APP_ERROR_CHECK(err_code);

            if (conn_sec_status.mitm_protected)
            {
                NRF_LOG_INFO(&amp;quot;Link secured. Role: %d. conn_handle: %d, Procedure: %d&amp;quot;,
                             ble_conn_state_role(p_evt-&amp;gt;conn_handle),
                             p_evt-&amp;gt;conn_handle,
                             p_evt-&amp;gt;params.conn_sec_succeeded.procedure);
            }
            else
            {
                // The peer did not use MITM.                
                
//                pm_peer_data_store(p_evt-&amp;gt;peer_id, PM_PEER_DATA_ID_FIRST, )
//
//                whitelist[whitelist_count++] = p_evt-&amp;gt;peer_id;
//                err_code = pm_whitelist_set(whitelist,BLE_GAP_WHITELIST_ADDR_MAX_COUNT);
//                APP_ERROR_CHECK(err_code);

                ble_gap_addr_t addr;
                uint32_t addr_cnt = sizeof(addr);

              
                err_code = pm_whitelist_get(&amp;amp;addr, &amp;amp;addr_cnt, NULL,NULL);
                APP_ERROR_CHECK(err_code);

                NRF_LOG_INFO(&amp;quot;white list peer type = %x\n&amp;quot;,addr.addr_type);

            }
            
            NRF_LOG_INFO(&amp;quot;PM_EVT_CONN_SEC_SUCCEEDED \n&amp;quot;);
            break;

        case PM_EVT_CONN_SEC_FAILED :
            NRF_LOG_INFO(&amp;quot;PM_EVT_CONN_SEC_FAILED \n&amp;quot;);
            m_conn_handle = BLE_CONN_HANDLE_INVALID;
            break;

        case PM_EVT_CONN_SEC_CONFIG_REQ :
            NRF_LOG_INFO(&amp;quot;PM_EVT_CONN_SEC_CONFIG_REQ \n&amp;quot;);
            break;

        case PM_EVT_CONN_SEC_PARAMS_REQ :
            NRF_LOG_INFO(&amp;quot;PM_EVT_CONN_SEC_PARAMS_REQ \n&amp;quot;);
            err_code = pm_conn_sec_params_reply(p_evt-&amp;gt;conn_handle, &amp;amp;sec_param, p_evt-&amp;gt;params.conn_sec_params_req.p_context);
            APP_ERROR_CHECK(err_code);
            break;

        case PM_EVT_STORAGE_FULL :
            NRF_LOG_INFO(&amp;quot;PM_EVT_STORAGE_FULL \n&amp;quot;);
            break;

        case PM_EVT_ERROR_UNEXPECTED :
            NRF_LOG_INFO(&amp;quot;PM_EVT_ERROR_UNEXPECTED \n&amp;quot;);
            break;

        case PM_EVT_PEER_DATA_UPDATE_FAILED  :
            NRF_LOG_INFO(&amp;quot;PM_EVT_PEER_DATA_UPDATE_FAILED  \n&amp;quot;);
            break;

        case PM_EVT_PEER_DELETE_SUCCEEDED  :
            NRF_LOG_INFO(&amp;quot;PM_EVT_PEER_DELETE_SUCCEEDED  \n&amp;quot;);
            break;

        case PM_EVT_PEER_DELETE_FAILED :
            NRF_LOG_INFO(&amp;quot;PM_EVT_PEER_DELETE_FAILED \n&amp;quot;);
            break;

        case PM_EVT_PEERS_DELETE_SUCCEEDED :
            NRF_LOG_INFO(&amp;quot;PM_EVT_PEERS_DELETE_SUCCEEDED \n&amp;quot;);
            advertising_start(BLE_ADV_MODE_FAST);
            break;

        case PM_EVT_PEERS_DELETE_FAILED :
            NRF_LOG_INFO(&amp;quot;PM_EVT_PEERS_DELETE_FAILED \n&amp;quot;);
            break;

        case PM_EVT_LOCAL_DB_CACHE_APPLIED :
            NRF_LOG_INFO(&amp;quot;PM_EVT_LOCAL_DB_CACHE_APPLIED \n&amp;quot;);
            break;

        case PM_EVT_LOCAL_DB_CACHE_APPLY_FAILED :
            NRF_LOG_INFO(&amp;quot;PM_EVT_LOCAL_DB_CACHE_APPLY_FAILED \n&amp;quot;);
            break;

        case PM_EVT_SERVICE_CHANGED_IND_SENT :
            NRF_LOG_INFO(&amp;quot;PM_EVT_SERVICE_CHANGED_IND_SENT \n&amp;quot;);
            break;

        case PM_EVT_SERVICE_CHANGED_IND_CONFIRMED :
            NRF_LOG_INFO(&amp;quot;PM_EVT_SERVICE_CHANGED_IND_CONFIRMED \n&amp;quot;);
            break;

        case PM_EVT_SLAVE_SECURITY_REQ :
            NRF_LOG_INFO(&amp;quot;PM_EVT_SLAVE_SECURITY_REQ \n&amp;quot;);
            break;

        case PM_EVT_FLASH_GARBAGE_COLLECTED :
            NRF_LOG_INFO(&amp;quot;PM_EVT_FLASH_GARBAGE_COLLECTED \n&amp;quot;);
            break;

        case PM_EVT_FLASH_GARBAGE_COLLECTION_FAILED :
            NRF_LOG_INFO(&amp;quot;PM_EVT_FLASH_GARBAGE_COLLECTION_FAILED \n&amp;quot;);
            break; 
              
        default:
            break;
    }
}&lt;/pre&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;on peer_manager_init()&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;SEC_PARAM_BOND = 1, other is 0&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;1. first error is&amp;nbsp;pm_handler_secure_on_connection()&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;if second try to connect, it is normal.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;2. if after bonding, the info don&amp;#39;t need to add whitelist manually?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;3.now on nRF connect app, display bonded.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;and then disconnect, try to connect on BONDED tap&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;sd_ble_gap_sec_info_reply return error NRF_ERROR_INVALID_STATE.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;thank you&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class="tw-data-text tw-ta tw-text-large" id="tw-target-text"&gt;&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: how to bonding BLE in 52832?</title><link>https://devzone.nordicsemi.com/thread/203362?ContentTypeID=1</link><pubDate>Fri, 09 Aug 2019 14:15:35 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:d410f849-72c8-4c88-a68d-57d78edb1dd9</guid><dc:creator>Vidar Berg</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;The central (phone in this case) will usually start the pairing procedure after the connection is established (App dependent on Android). If not&amp;nbsp;pm_handler_secure_on_connection() will send a pairing request to the central after the PM_HANDLER_SEC_DELAY_MS&amp;nbsp;delay has expired to ask the central to initiate the pairing procedure. But I&amp;nbsp;see from your code that&amp;nbsp;pm_handler_secure_on_connection() is called twice. Do you get the same error if you comment out the second call?&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>