連接時觸發配對

連接時觸發配對 


基於動態密碼的例子上修改,

動態密碼篇 和 靜態密碼篇是連接後點擊notify後才觸發 輸入配對碼。

本文章是 連接時 就觸發 輸入配對碼。

1、手機連接上後立刻調用安全請求api:  sd_ble_gap_authenticate
2、這樣手機收到後就會發送配對請求    :BLE_GAP_EVT_SEC_PARAMS_REQUEST
3、回覆手機的配對請求,設置不綁定。(這樣手機每次收到設備的安全請求就會發配對請求過來從而啓動配對)
              err_code = sd_ble_gap_sec_params_reply();
4、之配對過程會自動進行。我們只需要根據收到的BLE_GAP_EVT_AUTH_STATUS事件,判斷其狀態是否是成功,來決定配對是不是成功了,從而決定斷不斷開鏈接。

//步驟一

//設置配對時要交換的信息:
//這裏只是演示靜態密碼,不需要綁定
#define SEC_PARAM_BOND 0
//因爲要輸入密碼,就是一種MITM攻擊保護,所以這裏設置MITM
#define SEC_PARAM_MITM 1
//這裏設置只有現實屏(其實沒有,但是我們用的是事先知道的靜態密碼,不需要顯示)
#define SEC_PARAM_IO_CAPABILITIES BLE_GAP_IO_CAPS_DISPLAY_ONLY
//不使用帶外數據
#define SEC_PARAM_OOB 0
//鏈路加密密鑰的長度
#define SEC_PARAM_MIN_KEY_SIZE 7
#define SEC_PARAM_MAX_KEY_SIZE 16
//定義全局變量, 設置配對啓動後交換的信息.
ble_gap_sec_params_t  m_sec_params;

//初始化  配對啓動後交換的信息.該函數放在 int main(void) 裏的 conn_params_init();後.
void sec_params_init(void)
{
m_sec_params.bond = SEC_PARAM_BOND;
m_sec_params.mitm = SEC_PARAM_MITM;
m_sec_params.io_caps = SEC_PARAM_IO_CAPABILITIES;
m_sec_params.oob = SEC_PARAM_OOB;
m_sec_params.min_key_size = SEC_PARAM_MIN_KEY_SIZE;
m_sec_params.max_key_size = SEC_PARAM_MAX_KEY_SIZE;
}


//步驟二

static void on_ble_evt(ble_evt_t * p_ble_evt)

{

case BLE_GAP_EVT_CONNECTED:

//1、連接時觸發配對碼
m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
egBTLinkState = LINK_CONN;

sec_params_init();
err_code =  sd_ble_gap_authenticate(m_conn_handle,&m_sec_params); 
APP_ERROR_CHECK(err_code);
break;

case BLE_GAP_EVT_SEC_PARAMS_REQUEST:

//2、收到主機配對請求,把自己的配對安全參數迴應給主機

 sec_params_init();
err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_SUCCESS, &m_sec_params, NULL);
APP_ERROR_CHECK(err_code);
break;

case BLE_GAP_EVT_PASSKEY_DISPLAY:

//3、打印passkey到串口,用戶輸入該配對碼
 printf("show passkey: ");
for ( int i = 0; i < 6; i++)
printf("%c",p_ble_evt->evt.gap_evt.params. passkey_display.passkey[i]);
 break;

//4、判斷配對是否成功,如果不成功斷開連接,從而阻止他人任意連接。

case BLE_GAP_EVT_AUTH_STATUS:
if(p_ble_evt->evt.gap_evt.params.auth_status.auth_status == BLE_GAP_SEC_STATUS_SUCCESS)
{
      printf("pair success\r\n");
}
else
{
      err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);

      APP_ERROR_CHECK(err_code);

}
break;

}








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章