一键连接使用说明
手表与手机完成 BLE 连接绑定之后生成 LTK,协议层将 LTK 转为经典蓝牙所需要的 linkkey,进而达到一次连接上 BLE 和 BR/EDR 的效果。
基于 SDK 的实现,可打开宏 F_APP_SC_KEY_DERIVE_SUPPORT
。
配置说明
-
BLE 和经典蓝牙的地址(Public Device Address)和设备名称要相同。
MCUConfig Tool 中 BLE 和经典蓝牙的设备名称设置相同。
在BLE ready 和 BR/EDR ready 事件中,调用
app_ble_common_adv_set_param()
更新adv_data[]
中广播数据。
void app_ble_common_adv_set_param(void) { /* update adv data with device name & bt address */ uint8_t le_name_len; uint8_t bt_bd_addr[6] ; gap_get_param(GAP_PARAM_BD_ADDR, bt_bd_addr); le_name_len = strlen((char *)app_cfg_const.device_name_le_default); adv_data[11] = bt_bd_addr[5]; adv_data[12] = bt_bd_addr[4]; adv_data[13] = bt_bd_addr[3]; adv_data[14] = bt_bd_addr[2]; adv_data[15] = bt_bd_addr[1]; adv_data[16] = bt_bd_addr[0]; adv_data[17] = le_name_len + 1; if (le_name_len >= ADV_DATA_MAX_LE_NAME_LEN) { adv_data[17] = ADV_DATA_MAX_LE_NAME_LEN + 1; } memset(&adv_data[19], 0x00, ADV_DATA_MAX_LE_NAME_LEN); memcpy(&adv_data[19], app_cfg_nv.device_name_le, adv_data[17] - 1); le_set_gap_param(GAP_PARAM_DEVICE_NAME, adv_data[17] - 1, &adv_data[19]); ... }
-
设置 auth_flags。
uint16_t auth_flags = GAP_AUTHEN_BIT_BONDING_FLAG | GAP_AUTHEN_BIT_SC_FLAG; uint16_t auth_sec_req_flags = GAP_AUTHEN_BIT_BONDING_FLAG | GAP_AUTHEN_BIT_SC_FLAG;
-
在
app_ble_key_derive_init()
中实现了 BLE 密钥派生的初始化设置,指定了分发的密钥类型,并开启了 LE 与 BR/EDR 密钥转换支持 (LTK 转换为 Linkkey),需要在 BLE Stack 初始化时调用:void app_ble_key_derive_init(void) { APP_PRINT_INFO0("app_ble_key_derive_init"); uint8_t init_key = SMP_DIST_ENC_KEY | SMP_DIST_ID_KEY | SMP_DIST_LINK_KEY; uint8_t response_key = SMP_DIST_ENC_KEY | SMP_DIST_LINK_KEY; le_bond_cfg_local_key_distribute(init_key, response_key); /*set convert LTK to linkkey*/ uint8_t key_convert_flag = GAP_SC_KEY_CONVERT_LE_TO_BREDR_FLAG; gap_set_param(GAP_PARAM_BOND_LINK_KEY_CONVERT, sizeof(key_convert_flag), &key_convert_flag); }
-
iOS BLE 连接完成后,可以通过调用
le_bond_pair()
发起配对,实现一键连接。备注
iOS 13 之前的版本不支持此功能。