BLE主機或從機綁定信息丟失問題


在Nordic產品開發中,有遇到主機和從機之間建立綁定,以及當某一方(主/從機)的綁定信息丟失后出現連接失敗問題,有以下幾種應用場景。針對不同的場景需修改或添加部分代碼,以下代碼是基於nRF5_SDK_15.3.0_59ac345\examples\ble_peripheral\ble_app_ancs_c 示例,主要修改main.c 文件的pm_evt_handler函數里面的內容。

場景1: 主機端刪除了綁定信息,但是nRF52從機端仍然保留了原綁定信息, nRF52從機需要允許重新配對,通過新的綁定信息去覆蓋原來的綁定信息,需對代碼進行以下修改:

        case PM_EVT_CONN_SEC_CONFIG_REQ:

        {

            NRF_LOG_INFO("PM_EVT_CONN_SEC_CONFIG_REQ: peer_id=%d, accept to fix bonding\r\n",

                           p_evt->peer_id);

            // Accept pairing request from an already bonded peer.

            pm_conn_sec_config_t conn_sec_config = {.allow_repairing = true};

            pm_conn_sec_config_reply(p_evt->conn_handle, &conn_sec_config);

        } break;

在重新配對操作時需要對增加的白名單做個判斷,即已經添加過的記錄不應當再加進來,基本的代碼邏輯如下:

already_added= false;
for (uint8_t i = 0; i<m_whitelist_peer_cnt;i++)
{
    if (m_whitelist_peers[i] = m_peer_id)
    {
        already_added= true;
        break;
    }
}
       
if (!already_added)
{
   m_whitelist_peers[m_whitelist_peer_cnt++] = m_peer_id;
   err_code= pm_whitelist...
   。。。。。。
}

 場景2: 主機端保留了原綁定信息,但是nRF52從機端刪除了綁定信息,nRF52端需要在密碼較驗失敗時仍保持連接,代碼修改如下:

      case PM_EVT_CONN_SEC_FAILED:

        {

            NRF_LOG_INFO("PM_EVT_CONN_SEC_FAILED: peer_id=%d, procedure=%d, error=0x%04x\r\n",

                          p_evt->peer_id,

                          p_evt->params.conn_sec_failed.procedure,

                          p_evt->params.conn_sec_failed.error);

            if (p_evt->params.conn_sec_failed.procedure == PM_LINK_SECURED_PROCEDURE_ENCRYPTION &&

                p_evt->params.conn_sec_failed.error == PM_CONN_SEC_ERROR_PIN_OR_KEY_MISSING)

            {

                // Local device lost bond info, don't disconnect and wait for re-bond

                NRF_LOG_INFO("Waiting for host to fix bonding\r\n");

            }

            else

            {

              sprintf(m_message, "Security procedure failed, disconnect.\r\n");

              dev_ctrl_send_msg(m_message, strlen(m_message));

              (void)sd_ble_gap_disconnect(p_evt->conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);

            }

        } break;

 

主機端如果是手機或平板電腦,根據操作系統的區別有不同的處理方式: 

iOS:    沒有解決方案,只能通過手動刪除主機端綁定信息 。

Android:   可以執行新的綁定程序,刪除掉舊的綁定信息。

如果主機端為nRF52 設備時,可以強制重新配對並建立綁定連接產生新的綁定信息, 修改代碼如下:

       case PM_EVT_CONN_SEC_FAILED:

        {

            NRF_LOG_INFO("PM_EVT_CONN_SEC_FAILED: peer_id=%d, procedure=%d, error=0x%04x\r\n",

                          p_evt->peer_id,

                          p_evt->params.conn_sec_failed.procedure,

                          p_evt->params.conn_sec_failed.error);

            if (p_evt->params.conn_sec_failed.procedure == PM_LINK_SECURED_PROCEDURE_ENCRYPTION &&

                p_evt->params.conn_sec_failed.error == PM_CONN_SEC_ERROR_PIN_OR_KEY_MISSING)

            {

                // Peer device lost bond info, do re-bonding

                NRF_LOG_INFO("Peer lost bond info. Start re-bonding\r\n");

                err_code = pm_conn_secure(p_evt->conn_handle, true);

                if (err_code != NRF_SUCCESS)

                {

                    NRF_LOG_WARNING("Cannot fix out-of-sync bonding: 0x%08x\r\n", err_code);

                }

            }

            else

            {

                sprintf(m_message, "Connection failed, disconnect.\r\n");

                dev_ctrl_send_msg(m_message, strlen(m_message));

                (void)sd_ble_gap_disconnect(p_evt->conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);

            }

        } break;

概述如下:

場景

iOS

Android

nRF52

Comment

主機丟失綁定信息

O

O

O

i.e. Central side bond info is removed

從機丟失綁定信息

X

O

O

i.e. Peripheral side bond info is removed


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM