ESP32學(xué)習(xí)筆記(35)——藍(lán)牙MAC地址

一愉昆、背景

一個(gè) BLE 設(shè)備,可以使用兩種類(lèi)型的地址(一個(gè) BLE 設(shè)備可同時(shí)具備兩種地址):

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

1.1 公共設(shè)備地址 Public Device Address

在通信系統(tǒng)中图张,設(shè)備地址是用來(lái)唯一識(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)來(lái)說(shuō),其設(shè)備地址是一個(gè) 48bits 的數(shù)字舷夺,稱(chēng)作“48-bit universal LAN MAC address”苦酱。正常情況下,該地址需要向 IEEE 申請(qǐng)给猾,具有唯一性疫萤。

這種地址分配方式在 BLE 中也保留了下來(lái),就是公共設(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è)備地址明顯不夠用了躯砰,有如下原因:

  1. 公共設(shè)備地址需要向 IEEE 購(gòu)買(mǎi)蹲诀,需要一筆開(kāi)銷(xiāo)。
  2. 公共設(shè)備地址的申請(qǐng)與管理相對(duì)繁瑣弃揽、復(fù)雜脯爪,再加上 BLE 設(shè)備的數(shù)量眾多(和傳統(tǒng)藍(lán)牙設(shè)備不是一個(gè)數(shù)量級(jí)的)则北,導(dǎo)致維護(hù)成本增大。
  3. 安全因素痕慢。BLE 很大一部分的應(yīng)用場(chǎng)景是廣播通信尚揣,這意味著只要知道設(shè)備的地址,就可以獲取所有的信息掖举,這是很不安全的快骗。因此固定的設(shè)備地址,加大了信息泄露的風(fēng)險(xiǎn)塔次。

為了解決上述問(wèn)題方篮,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é)為:

  1. 最高兩個(gè) bit 為 “11”。
  2. 剩余的 46bits 是一個(gè)隨機(jī)數(shù)略吨,不能全部為0集币,也不能全部為1。
  3. 在一個(gè)上電周期內(nèi)保持不變翠忠。
  4. 下一次上電的時(shí)候可以改變鞠苟。但不是強(qiáng)制的,因此也可以保持不變秽之。如果改變当娱,上次保存的連接等信息,將不再有效政溃。

靜態(tài)設(shè)備地址的使用場(chǎng)景可總結(jié)為:

  1. 46bits 的隨機(jī)數(shù)趾访,可以很好地解決“設(shè)備地址唯一性”的問(wèn)題,因?yàn)閮蓚€(gè)地址相同的概率很小董虱。
  2. 地址隨機(jī)生成扼鞋,可以解決公共設(shè)備地址申請(qǐng)所帶來(lái)的費(fèi)用和維護(hù)問(wèn)題。

1.2.2 私密設(shè)備地址 Private Device Address

靜態(tài)設(shè)備地址通過(guò)地址隨機(jī)生成的方式愤诱,解決了部分問(wèn)題云头。私密設(shè)備地址則更進(jìn)一步,通過(guò)定時(shí)更新和地址加密兩種方式淫半,提高藍(lán)牙地址的可靠性和安全性溃槐。根據(jù)設(shè)備地址是否加密,又分為兩類(lèi):
① 不可解析私密地址 Non-resolvable Private Address
不可解析私密地址和靜態(tài)設(shè)備地址類(lèi)似科吭,不同之處在于不可解析私密地址會(huì)定時(shí)更新昏滴。更新的周期是由 GAP 規(guī)定的猴鲫,稱(chēng)作 T_GAP(private_addr_int),建議值是 15 分鐘谣殊。其格式如下:

不可解析私密地址的特征可總結(jié)為:

  1. 最高兩個(gè) bit 為 “00”拂共。
  2. 剩余的 46bits 是一個(gè)隨機(jī)數(shù),不能全部為0姻几,也不能全部為1宜狐。
  3. 以 T_GAP(private_addr_int) 為周期,定時(shí)更新蛇捌。

② 可解析私密地址 Resolvable Private Address
可解析私密地址比較有用抚恒,它通過(guò)一個(gè)隨機(jī)數(shù)和一個(gè)稱(chēng)作 identity resolving key(IRK) 的密碼生成,因此只能被擁有相同 IRK 的設(shè)備掃描到络拌,可以防止被未知設(shè)備掃描和追蹤俭驮。其格式如下:

可解析私密地址的特征可總結(jié)為:

  1. 高位 24bits 是隨機(jī)數(shù)部分,其中最高兩個(gè) bit 為“10”盒音,用于標(biāo)識(shí)地址類(lèi)型表鳍;低位 24bits 是隨機(jī)數(shù)和 IRK 經(jīng)過(guò) hash 運(yùn)算得到的 hash值馅而,運(yùn)算公式為 hash = ah(IRK, prand)祥诽。
  2. 當(dāng)主端 BLE 設(shè)備掃描到該類(lèi)型的藍(lán)牙地址后,會(huì)使用保存在本機(jī)的 IRK瓮恭,和該地址中的 prand雄坪,進(jìn)行同樣的 hash 運(yùn)算,并將運(yùn)算結(jié)果和地址中的 hash 字段比較屯蹦,相同的時(shí)候维哈,才進(jìn)行后續(xù)的操作。這個(gè)過(guò)程稱(chēng)作 resolve(解析)登澜,如果不同則繼續(xù)用下一個(gè) IRK 做上面的過(guò)程阔挠,直到找到一個(gè)關(guān)聯(lián) IRK 或者一個(gè)也沒(méi)找到。
  3. 以T_GAP(private_addr_int) 為周期脑蠕,定時(shí)更新购撼。哪怕在廣播、掃描谴仙、已連接等過(guò)程中迂求,也可能改變。
  4. Resolvable Private Address 不能單獨(dú)使用晃跺,因此需要使用該類(lèi)型的地址的話揩局,設(shè)備要同時(shí)具備 Public Device Address 或者 Static Device Address 中的一種。

1.3 分析廣播包中藍(lán)牙MAC地址

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



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



其中 TxAdd 表示發(fā)送方的地址類(lèi)型(0 為 public掀虎,1為 random)凌盯。
RxAdd 表示接收方的地址類(lèi)型付枫。

對(duì)于普通廣播來(lái)說(shuō),只有 TxAdd 的指示是有效的驰怎,表示廣播發(fā)送者的第一類(lèi)型励背。而對(duì)于定向廣播來(lái)說(shuō),TxAdd 和 RxAdd 都是有效的砸西。

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



如果是隨機(jī)設(shè)備地址叶眉,則查看地址的最高兩位。

  • 如果是 “11” 就是靜態(tài)隨機(jī)地址芹枷。
  • 如果是 “00” 就是不可解析私密地址衅疙。
  • 如果是 “01” 就是可解析私密地址,并執(zhí)行上面說(shuō)過(guò)的 ah 方法進(jìn)行解析鸳慈。

二饱溢、API說(shuō)明

以下 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 地址:
uint8_t mac[6] = {0};
esp_read_mac(mac, ESP_MAC_BT);
ESP_LOG_BUFFER_HEX(tag, mac, 6);
  • 設(shè)置 MAC 地址:
    注意:要在初始化藍(lán)牙控制器接口 esp_bt_controller_init() 之前設(shè)置 MAC 地址走芋。esp_base_mac_addr_set() 會(huì)在地址最后一位或上 0x01
uint8_t mac[6] = {0xbc, 0xdd, 0xc2, 0xd1, 0xc5 ,0x6F};
esp_base_mac_addr_set(mac);

查看地址:


四绩郎、使用隨機(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 寫(xiě)于 2021 年 7 月 15 日

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挖函,隨后出現(xiàn)的幾起案子状植,更是在濱河造成了極大的恐慌,老刑警劉巖怨喘,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件津畸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡必怜,警方通過(guò)查閱死者的電腦和手機(jī)肉拓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)梳庆,“玉大人暖途,你說(shuō)我怎么就攤上這事】恳妫” “怎么了丧肴?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)胧后。 經(jīng)常有香客問(wèn)我芋浮,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任纸巷,我火速辦了婚禮镇草,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瘤旨。我一直安慰自己梯啤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布存哲。 她就那樣靜靜地躺著因宇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪祟偷。 梳的紋絲不亂的頭發(fā)上察滑,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音修肠,去河邊找鬼贺辰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嵌施,可吹牛的內(nèi)容都是我干的饲化。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吗伤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吃靠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起牲芋,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤撩笆,失蹤者是張志新(化名)和其女友劉穎捺球,沒(méi)想到半個(gè)月后缸浦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氮兵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年裂逐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泣栈。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卜高,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出南片,到底是詐尸還是另有隱情掺涛,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布疼进,位于F島的核電站薪缆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏伞广。R本人自食惡果不足惜拣帽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一疼电、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧减拭,春花似錦蔽豺、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至可霎,卻和暖如春濒析,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背啥纸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工号杏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斯棒。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓盾致,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親荣暮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子庭惜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容