一键连接使用说明

手表与手机完成 BLE 连接绑定之后生成 LTK,协议层将 LTK 转为经典蓝牙所需要的 linkkey,进而达到一次连接上 BLE 和 BR/EDR 的效果。

基于 SDK 的实现,可打开宏 F_APP_SC_KEY_DERIVE_SUPPORT

配置说明

  1. BLE 和经典蓝牙的地址(Public Device Address)和设备名称要相同。

    1. MCUConfig Tool 中 BLE 和经典蓝牙的设备名称设置相同。

    2. 在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]);
       ...
    }
    
  2. 设置 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;
    
  3. 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);
    }
    
  4. iOS BLE 连接完成后,可以通过调用 le_bond_pair() 发起配对,实现一键连接。

    备注

    • iOS 13 之前的版本不支持此功能。