esp32使iOS 獲取藍牙外設的Mac地址


最近在做一個需要上下位機的項目,我負責的任務下位機,使用的主控芯片是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)"項

esp_ble_adv_data_t結構體中有一項是p_manufacturer_data為"制造商(Manufacture)"項的指針,manufacturer_len"制造商(Manufacture)"項的長度。對這兩項幅值可以就可以在廣播的是將"制造商(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的指針

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM