日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ESP32学习笔记(35)——蓝牙MAC地址

發(fā)布時間:2024/3/26 编程问答 72 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ESP32学习笔记(35)——蓝牙MAC地址 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、背景

一個 BLE 設備,可以使用兩種類型的地址(一個 BLE 設備可同時具備兩種地址):

  • Public Device Address(公共設備地址)
  • Random Device Address(隨機設備地址)可分為兩類:
    • Static Device Address(靜態(tài)設備地址)
    • Private Device Address(私密設備地址)又可分為兩類:
      • Non-resolvable Private Address(不可解析私密地址)
      • Resolvable Private Address(可解析私密地址)

1.1 公共設備地址 Public Device Address

在通信系統(tǒng)中,設備地址是用來唯一識別一個物理設備的,如TCP/IP網(wǎng)絡中的MAC地址、傳統(tǒng)藍牙中藍牙地址等。對設備地址而言,一個重要的特性,就是唯一性。

對于經(jīng)典藍牙(BR/EDR)來說,其設備地址是一個 48bits 的數(shù)字,稱作“48-bit universal LAN MAC address”。正常情況下,該地址需要向 IEEE 申請,具有唯一性。

這種地址分配方式在 BLE 中也保留了下來,就是公共設備地址(Public Device Address)。由 24-bit 的 company_id 和 24-bit 的 company_assigned 組成。


高 24 位是公司標識,低 24 位公司內部自己賦值。

1.2 隨機設備地址 Random Device Address

