設備管理模塊管理 配對綁定 問題。主要做初始化各種註冊表(記錄配對綁定信息),初始化持久性存儲(存儲配對綁定信息)。根據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, ®ister_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 0
#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(®ister_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, ®ister_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;