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

科普 | 低功耗蓝牙配对

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

有了这个 characteristic,当设备的服务发生改变时,设备就可以通过这个 characteristic 发送一个 indicate PDU 给到手机,从而手机知道设备的服务已发生了改变,此时手机会重新发起 service discovery 流程,以重新获得 service 和 characteristic 最新的 handle 列表。欲添加 service changed characteristic,你只需在 sdk_config.h 文件中打开如下两个宏:

科普 | 低功耗蓝牙配对

然后当服务发生改变时,调用 pm_local_database_has_changed(),协议栈就会自动发起 service changed indicate PDU 给手机,从而引起手机重走服务发现过程。

°删除主机端绑定信息: 如果手机端删除了绑定信息,为了安全起见,设备端也需要跟着一起删除绑定信息,否则手机无法再次跟设备进行配对,这个是最理想的情况,但是我们有的设备没有任何输入接口,无法手动删除绑定信息,这个时候能不能有一种办法可以让手机跟设备进行二次配对呢?

为此,Nordic 提供了一种 workaround,在蓝牙事件回调函数里面,加上如下代码即可:

if (p_evt->evt_id == PM_EVT_CONN_SEC_CONFIG_REQ)

{

pm_conn_sec_config_t cfg;

cfg.allow_repairing = true;

pm_conn_sec_config_reply(p_evt->conn_handle, &cfg);

}

这样,即使用户把手机端 paring 信息删掉,设备端 paring 信息没有删掉,手机还是可以跟设备进行二次配对的。

°删除从机端绑定信息:  跟上面相反,如果设备端 bonding 信息被删除了,而手机端 bonding 信息没有被删除,这种情况下如何实现二次配对?

最安全的方式,让用户主动删除手机端绑定信息,但是很多开发者希望,用户体验好一点,也就是说,碰到这种情况希望手机能自动删除绑定信息,这个能不能实现跟手机有很大关系,首先我们确保协议栈返回 LL_REJECT_IND or LL_REJECT_EXT_IND,错误码为“PIN or key missing”,一般而言,手机收到这个 PDU 后,都会自动删除 bonding 信息。

如果上述方法行不通的话,那么发送完 LL_REJECT_IND 后再调用断开函数(sd_ble_gap_disconnect),同时将断开原因设为 BLE_HCI_AUTHENTICATION_FAILURE 即可。

°同时绑定多个设备:  Nordic SDK 是支持一个设备同时跟多个主机绑定,只要设备存储空间足够大,那么可以绑定的设备数就不设限。nRF5 SDK 中 bonding 信息也是通过 fds 来存储的,也就是说绑定信息和用户 Flash 数据共享同一块空间,如果需要绑定多个设备,那么 FDS_VIRTUAL_PAGES 这个宏的值必须进行修改,以保证分配的 Flash 空间可以同时容纳 bonding 信息和用户 Flash 数据。

一般来说,如果需要绑定多个设备,请设置一个最大绑定数,比如 8 个,这样,一旦检测到绑定数达到 8 了,就可以把以前老的 bonding 设备删除,从而节省存储空间。那如何知道哪个设备是老设备哪个设备是新设备?这个是通过 peer rank 来实现的,大家只要使能 PM_PEER_RANKS_ENABLED 这个宏,就可以自动实现排序。

°循环绑定测试:  很多开发者喜欢做循环绑定测试,即同一部手机不断跟同一个设备进行配对,然后删除配对信息,然后再进行配对,他们测试下来发现:

达到一定次数后,设备就工作不正常了,这个是由于当 bonding 信息不断累积而不进行删除的话,那么分配给 fds 的 Flash 空间就会耗尽,从而导致异常出现(最新的 SDK 会在 Flash 存储空间耗尽时,自动删除最老设备的绑定信息,但即使这样,对用户 Flash 数据的操作影响还是很大)。

解决这个问题的方法就是设定一个最大 bonding 数,达到这个数目后,删除老 bonding 信息,从而达到循环利用 Flash 空间的目的。当然如果你的 fds 只是用来存储 bonding 信息而不做其他用户数据操作的话,那么就没有必要加上这个功能了。

°白名单与绑定:  虽然白名单和绑定二者没有任何联系,但是我们一般都把两者结合起来一起使用,以达到我们的使用期望。当两个设备绑定成功后,我们就可以将对方的 mac 地址或者 IRK 放入白名单中,同时开启白名单广播,这样设备只跟白名单中的主机进行连接,白名单以外的设备在 controller 层面就被过滤掉了,从而提高私密性以及连接效率。

这种情况下,哪怕是合法的设备,如果之前没有跟设备绑定,那么它也无法跟设备建立连接。换句话说,如果你想把新设备加入到白名单中,那么首先需要禁止白名单广播而采用普通广播,然后跟新设备进行配对,成功后再把新设备身份信息加入到白名单中。白名单与绑定的例子具体可参考:ble_app_hids_keyboard。

°Authenticated payload timeout:  大家都知道蓝牙连接有一个 supervision timeout 时间,也就是说,当建立连接的两个设备,任何一方在 supervision timeout(比如 4s)时间内,没有给对方发送任何蓝牙空口包,此时认为连接已断开,并触发 supervision timeout 事件。

当设备双方建立加密连接后,不仅有上述的 supervision timeout,还有一个 authenticated payload timeout,authenticated payload timeout 默认为 30s,它的意思是,两个设备加密后,30s 内必须有一个有数据的空口包交互,而不能一直发空包,否则认为 authenticated payload timeout。

Authenticated payload timeout 是协议栈自动管理的,对软件开发来说是透明的,每 30s 时间到,如果期间没有任何有效数据包交互(一直在发空包),协议栈会自动发送一个 ping request 给对方,以避免 authenticated payload timeout 的出现(注:这里的协议栈既可以是设备的协议栈,也可以是手机的协议栈)。

有时候不想等到 30s 超时到了再发送 ping request,大家可以在 connected 事件中,调用如下 API 以提前发出 ping request。

科普 | 低功耗蓝牙配对

当然,如果你能保证每 30s 时间内,手机和设备之间肯定会有有效数据包交互,或者手机端能及时准确地发出 ping request,那么上述过程就完全没有必要了。

低功耗蓝牙密钥NFC


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

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

热点阅读