设备地址
BLE的设备地址可以使用公共地址(Public Device Adress)或者随机地址(Random Device Address),一个BLE至少使用一种地址类型,当然也可以同时使用两种地址类型。
公共地址和随机地址一样,都是48位(6字节),BLE设备地址关系如下:
- 公共地址:从IEEE申请(购买),IEEE保证地址的唯一性;
- 随机静态地址:自己定义,上电初始化完成后不能修改;
- 随机不可解析私有地址:定时更新地址,蓝牙核心规范建议15分钟更新一次;
- 随机可解析私有地址:通信双方使用共享的身份解析密钥(IRK:Indentity Resolving Key),生成和解析可解析私有地址。只有一台设备拥有另一台设备的IRK时,才能跟踪该广播设备的活动。
1. 公共地址
公共地址包含2部分:
公共地址能够明确的指示出设备,同时具有唯一性,但安全度不够,不法分子可以通过计数手段跟踪该唯一的公共地址,即可以跟踪到这设备的使用者。
为加强隐私,蓝牙核心规范中提供另外一种地址:随机地址,随机地址是随机产生的,不是固定分配的,随机地址又分为多种类型,以适用不同应用场景对隐私的要求。
2. 随机地址
2.1 随机静态地址
- 随机静态地址的定义;随机静态地址是随机生成的48位地址,随即地址必须符合以下要求:
- 静态地址的最高2位有效位必须是1。
- 静态地址最高2位有效位之外的其余部分不能全为0。
- 静态地址最高2位有效位之外的其余部分不能全为1。
- 一个上电周期内不变。
静态地址的格式如下图,共48位,最高2位是固定的,必须是1。
- 代码中使用随机静态地址的方法
程序中使用随机静态地址时,可以每次上电时重新设置随机地址,但是初始化完成后,不能修改地址。设置随机静态地址和读取随机静态地址的流程如下图所示。
从上图中我们可以看到,读写随机静态地址需要用到地址结构体ble_gap_addr_t和两个
API函数。其中地址结构体ble_gap_addr_t的声明如下。读和写的时候,都需要定义地址结
构体,读的时候用来保存读取的设备地址和设备地址类型,写的时候用来将待写入的地址传
递给API函数sd_ble_gap_addr_set().
读写设备地址使用2个api函数,sd_ble_gap_addr_set() 和 sd_ble_gap_addr_get():
获取广播者使用的蓝牙地址使用该函数sd_ble_gap_adv_addr_get():
-
写设备地址示例:
定义地址结构体my_addr,然后设置需要写入的设备地址,并将地址类型设置位随机静态地址(BLE_GAP_ADDR_TYPE_RANDOM_STATIC),注意静态地址最高2位必须都是1.下面代码中使用的静态地址如下所示:
-
都设备地址示例:
定义地址结构体my_addr,用来保存读取的设备地址和类型,然后调用API函数sd_ble_gap_addr_get()获取设备地址,读取成功后,设备地址会保存到my_addr.
-
读取广播PDU中设备地址示例:
定义地址结构体my_addr,用来保存读取的设备地址和类型,然后调用API函数sd_ble_gap_adv_addr_get()获取设备地址,读取成功后,设备地址会保存到my_addr.
- 读取设备出厂时设置的地址:
Nordic的BLE例子中都没有设置设备地址,原因是芯片出厂时已经设置了48位的地址和地址类型(地址类型为随机静态地址),应用程序可从下面2个寄存器读取设备地址及类型:
SDK中的BLE例子使用的设备地址是初始化时协议栈从DEVICEADDR[n]寄存器中读
出来的,DEVICEADDR[n]寄存器中存储的是随机静态地址,所以BLE例子中使用的都是
随机静态地址。
由此可见,如果应用程序不设置设备地址的话,设备就会使用协议栈默认从芯片读取的
设备地址,地址类型为随机静态地址。
2.2 不可解析私有地址
- 定义如下:
- 最高2为必须为0;
- 其余位不能全0;
- 也不能全1;
- 不能和公共地址一样;
不可解析地址,周期性的改变地址,并且是完全随机的,很难被跟踪,安全性高,但是使用不多。
2. 代码使用:
ble_gap_privacy+params_t定义结构体变量,在使用sd_ble_gap_privacy_set()设置
2.3 可解析私有地址
定义:
- 最高两位必须是0和1;
- 其余不能全为0;
- 其余不能全为1;
- 不能和公共地址一样。
代码只用和不可解析私有地址类似。
标签:addr,静态,地址,随机,ble,设备 From: https://www.cnblogs.com/maodoudou/p/18418960