device manager init

設備管理模塊管理 配對綁定 問題。主要做初始化各種註冊表(記錄配對綁定信息),初始化持久性存儲(存儲配對綁定信息)。根據bool形參選擇 擦除持久性存儲裏的配對綁定信息,還是讀取持久性存儲裏的配對綁定信息到註冊表裏。


該例程存在一個問題:

每次新設備連接都觸發配對請求(手機彈窗:藍牙配對請求),即使是大於最大綁定數量(DEVICE_MANAGER_MAX_BONDS)也觸發,只是超出部分的加密信息不保存而已,但是配對還是成功的。這種情況就是已保存的設備再次連接是不會再觸發配對請求。


一 、鼠標例程的device_manager_init有4部分。

心率例程的device_manager_init有3部分(2、3、4),也可以添加1。



1、初始化配對綁定句柄信息。把句柄參數初始化爲無效id(DM_INVALID_ID)即無配對綁定狀態。

dm_handle_t     m_bonded_peer_handle;   /**< Device reference handle to the current connected peer. */

err_code = dm_handle_initialize(&m_bonded_peer_handle);



2、初始化持久性存儲模塊。也是復位一些各種參數。

uint32_t pstorage_init(void);

err_code = pstorage_init();



3、設備管理器模塊初始化。

ret_code_t dm_init(dm_init_param_t const * p_init_param);

err_code = dm_init(&init_param);

初始化各種註冊表


註冊持久性存儲。註冊成功後,根據形參判斷是否做擦除處理還是讀取持久性存儲。


讀取持久性存儲



4、註冊設備管理應用

ret_code_t dm_register(dm_application_instance_t    * p_appl_instance,

                       dm_application_param_t const * p_appl_param);

err_code = dm_register(&m_app_handle, &register_param);



4.1、 結構體 ble_gap_sec_params_t 參數分析

具體詳細分析 查看前面的 <<配對、綁定、密鑰生成方法>> 篇




5、設備管理器事件句柄函數


5.1:DM_EVT_CONNECTION

5.2:DM_EVT_DISCONNECTION

5.3:DM_EVT_SECURITY_SETUP

5.4:DM_EVT_SECURITY_SETUP_COMPLETE

5.5:DM_EVT_LINK_SECURED

5.6:DM_EVT_SECURITY_SETUP_REFRESH


5.7:DM_EVT_DEVICE_CONTEXT_LOADED

5.8:DM_EVT_DEVICE_CONTEXT_STORED

5.9:DM_EVT_DEVICE_CONTEXT_DELETED

5.10:DM_EVT_SERVICE_CONTEXT_LOADED

5.11:DM_EVT_SERVICE_CONTEXT_STORED

5.12:DM_EVT_SERVICE_CONTEXT_DELETED

5.13:DM_EVT_APPL_CONTEXT_LOADED

5.14:DM_EVT_APPL_CONTEXT_STORED

5.15:DM_EVT_APPL_CONTEXT_DELETED



應用:

#include "pstorage.h"

#include "device_manager.h"


#define SEC_PARAM_BOND                  1

#define SEC_PARAM_MITM                   0 

#define SEC_PARAM_LESC                   0

#define SEC_PARAM_KEYPRESS         0

#define SEC_PARAM_IO_CAPABILITIES     BLE_GAP_IO_CAPS_NONE 

#define SEC_PARAM_OOB                  

#define SEC_PARAM_MIN_KEY_SIZE         7 

#define SEC_PARAM_MAX_KEY_SIZE        16 


static dm_handle_t     m_bonded_peer_handle; //當前連接配對綁定的設備句柄

static dm_application_instance_t    m_app_handle;//應用id分配

APP_TIMER_DEF(m_sec_req_timer_id);


static void sec_req_timeout_handler(void * p_context)

{  

    uint32_t             err_code;

    dm_security_status_t status;

    if (m_peer_handle.connection_id != DM_INVALID_ID)

    {

        err_code = dm_security_status_req(&m_peer_handle, &status);

        APP_ERROR_CHECK(err_code);

        // If the link is still not secured by the peer, initiate security procedure.

        if (status == NOT_ENCRYPTED)

        {

            err_code = dm_security_setup_req(&m_peer_handle);

            APP_ERROR_CHECK(err_code);

        }

    }

}

void sec_timers_init(void)

{

    uint32_t err_code;

    // Create security request timer.

    err_code = app_timer_create(&m_sec_req_timer_id,

                                APP_TIMER_MODE_SINGLE_SHOT,

                                sec_req_timeout_handler);

    APP_ERROR_CHECK(err_code);

}

static uint32_t device_manager_evt_handler(dm_handle_t const * p_handle,

                                           dm_event_t const  * p_event,

                                           ret_code_t        event_result)

{

    APP_ERROR_CHECK(event_result);

    switch (p_event->event_id)

    {

        case DM_EVT_CONNECTION:

            m_peer_handle = (*p_handle);

            err_code      = app_timer_start(m_sec_req_timer_id, APP_TIMER_TICKS(1500, APP_TIMER_PRESCALER) , NULL);

            APP_ERROR_CHECK(err_code);

            break;

        default:

            break;

    }

    return NRF_SUCCESS;

}


void device_manager_init(bool erase_bonds)

{

    uint32_t               err_code;

    dm_init_param_t        init_param = {.clear_persistent_data = erase_bonds};

    // Initialize peer device handle.

    err_code = dm_handle_initialize(&m_bonded_peer_handle);

    APP_ERROR_CHECK(err_code);

    // Initialize persistent storage module.

    err_code = pstorage_init();

    APP_ERROR_CHECK(err_code);

    err_code = dm_init(&init_param);

    APP_ERROR_CHECK(err_code);

    dm_application_param_t register_param;

    memset(&register_param.sec_param, 0, sizeof(ble_gap_sec_params_t));

    register_param.sec_param.bond         = SEC_PARAM_BOND;

    register_param.sec_param.mitm         = SEC_PARAM_MITM;

    register_param.sec_param.lesc         = SEC_PARAM_LESC;

    register_param.sec_param.keypress     = SEC_PARAM_KEYPRESS;

    register_param.sec_param.io_caps      = SEC_PARAM_IO_CAPABILITIES;

    register_param.sec_param.oob          = SEC_PARAM_OOB;

    register_param.sec_param.min_key_size = SEC_PARAM_MIN_KEY_SIZE;

    register_param.sec_param.max_key_size = SEC_PARAM_MAX_KEY_SIZE;

    register_param.evt_handler            = device_manager_evt_handler;

    register_param.service_type           = DM_PROTOCOL_CNTXT_GATT_SRVR_ID;

    err_code = dm_register(&m_app_handle, &register_param);

    APP_ERROR_CHECK(err_code);

}


static void sys_evt_dispatch(uint32_t sys_evt)

{

    pstorage_sys_event_handler(sys_evt);

    ble_advertising_on_sys_evt(sys_evt);//操作flash完成,不再需要等待就啓動廣播

}

void ble_stack_init(void)

{

    uint32_t err_code;

    err_code = softdevice_sys_evt_handler_set(sys_evt_dispatch);

    APP_ERROR_CHECK(err_code);

}



添加按鍵清除綁定信息功能:

case BSP_EVENT_KEY_0:

err_code =dm_device_delete_all(&m_app_handle);

APP_ERROR_CHECK(err_code);

nrf_gpio_pin_toggle(LED_2);

break;





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