加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_阳江站长网 (https://www.0662zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 评论 > 正文

科普 | 低功耗蓝牙配对

发布时间:2020-06-04 09:14:36 所属栏目:评论 来源:站长网
导读:Paring(配对)和 bonding(绑定)是实现蓝牙射频通信安全的一种机制,有两点需要注意: 一是 paring/bonding 实现的是蓝牙链路层的安全,对应用来说完全透明,也就是说,不管有没有 paring/bonding,你发送或接收应用数据的方式是一样的,不会因为加了 pa

°把 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,如下所示:

科普 | 低功耗蓝牙配对

(编辑:应用网_阳江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读