裝置地址

毛豆*_*發表於2024-09-18

裝置地址

BLE的裝置地址可以使用公共地址(Public Device Adress)或者隨機地址(Random Device Address),一個BLE至少使用一種地址型別,當然也可以同時使用兩種地址型別。
公共地址和隨機地址一樣,都是48位(6位元組),BLE裝置地址關係如下:

  • 公共地址:從IEEE申請(購買),IEEE保證地址的唯一性;
  • 隨機靜態地址:自己定義,上電初始化完成後不能修改;
  • 隨機不可解析私有地址:定時更新地址,藍芽核心規範建議15分鐘更新一次;
  • 隨機可解析私有地址:通訊雙方使用共享的身份解析金鑰(IRK:Indentity Resolving Key),生成和解析可解析私有地址。只有一臺裝置擁有另一臺裝置的IRK時,才能跟蹤該廣播裝置的活動。

1. 公共地址

公共地址包含2部分:

公共地址能夠明確的指示出裝置,同時具有唯一性,但安全度不夠,不法分子可以透過計數手段跟蹤該唯一的公共地址,即可以跟蹤到這裝置的使用者。
為加強隱私,藍芽核心規範中提供另外一種地址:隨機地址,隨機地址是隨機產生的,不是固定分配的,隨機地址又分為多種型別,以適用不同應用場景對隱私的要求。

2. 隨機地址

2.1 隨機靜態地址
  1. 隨機靜態地址的定義;隨機靜態地址是隨機生成的48位地址,隨即地址必須符合以下要求:
  • 靜態地址的最高2位有效位必須是1。
  • 靜態地址最高2位有效位之外的其餘部分不能全為0。
  • 靜態地址最高2位有效位之外的其餘部分不能全為1。
  • 一個上電週期內不變。
    靜態地址的格式如下圖,共48位,最高2位是固定的,必須是1。
  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.

  1. 讀取裝置出廠時設定的地址:
    Nordic的BLE例子中都沒有設定裝置地址,原因是晶片出廠時已經設定了48位的地址和地址型別(地址型別為隨機靜態地址),應用程式可從下面2個暫存器讀取裝置地址及型別:


    SDK中的BLE例子使用的裝置地址是初始化時協議棧從DEVICEADDR[n]暫存器中讀
    出來的,DEVICEADDR[n]暫存器中儲存的是隨機靜態地址,所以BLE例子中使用的都是
    隨機靜態地址。
    由此可見,如果應用程式不設定裝置地址的話,裝置就會使用協議棧預設從晶片讀取的
    裝置地址,地址型別為隨機靜態地址。
2.2 不可解析私有地址
  1. 定義如下:
  • 最高2為必須為0;
  • 其餘位不能全0;
  • 也不能全1;
  • 不能和公共地址一樣;

不可解析地址,週期性的改變地址,並且是完全隨機的,很難被跟蹤,安全性高,但是使用不多。
2. 程式碼使用:
ble_gap_privacy+params_t定義結構體變數,在使用sd_ble_gap_privacy_set()設定

2.3 可解析私有地址

定義:

  • 最高兩位必須是0和1;
  • 其餘不能全為0;
  • 其餘不能全為1;
  • 不能和公共地址一樣。

程式碼只用和不可解析私有地址類似。

相關文章