NORDIC BLE MAC ADDR
一个ble设备,地址可以分成2大类
1、Public Device Address(公共设备地址)
公共设备地址 Public Device Address是48bits的数字,就和电脑mac地址一样,是全球唯一的,一般传统蓝牙用这种地址。
公共设备地址 Public Device Address是48bits的数字,就和电脑mac地址一样,是全球唯一的,一般传统蓝牙用这种地址。
2、Random Device Address(随机设备地址)
不是固定分配,而是设备启动后随机分配,Random Device Address(随机设备地址)又可以分成2类
不是固定分配,而是设备启动后随机分配,Random Device Address(随机设备地址)又可以分成2类
1)Static Device Address( 静态设备地址)
最高2bits为“11”,
剩余46bits是随机数,不能全0或全1
在一个上电周期保持不变
下一次上电可以变也可以不变
2)Private Device Address(私密设备地址),分为2类
最高2bits为“11”,
剩余46bits是随机数,不能全0或全1
在一个上电周期保持不变
下一次上电可以变也可以不变
2)Private Device Address(私密设备地址),分为2类
a、Non-resolvable private address(不可解析私密地址)
最高2bits为“00”
剩余46bits是随机数,不能全0或全1
每隔T_GAP周期更新
b、Resolvable private address(不可解析私密地址)
高24bits是随机数,最高2bits为“10”
低24bits是随机数和IRK进过hash运算得到hash值,hash=ah(IRK,prand)
对端BLE扫描到该类型地址后,用本地IRK和该地址的prand进行ah运算,如果得到值和该类型地址低24bits一致才进行后续操作。
最高2bits为“00”
剩余46bits是随机数,不能全0或全1
每隔T_GAP周期更新
b、Resolvable private address(不可解析私密地址)
高24bits是随机数,最高2bits为“10”
低24bits是随机数和IRK进过hash运算得到hash值,hash=ah(IRK,prand)
对端BLE扫描到该类型地址后,用本地IRK和该地址的prand进行ah运算,如果得到值和该类型地址低24bits一致才进行后续操作。
总结下就4中类型地址:
Public Device Address(公共设备地址)
Static Device Address( 静态设备地址) 11 —nrf52832默认是用这种
Non-resolvable private address(不可解析私密地址) 00
Resolvable private address(不可解析私密地址) 10
Static Device Address( 静态设备地址) 11 —nrf52832默认是用这种
Non-resolvable private address(不可解析私密地址) 00
Resolvable private address(不可解析私密地址) 10
sdk中相关api
获得本地mac地址
[out] p_addr
uint32_t sd_ble_gap_address_get(ble_gap_addr_t *p_addr);
ble_gap_addr_t 结构体如下
/**@brief Bluetooth Low Energy address. */
typedef struct{
//地址类型
uint8_t addr_type; /**< See @ref BLE_GAP_ADDR_TYPES. */
//存放地址的数组 6字节
uint8_t addr[BLE_GAP_ADDR_LEN]; /**< 48-bit address, LSB format. */
} ble_gap_addr_t;
[in]addr_cycle_mode :
/**< Set addresses directly, no automatic address cycling. */
BLE_GAP_ADDR_CYCLE_MODE_NONE 0x00
/**< Automatically generate and update private addresses. */
BLE_GAP_ADDR_CYCLE_MODE_AUTO 0x01
注意当用他设置成静态随机地址Static Device Address时,地址的最高2bits必须为“11”,否则无效
uint32_t sd_ble_gap_address_set(uint8_t addr_cycle_mode, ble_gap_addr_t const *p_addr);
下面是把默认地址+1后设置的函数
void mac_set(void)
{
ble_gap_addr_t addr; //获得地址
uint32_t err_code = sd_ble_gap_address_get(&addr);
APP_ERROR_CHECK(err_code);
addr.addr[0] += 1;
//写地址
err_code = sd_ble_gap_address_set(BLE_GAP_ADDR_CYCLE_MODE_NONE, &addr);
APP_ERROR_CHECK(err_code);
}
原文链接:https://blog.csdn.net/loosen17/article/details/98184652