nordic藍芽位址獲取

2021-10-01 19:48:25 字數 2684 閱讀 5787

官方工程預設都是使用靜態隨機位址,位址的最高兩位必須要是 1 1,原因下面會有解釋

void ble_get_mac(void)

mac[0]=*((uint8_t*)(0x10000000+0xa9))|0x40|0x80;

mac[1]=*((uint8_t*)(0x10000000+0x0a8));

mac[2]=*((uint8_t*)(0x10000000+0x0a7));

mac[3]=*((uint8_t*)(0x10000000+0x0a6));

mac[4]=*((uint8_t*)(0x10000000+0x0a5));

mac[5]=*((uint8_t*)(0x10000000+0x0a4));

}

兩類:

公共位址和隨機位址。

而隨機位址細分又有 靜態隨機位址和隱私位址(private address)

有那麼多型別的位址,那麼如何區分各種位址型別的呢。

廣播通道pdu資料前面有2位元組的頭 格式如下

其中的txadd表示傳送方的位址型別 (0為public,1為random)

rxadd表示接收方的位址型別。

ps:這兩個域並不是一直都有效的。比如對於普通廣播來說,只有txadd的指示是有效的,表示廣播傳送者的第一型別。 而對於定向廣播來說。txadd和rxadd都是有效的,txadd表示廣播傳送者的位址型別,rxadd表示廣播接受者的位址型別。

所以 對於是 public型別位址還是random型別位址,直接通過 廣播通道pdu中的的 資料頭 中的 txadd或者rxadd來判斷就可以了。

但是這裡有個問題,只是區分出了 random位址後,又怎麼知道是靜態隨機位址,還是可解析的隱私位址,或者不可解析的隱私位址呢。

這就要了解 各種位址型別的格式。

public位址的格式比較簡單,高24位是公司標示,低24位公司內部自己賦值。

靜態隨機位址的格式如下圖所示,需要滿足

1:最高2位為1

2:隨機部分不能全0或者全1

另外對於靜態隨機位址,位址的設定是在裝置上電初始化時進行的,一旦設定後本次執行過程中 自己的靜態隨機位址都不能再改變,除非重新上電。

1:最高2位為0

2:隨機部分不能為全1或全0

1:最高位0次高位為1

2:隨機部分不能為全0或全1

可解析的隨機位址的生成需要使用到 irk, 位址由兩部分組成,

hansh和prand(包含最高固定2位和22位隨機部分)。

其中 hash = ah(irk, prand) ah就是產生隨機位址的函式。

既然是可解析位址,那麼如何解析呢? 解析的過程也是一樣的。接收方可能存在多個irk,接收方收到乙個位址型別是 隨機位址,並且最高2位是01那麼,接收方就會 用他有的irk對接收到的位址的高24位做ah(irk, prand)運算,得到localhash,然後將localhash和接收到位址的低24位的hash對比,如果相同則認為這個位址 和 該irk是相關連的。

如果不同則繼續 用下乙個irk做上面的過程,知道找到乙個關聯的irk或者乙個沒找到。

如果是11就是靜態隨機位址,位址型別確定

如果是00表示為不可解析隱私位址,型別確定

最後 介紹一下 51822中怎麼設定各種型別的位址。

uint32_t sd_ble_gap_address_set (uint8_t addr_cycle_mode, const ble_gap_addr_t * p_addr )

addr_cycle_mode 引數為:ble_gap_addr_cycle_mode_auto:

該模式下,會忽略第二個位址引數p_addr 中給的位址addr。協議棧內部會自動週期性根據 p_addr中addr_type指定的位址型別來 生成可解析的或者不可解析的位址。

addr_cycle_mode 引數為:ble_gap_addr_cycle_mode_none:

該模式下,可以使用public位址和自己設定的 static random位址。

如果第二個引數p_addr中的addr_type為staic random型別,則addr中存放的位址的最高2位必須為1,不然這個位址會被認為無效並自動替換,51822會自動替換為藍芽mac位址。(跟沒有呼叫sd_ble_gap_address_set函式的效果是一樣的,看教程最上面的說明)

static random address 只有在每次 重新上電後才可改變。

可解析和不可解析的位址可在正常執行過程中週期性改變

其他使用該函式需要注意的地方看 sdk中該函式的說明就行了

nordic 藍芽協議棧

藍芽協議的實現叫做藍芽協議棧 藍芽協議棧有以下內容組成 應用層主協議層 控制層 物理層,主要負責指定ble的無線頻段,調製解調方式和方法等。直接決定了ble晶元的功耗靈敏度。鏈路層 協議棧核心 主要負責選擇射頻通道,如何識別空中資料報,傳送資料的時間控制,資料完整性的保證,ack應答實現,重傳機制實...

android 藍芽 獲取藍芽位址名字

bluetoothadapter 本地藍芽介面卡 首先需要新增藍芽許可權 uses permissionandroid name android.permission.bluetooth uses permissionandroid name android.permission.bluetooth...

ios 獲取藍芽mac位址

主要思路 雖然蘋果官方的api沒有獲取mac位址的方法,但是當我翻看藍芽的文件的時候,我發現藍芽有提供乙個裝置資訊的service service uuid 0x180a 裡面提供了兩個characteristic 獲取晶元的mac位址 0x2a23 和獲取軟體的版本號 0x2a26 如下圖所示 實...