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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章