最近在做一個需要上下位機的項目,我負責的任務下位機,使用的主控芯片是esp32。這個項目中有一項是需要手機掃描二維碼然后連接作為esp32的藍牙。二維碼中包含了mac地址信息,在手機掃描周圍設備的時候通過mac地址篩選出目標設備,然后建立連接。在安卓系統上進展順利,但是在ios上的時候,這個過程遇到的問題,ios中無法直接獲取藍牙的mac地址。寫上位機的負責人發給了我一個鏈接https://www.jianshu.com/p/1d6a8fc8134f。這個解決方案雖然不是esp32的,但是了解了原理之后還是可以在esp32上實現。
主要原理是在ble廣播自己的時候會有一個廣播內容中包含很多項,其中有一想就是該產品的制造商(Manufacture)信息,而ios是可以獲取這一項內容的。所以,我們可以把mac地址填入這一項,然后ios就可以通過讀取制造商信息順利的識別不同設備了。具體的步驟如下:
1、獲取mac地址
2、將mac地址填入"制造商(Manufacture)"項中
一、關於獲取mac地址
這里我暫時沒有找到獲取藍牙mac地址的方法,但是因為暴露mac地址的目的是為了區分設備,所以只要選擇一個不重復的mac地址就好了。這里,選擇使用了設備的mac地址。eFuse模塊中存在設備的mac地址,具體可以參考https://docs.espressif.com/projects/esp-idf/zh_CN/latest/api-reference/system/efuse.html。相關的例程可以參考esp-idf/examples/system/base_mac_address。
結論:
esp_err_t esp_efuse_mac_get_default(uint8_t* mac);函數可以獲取設備的mac地址,其中mac地址是6位。
二 、mac地址填入"制造商(Manufacture)"項
static uint8_t mac_addr[6] = {0};//定義Mac地址存儲空間
esp_efuse_mac_get_default(mac_addr);//獲取mac地址
static esp_ble_adv_data_t adv_data;//定義廣播用的結構體
adv_data.manufacturer_len = 6; //填入Manufacture的長度
adv_data.p_manufacturer_data = mac_addr; //填入Manufacture的指針