但是,在 BLE 時代,只有公共設備地址明顯不夠用了,有如下原因:

  • 公共設備地址需要向 IEEE 購買,需要一筆開銷。
  • 公共設備地址的申請與管理相對繁瑣、復雜,再加上 BLE 設備的數(shù)量眾多(和傳統(tǒng)藍牙設備不是一個數(shù)量級的),導致維護成本增大。
  • 安全因素。BLE 很大一部分的應用場景是廣播通信,這意味著只要知道設備的地址,就可以獲取所有的信息,這是很不安全的。因此固定的設備地址,加大了信息泄露的風險。
  • 為了解決上述問題,BLE 協(xié)議新增了一種地址:隨機設備地址,即設備地址不是固定分配的,而是在設備啟動后隨機生成的。根據(jù)不同的目的,隨機設備地址分為靜態(tài)設備地址和私密設備地址。

    1.2.1 靜態(tài)設備地址 Static Device Address

    靜態(tài)設備地址是設備在上電時隨機生成的地址,其格式如下:

    靜態(tài)設備地址的特征可總結為:

  • 最高兩個 bit 為 “11”。
  • 剩余的 46bits 是一個隨機數(shù),不能全部為0,也不能全部為1。
  • 在一個上電周期內保持不變。
  • 下一次上電的時候可以改變。但不是強制的,因此也可以保持不變。如果改變,上次保存的連接等信息,將不再有效。
  • 靜態(tài)設備地址的使用場景可總結為:

  • 46bits 的隨機數(shù),可以很好地解決“設備地址唯一性”的問題,因為兩個地址相同的概率很小。
  • 地址隨機生成,可以解決公共設備地址申請所帶來的費用和維護問題。
  • 1.2.2 私密設備地址 Private Device Address

    靜態(tài)設備地址通過地址隨機生成的方式,解決了部分問題。私密設備地址則更進一步,通過定時更新和地址加密兩種方式,提高藍牙地址的可靠性和安全性。根據(jù)設備地址是否加密,又分為兩類:
    ① 不可解析私密地址 Non-resolvable Private Address
    不可解析私密地址和靜態(tài)設備地址類似,不同之處在于不可解析私密地址會定時更新。更新的周期是由 GAP 規(guī)定的,稱作 T_GAP(private_addr_int),建議值是 15 分鐘。其格式如下:

    不可解析私密地址的特征可總結為:

  • 最高兩個 bit 為 “00”。
  • 剩余的 46bits 是一個隨機數(shù),不能全部為0,也不能全部為1。
  • 以 T_GAP(private_addr_int) 為周期,定時更新。
  • ② 可解析私密地址 Resolvable Private Address
    可解析私密地址比較有用,它通過一個隨機數(shù)和一個稱作 identity resolving key(IRK) 的密碼生成,因此只能被擁有相同 IRK 的設備掃描到,可以防止被未知設備掃描和追蹤。其格式如下:

    可解析私密地址的特征可總結為:

  • 高位 24bits 是隨機數(shù)部分,其中最高兩個 bit 為“10”,用于標識地址類型;低位 24bits 是隨機數(shù)和 IRK 經(jīng)過 hash 運算得到的 hash值,運算公式為 hash = ah(IRK, prand)。
  • 當主端 BLE 設備掃描到該類型的藍牙地址后,會使用保存在本機的 IRK,和該地址中的 prand,進行同樣的 hash 運算,并將運算結果和地址中的 hash 字段比較,相同的時候,才進行后續(xù)的操作。這個過程稱作 resolve(解析),如果不同則繼續(xù)用下一個 IRK 做上面的過程,直到找到一個關聯(lián) IRK 或者一個也沒找到。
  • 以T_GAP(private_addr_int) 為周期,定時更新。哪怕在廣播、掃描、已連接等過程中,也可能改變。
  • Resolvable Private Address 不能單獨使用,因此需要使用該類型的地址的話,設備要同時具備 Public Device Address 或者 Static Device Address 中的一種。
  • 1.3 分析廣播包中藍牙MAC地址

    使用抓包工具抓取類似如下數(shù)據(jù)包:

    其中數(shù)據(jù)包第 6 部分:

    其中 TxAdd 表示發(fā)送方的地址類型(0 為 public,1為 random)。
    RxAdd 表示接收方的地址類型。
    對于普通廣播來說,只有 TxAdd 的指示是有效的,表示廣播發(fā)送者的第一類型。而對于定向廣播來說,TxAdd 和 RxAdd 都是有效的。

    其中數(shù)據(jù)包第 7 部分:

    如果是隨機設備地址,則查看地址的最高兩位。

    • 如果是 “11” 就是靜態(tài)隨機地址。
    • 如果是 “00” 就是不可解析私密地址。
    • 如果是 “01” 就是可解析私密地址,并執(zhí)行上面說過的 ah 方法進行解析。

    二、API說明

    以下 MAC 地址接口位于 components\esp_system\include\esp_system.h

    2.1 esp_base_mac_addr_set

    esp_err_t esp_base_mac_addr_set(const uint8_t *mac)

    2.2 esp_read_mac

    typedef enum {ESP_MAC_WIFI_STA,ESP_MAC_WIFI_SOFTAP,ESP_MAC_BT,ESP_MAC_ETH, } esp_mac_type_t;esp_err_t esp_read_mac(uint8_t* mac, esp_mac_type_t type)

    以下隨機地址接口位于 bt/host/bluedroid/api/include/api/esp_gap_ble_api.h

    2.3 esp_ble_gap_set_rand_addr

    2.4 esp_ble_gap_clear_rand_addr

    三、使用公共設備地址

    使用 examples\bluetooth\hci\controller_vhci_ble_adv 中的例程

    • 獲取 MAC 地址:
    uint8_t mac[6] = {0}; esp_read_mac(mac, ESP_MAC_BT); ESP_LOG_BUFFER_HEX(tag, mac, 6);
    • 設置 MAC 地址:
      注意:要在初始化藍牙控制器接口 esp_bt_controller_init() 之前設置 MAC 地址。esp_base_mac_addr_set() 會在地址最后一位或上 0x01
    uint8_t mac[6] = {0xbc, 0xdd, 0xc2, 0xd1, 0xc5 ,0x6F}; esp_base_mac_addr_set(mac);

    查看地址:

    四、使用隨機設備地址

    使用 examples\bluetooth\bluedroid\ble\ble_ibeacon 中的例程
    注意:工程中默認使用公共設備地址。

    將 ble_adv_params.own_addr_type由公共設備地址 BLE_ADDR_TYPE_PUBLIC,改為隨機設備地址 BLE_ADDR_TYPE_RANDOM。

    static esp_ble_adv_params_t ble_adv_params = {.adv_int_min = 0x20,.adv_int_max = 0x40,.adv_type = ADV_TYPE_NONCONN_IND,.own_addr_type = BLE_ADDR_TYPE_RANDOM,.channel_map = ADV_CHNL_ALL,.adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY, };

    然后設置隨機設備地址:

    esp_bd_addr_t mac = {0xD4, 0x5E, 0xEC, 0x0E, 0x7D, 0x9E}; esp_ble_gap_set_rand_addr(mac);

    查看地址:


    ? 由 Leung 寫于 2021 年 7 月 15 日

    總結

    以上是生活随笔為你收集整理的ESP32学习笔记(35)——蓝牙MAC地址的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。