nrf52832学习笔记(5)BLE地址

一个ble设备,地址可以分成2大类

  • Public Device Address(公共设备地址)
    公共设备地址 Public Device Address是48bits的数字,就和电脑mac地址一样,是全球唯一的,一般传统蓝牙用这种地址。

  • Random Device Address(随机设备地址)
    不是固定分配,而是设备启动后随机分配,Random Device Address(随机设备地址)又可以分成2类

    • Static Device Address( 静态设备地址)
      最高2bits为“11”,
      剩余46bits是随机数,不能全0或全1
      在一个上电周期保持不变
      下一次上电可以变也可以不变
    • Private Device Address(私密设备地址)
      分为2类
      • Non-resolvable private address(不可解析私密地址)
        最高2bits为“00”
        剩余46bits是随机数,不能全0或全1
        每隔T_GAP周期更新
      • 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

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);
}

你可能感兴趣的:(蓝牙,nrf52832)