ESP32学习笔记(35)——蓝牙MAC地址
一、背景
一個(gè) BLE 設(shè)備,可以使用兩種類型的地址(一個(gè) BLE 設(shè)備可同時(shí)具備兩種地址):
- Public Device Address(公共設(shè)備地址)
- Random Device Address(隨機(jī)設(shè)備地址)可分為兩類:
- Static Device Address(靜態(tài)設(shè)備地址)
- Private Device Address(私密設(shè)備地址)又可分為兩類:
- Non-resolvable Private Address(不可解析私密地址)
- Resolvable Private Address(可解析私密地址)
1.1 公共設(shè)備地址 Public Device Address
在通信系統(tǒng)中,設(shè)備地址是用來唯一識(shí)別一個(gè)物理設(shè)備的,如TCP/IP網(wǎng)絡(luò)中的MAC地址、傳統(tǒng)藍(lán)牙中藍(lán)牙地址等。對(duì)設(shè)備地址而言,一個(gè)重要的特性,就是唯一性。
對(duì)于經(jīng)典藍(lán)牙(BR/EDR)來說,其設(shè)備地址是一個(gè) 48bits 的數(shù)字,稱作“48-bit universal LAN MAC address”。正常情況下,該地址需要向 IEEE 申請(qǐng),具有唯一性。
這種地址分配方式在 BLE 中也保留了下來,就是公共設(shè)備地址(Public Device Address)。由 24-bit 的 company_id 和 24-bit 的 company_assigned 組成。
高 24 位是公司標(biāo)識(shí),低 24 位公司內(nèi)部自己賦值。
1.2 隨機(jī)設(shè)備地址 Random Device Address
但是,在 BLE 時(shí)代,只有公共設(shè)備地址明顯不夠用了,有如下原因:
為了解決上述問題,BLE 協(xié)議新增了一種地址:隨機(jī)設(shè)備地址,即設(shè)備地址不是固定分配的,而是在設(shè)備啟動(dòng)后隨機(jī)生成的。根據(jù)不同的目的,隨機(jī)設(shè)備地址分為靜態(tài)設(shè)備地址和私密設(shè)備地址。
1.2.1 靜態(tài)設(shè)備地址 Static Device Address
靜態(tài)設(shè)備地址是設(shè)備在上電時(shí)隨機(jī)生成的地址,其格式如下:
靜態(tài)設(shè)備地址的特征可總結(jié)為:
靜態(tài)設(shè)備地址的使用場景可總結(jié)為:
1.2.2 私密設(shè)備地址 Private Device Address
靜態(tài)設(shè)備地址通過地址隨機(jī)生成的方式,解決了部分問題。私密設(shè)備地址則更進(jìn)一步,通過定時(shí)更新和地址加密兩種方式,提高藍(lán)牙地址的可靠性和安全性。根據(jù)設(shè)備地址是否加密,又分為兩類:
① 不可解析私密地址 Non-resolvable Private Address
不可解析私密地址和靜態(tài)設(shè)備地址類似,不同之處在于不可解析私密地址會(huì)定時(shí)更新。更新的周期是由 GAP 規(guī)定的,稱作 T_GAP(private_addr_int),建議值是 15 分鐘。其格式如下:
不可解析私密地址的特征可總結(jié)為:
② 可解析私密地址 Resolvable Private Address
可解析私密地址比較有用,它通過一個(gè)隨機(jī)數(shù)和一個(gè)稱作 identity resolving key(IRK) 的密碼生成,因此只能被擁有相同 IRK 的設(shè)備掃描到,可以防止被未知設(shè)備掃描和追蹤。其格式如下:
可解析私密地址的特征可總結(jié)為:
1.3 分析廣播包中藍(lán)牙MAC地址
使用抓包工具抓取類似如下數(shù)據(jù)包:
其中數(shù)據(jù)包第 6 部分:
其中 TxAdd 表示發(fā)送方的地址類型(0 為 public,1為 random)。
RxAdd 表示接收方的地址類型。
對(duì)于普通廣播來說,只有 TxAdd 的指示是有效的,表示廣播發(fā)送者的第一類型。而對(duì)于定向廣播來說,TxAdd 和 RxAdd 都是有效的。
其中數(shù)據(jù)包第 7 部分:
如果是隨機(jī)設(shè)備地址,則查看地址的最高兩位。
- 如果是 “11” 就是靜態(tài)隨機(jī)地址。
- 如果是 “00” 就是不可解析私密地址。
- 如果是 “01” 就是可解析私密地址,并執(zhí)行上面說過的 ah 方法進(jìn)行解析。
二、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)以下隨機(jī)地址接口位于 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
三、使用公共設(shè)備地址
使用 examples\bluetooth\hci\controller_vhci_ble_adv 中的例程
- 獲取 MAC 地址:
- 設(shè)置 MAC 地址:
注意:要在初始化藍(lán)牙控制器接口 esp_bt_controller_init() 之前設(shè)置 MAC 地址。esp_base_mac_addr_set() 會(huì)在地址最后一位或上 0x01
查看地址:
四、使用隨機(jī)設(shè)備地址
使用 examples\bluetooth\bluedroid\ble\ble_ibeacon 中的例程
注意:工程中默認(rèn)使用公共設(shè)備地址。
將 ble_adv_params.own_addr_type由公共設(shè)備地址 BLE_ADDR_TYPE_PUBLIC,改為隨機(jī)設(shè)備地址 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, };然后設(shè)置隨機(jī)設(shè)備地址:
esp_bd_addr_t mac = {0xD4, 0x5E, 0xEC, 0x0E, 0x7D, 0x9E}; esp_ble_gap_set_rand_addr(mac);查看地址:
? 由 Leung 寫于 2021 年 7 月 15 日
總結(jié)
以上是生活随笔為你收集整理的ESP32学习笔记(35)——蓝牙MAC地址的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: USB HID接口芯片
- 下一篇: mac安装kafka