科普 | 低功耗蓝牙配对
°把 ble_app_hrs 配对方式改成 LESC with numeric comparison: 原始 ble_app_hrs 为 just work 方式的 LESC 配对,我们现在把它改成最高安全级别的 numeric comparison LESC。我们的开发板没有显示器,因此我们将通过日志的方式把数字比较值输出,同时把 button3 的按下作为 yes 确认,button4 的按下作为 reject 确认。 何实现 numeric comparison?前面我也提过,如果 SDK 有现成的例子,直接参考例子来;如果 SDK 没有现成的例子,那么就参考 softdevice 工作时序图。关于 LESC numeric comparison,从机端的工作流程如下所示: https://infocenter.nordicsemi.com/index.jsp? topic=%2Fcom.nordic.infocenter.s132.api.v7.0.1%2Fgroup___b_l_e___g_a_p___p_e_r_i_p_h___l_e_s_c___b_o_n_d_i_n_g___n_c___m_s_c.html 这里要强调一下,时序图会把有可能需要用到事件和 API 都列出来,但不意味着列出来的事件和 API 都需要你那哪些事件和 API 需要用户自己处理呢?一个原则:全文搜索一下,只要 peer manager 已经调用过的 API,你就不用处理;而流程图中剩下的 API 就需要你自己去处理了。 比如上面这个例子,sd_ble_gap_sec_params_reply 已经被 peer manager 模块处理了,所以你不用处理;而 BLE_GAP_EVT_PASSKEY_DISPLAY 和 sd_ble_gap_auth_key_reply 只在 passkey 和 numeric comparison 配对方式中才会出现,peer manager 没有对其进行处理,因此需要用户自己处理。为此,我们在 ble_evt_handler 中加上分支:BLE_GAP_EVT_PASSKEY_DISPLAY,并按照流程图的要求加上相应的处理,代码如下所示: 上面只是显示了 passkey,如前所述,如果 button3 按下我们回复 BLE_GAP_AUTH_KEY_TYPE_PASSKEY;如果 button4 按下我们回复 BLE_GAP_AUTH_KEY_TYPE_NONE。相关代码如下所示: 如前所述,配对方式是由 IO 输入输出能力确定的,而且 numeric comparison 是具备 MITM 能力的,为此我们还需要修改如下两个地方: 苹果手机是不能手动发起配对请求的,为了让苹果手机自动发起配对请求,我们将如下 characteristic 的安全级别提高:(注:除了这种方法,我们也可以通过从机主动发起安全请求来达到同样的目的)。 我这里以 PCA10040/Keil5 工程为例来编译,请编译工程: nRF5SDK160098a08e2examplesle_peripheralle_app_hrspca10040s132arm5_no_packs。 将编译好的代码下载到开发板中,测试的时候,我们先连接开发板,然后使能 CCCD,此时不管 Android 手机还是苹果手机,都会跳出配对对话框,同时显示出配对码,如下: 开发板也把配对码打印出来了,如果两者一致,按下 button3,整个配对流程顺利完成,开发板会打印如下信息: 上述代码已上传到百度云盘,大家可以去百度云盘下载: 代码链接 链接:https://pan.baidu.com/s/1FKTfY3Q_zBVvviO7KC7Gyg#list/path=%2Fblog 密码:y8fb ble_app_hrs_nc.rar,然后解压缩到 SDK 根目录 examplesble_peripheral,打开 Keil5 工程: SDK 根目录 examplesble_peripheral ble_app_hrs_ncpca10040s132arm5_no_packs,就可以直接编译和运行。 6. 关于配对的一些小贴士 °苹果手机的一点不同: 安卓手机允许用户手动发起 paring 请求,而苹果手机则没有这个功能。因此,即使你的 characteristic 没有使能安全级别,安卓手机还是可以跟你的设备完成配对的,而苹果手机则不支持这个功能,苹果手机要不要跟设备进行配对,不能由人来控制的,只能由苹果 iOS 来控制。 欲触发苹果 iOS 发起配对请求,有两种方法: 一是将某个 characteristic 加上安全认证权限,这样 iOS 在服务发现过程中就会自动发起配对请求,以满足 characteristic 的安全认证级别; 二是从机端主动发起安全请求,iOS 收到从机的安全请求后,会等待用户的授权确认从而发起配对请求。这两种方法在 ble_app_gls 中都有体现,大家可以参考相关代码。 °重连加密等级: 绑定成功后,如果发生重连,那么主机应该自动发起加密连接请求,以对连接进行加密。一般来说,在连接没有成功加密前,主从机不要做敏感数据的交互,否则 softdevice API 会报 NRF_ERROR_FORBIDDEN。对于有 MITM 保护的加密连接,在收到 PM_EVT_CONN_SEC_SUCCEEDED 这个事件后,设备应该去检测连接的安全等级是否符合要求,具体可参考 ble_app_gls 例子的做法。 °Service changed(服务改变): 设备跟手机绑定成功后,手机再次重连这个设备时,就会自动跳过 service discovery 过程,换句话说,配对的时候手机会把设备所有服务和 characteristic 的 handle 保存下来,二次重连的时候,直接用以前保存的 handle 值去操作设备。 但是,如果设备的服务改变了,此时手机再用之前的 handle 去操作设备,就会出问题。为了解决这个问题,在 GATT 主服务里面引入了 service changed characteristic,如下所示: (编辑:应用网_阳江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |